数据结构(二) 线性表-2
1.顺序存储结构不足的解决办法
线性表的顺序存储结构就是插入和删除时,需要移动大量元素
问题的根源在于:相邻的两个数据元素的存储位置具有邻居关系
插入操作,为了保持原有的数据元素的相邻关系,插入位置之后的数据元素以此往后移动。
删除操作,所删元素留下的空隙自然需要你补,数据元素要往前移动。
解决办法:采用链式存储结构
2.链式存储结构定义
2.1 几个重要概念
链式存储结构的特点:用一组任意存储单元存储线性表的数据元素
链式存储结构定义:每个元素包含一个数据域和一个指针域。指针域指向其直接后继元素。
结点:一个数据域,一个指针域,指针域指向另一个节点
链表:N个节点构成
单链表:线性表由由节点构成并且,每个节点只包含一个指针域
头指针:表的第一个节点的存储位置
头节点:单链表第一个节点前附设一个节点,为头节点,头节点可以不存储任何信息,也可以存储如线性表的长度等附加信息,头节点的指针域存储第一个节点的指针
2.2 头指针和头节点
这两个概念容易混淆。需要加以区分
头指针:
- 头指针是 链表指向第一个节点的指针,若链表由头节点,则为指向头节点的指针
- 头指针具有标识作用,常用头指针冠以链表的名字
- 无论链表是否为空,头指针均不为空,头指针是链表的必要元素
头节点
- 头节点是为了操作的统一和方便设立的,放在第一个元素之前,其数据域一般无意义(也可存放链表长度)
- 有了头节点,对第一元素节点前的插入和删除第一个节点,其操作和其他节点统一
- 头节点不一定是链表的必要元素
2.3 单链表的存储结构定义
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ typedef struct Node { ElemType data; struct Node *next; }Node; typedef struct Node *LinkList;