线性表的顺序存储结构要求逻辑关系上相邻的元素在物理位置上也相邻,这样方便了随机存取,但是在插入和删除元素时,需要移动大量元素,而线性表的链式存储则不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构的可随机存取的优点,不过在插入和删除元素时比较方便。
单链表
单链表可由头指针唯一确定,在C语言中可用“结构指针”来描述:
1: typedef struct Node {
2: ElemType data;
3: struct Node *next;
4: }Node, *LinkList;
有时,我们会在单链表的第一个结点之前附设一个结点,称之为头结点。头结点的数据域可以不存储任何信息,也可以存储如链表的长度等一些附加信息。头结点的指针域指向第一个结点,如果线性表为空,则头结点的指针域为NULL。
循环链表
表中最后一个结点的指针域指向第一个结点,整个链表形成一个环。
循环链表的操作与单链表基本一致,差别在于算法中的循环条件不是p或者p->next是否为空, 而是他们是否等于头指针。
有时候,在循环链表中设立尾指针而不设头指针,可以使某些操作简化。
双向链表
在双向链表的结点中有两个指针域, 其一指向直接后继,另一指向直接前驱,在C语言中可描述如下:
1: typedef struct Node {
2: ElemType data;
3: struct Node *next, *prev;
4: }Node, *LinkList;
和单链表的循环链表类似,双向链表也可以有循环链表。