/******************************************循环链表**********************************************
将单链表中终端节点的指针端由空改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表成为单循环链表,简称循环链表
单链表解决了,从当中某个结点出发,便可访问链表的全部结点的问题。
单链表和循环链表在循环判断上的区别:
单链表 while(p->next) //p->next是否为空
循环链表 while(p->next != head) //p-next是否为头结点
************************************************************************************************/
/******************************************双向链表**********************************************
双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
单链表和循环链表在循环判断上的区别:
单链表 while(p->next) //p->next是否为空
循环链表 while(p->next != head) //p-next是否为头结点
************************************************************************************************/
// 线性表的双向链表的存储结构
typedef struct
{
ElemType data;
struct DulNode * prior; //直接前驱指针
struct DulNode * next; //直接后继指针
}DulNode, *DuLinkList;
// 对于链表中的某个结点,其后继的前驱和其前驱的后继均为他自己
p->next->prior = p = p->prior = p->next
// 插入方法 (需要注意其顺序)
// 假设存储元素e的结点为s, 其实先要将s插入到结点p 和 p->next之间
s->prior = p; //p赋值给s的前驱
s->next = p->next; //把p->next赋值给s
p->next->prior = s; //把s赋值给p->next的前驱
p->next = s; //把s赋值给p的后继
// 删除方法 删除p结点
p->prior->next = p->next; //把p->next赋值给p->prior的后继
p->next->prior = p->prior; //把p->prior赋值给p->next的前驱
free(p); //释放结点
线性表->循环链表, 双向链表
最新推荐文章于 2024-08-18 10:12:48 发布