双向链表图解(前插操作,删除操作)
来源:互联网 发布:软件架构师真题 编辑:程序博客网 时间:2024/06/02 10:48
双向链表
循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是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++实现)
- 带表头节点的循环双向链表(头插,尾插,中间插,清除,前向显示,后向显示)
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向循环链表的创建,插入,删除操作
- Apple 发起‘Google 20%工作时间‘活动,允许部分员工花两周时间做些特别的项目
- 今天所做的两件事(关于10gR2 ocr恢复和dg standby_file_management参数)
- codeforeces 239B
- 关于印发《全国测绘地理信息行政执法依据》和《全国测绘地理信息行政执法职权分解》的通知
- 黑马程序员_Socket通信
- 双向链表图解(前插操作,删除操作)
- 字符串的排列
- html表单
- MYSQL--事务处理
- 搜索技巧
- 情人节 3D动态玫瑰 js实现
- 提取文本中url的正则表达式
- 位操作+递归 (十进制转为二进制)
- Android_HTML解析器_jsoup