2007.08.22双向链表(前插操作,删除操作)
来源:互联网 发布:网络智能家居公司 编辑:程序博客网 时间:2024/05/20 16:12
双向链表
循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是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; } 算法 双向链表的删除操作
- 双向链表(前插操作,删除操作)
- 双向链表图解(前插操作,删除操作)
- 2007.08.22双向链表(前插操作,删除操作)
- [数据结构]双向链表的前插操作
- 2016年12月23日学习总结----双向循环链表操作程序(头插、尾插、中间插入、删除)
- 双向循环链表的头插尾插中间插基本操作
- 双向链表插入、删除操作
- 双向链表插入、删除操作
- 双向链表插入、删除操作
- 双向链表基本操作:删除、插入、双向输出
- 双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
- 带表头节点的循环双向链表(头插,尾插,中间插,清除,前向显示,后向显示)
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向循环链表的创建,插入,删除操作
- 我会尽快回来的
- hibernate可复用组件的hbm文件路径配置
- 今天2007年八月28日写的读取文本文件中的列名和数据进sql server数据库
- SD--Message Control Configure
- J2ME优秀网站
- 2007.08.22双向链表(前插操作,删除操作)
- NUnit2.0详细使用方法
- 关于VBS调用MSWinsock控件(转)
- Unable to start runtime due to incomplete configration
- 在Eclipse中使用org.vssplugin_1.6.1(使用插件形式)
- C#入门例子
- 经典推理题目:海盗分金问题
- 什么是JSON
- 招聘: .NET软件开发工程师 网页设计师