网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月09日漏签0天
c语言吧 关注:798,830贴子:4,356,126
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 2回复贴,共1页
<<返回c语言吧
>0< 加载中...

双向链表图解(前插操作,删除操作)

  • 只看楼主
  • 收藏

  • 回复
  • 凌云
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
双向链表
循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指向其前驱的指针域prior。这样形成的链表中就有两条方向不同的链,我们可称之为双(向)链表(Double Linked List)。双链表的结构定义如下:
typedef struct DNode{ ElemType data; struct DNode *prior,*next;}DNode,*DoubleList;
双链表的结点结构如图2.14所示。

与单链表类似,双链表一般也是有头指针唯一确定的,增加头结点也能使双链表的某些运算变得方便。同时双向链表也可以有循环表,称为双向循环链表,其结构如图2.15所示。

由于在双向链表中既有前向链又有后向链,寻找任一个结点的直接前驱结点与直接后继结点变得非常方便。设指针p指向双链表中某一结点,则有下式成立:
P->prior->next=p=p->next->prior
在双向链表中,那些只涉及后继指针的算法,如求表长度、取元素、元素定位等,与单链表中相应的算法相同,但对于前插和删除操作则涉及到前驱和后继两个方向的指针变化,因此与单链表中的算法不同。
1.双向链表的前插操作
算法描述:欲在双向链表第i个结点之前插入一个新的结点,则指针的变化情况如图2.16所示。

int DlinkIns(DoubleList L,int i,ElemType e){ DNode *s,*p; …/*先检查待插入的位置i是否合法(实现方法同单链表的前插操作)*/ …/*若位置i合法,则让指针p指向它*/ s=(DNode *)malloc(sizeof(DNode)); if(s) { s->data=e; s->prior=p->prior;p->prior->next=s; s->next=p;p->prior=s; return TRUE; } else teturn fALSE;}算法 双向链表的插入操作
2.双向链表的删除操作
算法描述:欲删除双向链表中的第i个结点,则指针的变化情况如图2.17所示。

int DlinkDel(DoubleList L,int i,ElemType *e)
{
DNode *p;
…/*首先检查待插入的位置i是否合法(实现方法同单链表的删除操作)*/
…/*若位置i合法,则让指针p指向它*/
*e=p->prior->next=p->next;
p->next->prior->p=p->prior;
free(p);
return TRUE;
}


  • 凌云
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
留着给小白看的 ,看到顶下 别沉了


2025-06-09 17:17:48
广告
  • fany12345678
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这一类知识点在c语言还是很难的,涉及结构体指针,我在c语言上都没看到具体说明。在数据结构上看到过。楼主应该给个具体的例题,不然我们这种小白很难看懂啊。就像高数书的定义一样。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 2回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示