1.4 双向链表、循环链表、双向循环链表、静态链表

1.双向链表
typedef sruct SuLNode{
ElemType data;          //数据域
struct DuLNode *prior;  //指向前驱的指针域
struct DuLNode *next;   //指向后继的指针域
}DuLNode, *DuLinkList;


插入操作:设在结点p = &a[i - 1]), 把作为新结点的 s 插到a[i - 1] 与 ai之间:
s -> next = p -> next;
p -> next = s;
s -> next -> prior = s;
s -> prior = p;
删除操作:设在结点p = &a[i - 1]), 删除a[i - 1] 与 a[i + 1] 之间的 a[i]
p -> next = p -> next -> next;
p -> next -> prior = p;


2.循环链表
最后一个结点的指针域的指针又指回第一个结点的链表。
和单链表的差别在于,判别链表中最后一个结点的条件不再是"后继是否为空",
而是"后继是否为头结点"。


*对于单链表只能从头结点开始遍历整个链表,而对于单循环链表则可以从
表中任意结点开始遍历整个链表。
*不仅如此,有时对链表常做的操作是在表尾,表头进行,此时可以改变一
下链表的标识方法,不再用头指针而用一个指向尾结点的指针R来标识,可
以使操作效率得以提高。


3.双向循环链表
特点:
"查询"和单链表相同;
"插入"和"删除"时需要同时修改两个方向上的指针。

4.静态链表
借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,与前面
所述的链表中的指针不同的是,这里的指针是结点的相对地址(数组的下标),称之
为静态链表。
特点:
1.所有数据元素均存储在一个连续的空间段,但是相邻的两个元素不一定处于相邻
的空间段;
2.修改指针域即可完成插入和删除操作,不需要移动数据元素,但是也不能随机访
问静态链表中的元素;
3.一次性分配所有的存储空间,插入、删除时无需再向操作系统申请或释放空间,
但也限制了最大表长。
线性表的静态单链表存储结构:
#define MAXSIZE 10000
typedef struct{
ElemType data;
int next;
}component, SLinkList[MAXSIZE];
静态链表适用于不支持"指针"的高级语言,或者最大元素固定但插入、删除操作频繁的链表应
用中。有关基于静态链表上的线性表的操作与动态链表相同,除了一些描述方法有些区别外,
算法思路相同的。

猜你喜欢

转载自blog.csdn.net/L158943041/article/details/80548708