线性表->循环链表, 双向链表

本文详细介绍了循环链表的概念及实现方式,并对比了单链表与循环链表的区别。此外,还深入探讨了双向链表的数据结构及其插入与删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/******************************************循环链表**********************************************
将单链表中终端节点的指针端由空改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表成为单循环链表,简称循环链表
单链表解决了,从当中某个结点出发,便可访问链表的全部结点的问题。

单链表和循环链表在循环判断上的区别:
单链表     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);                    //释放结点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值