数据结构-双向链表
2017-11-17 14:48
369 查看
双向链表的构造
所谓的双向链表是指链表的每一个结点中除了数据域外设置两个指针域,其中之一指向结点的直接后继结点,另外一个指针指向结点的直接前驱结点。
链表的实际结构可以如下描述:
双向链表的几种形式
类型定义
typedef struct node {
ElemType data;
struct node *rlink,*llink;
}DNode,*DLinkList;
二、双向链表的插入
功能 在带有头结点的非空双向循环链表中第一个数据域的内容为x的链结点右边插入一个数据信息为item的新结点
需要做的工作
1.找到满足条件的结点
2.若找到,构造一个新的链结点
3.将新的结点插入到满足条件的结点后面
int INSERTD(DLinkList list, ElemType x, ElemType item)
{
int DLinkList p,q;
q = list->rlink;
while(q!=list && q->data!=x)
q = q->rlink;
if(q == list)
retrun -1;
p = (DLinkList)malloc(sizeof(DNode));
p->data = item;
p->llink = q;
p->rlink = q->rlink;
q->rlink->llink = p;
q->rlink = p;
return 1;
}
三、双向链表的删除
功能 删除带有头结点的非空双向循环链表中的第一个数据域的内容为x的链结点
需要做的工作
1.找到满足条件的额结点
2.若找到,删除(并释放)满足条件的结点
算法
int DELETED(DLinkList list, ElemType x)
{
DLinkList p,q;
q = list->rlink;
while(q!=list && q->data!=x)
q = q->rlink;
if(q == list)
return -1;
q->llink->rlink = q->rlink;
q->rlink->llink = q->llink;
free(q);
return 1;
}
构造一个带头结点的双向循环链表
算法
void INITALDLINK(int n)
{
int i;
DLinkList = list,p;
list = (DLinkList)malloc(sizeof(DNode));
list->llink = list;
list->rlink = list;
for(i = 0;i < n;i++) {
p = (DLinkList)malloc(sizeof(DNode));
READ(p->data);
INSERTNODE(list, p);
}
return list;
}
void INSERTNODE(DLinkList list,DLinkList p)
{
list->llink->rlink = p;
p->llink = list->link;
p->rlink = list;
list->llink = p;
}
所谓的双向链表是指链表的每一个结点中除了数据域外设置两个指针域,其中之一指向结点的直接后继结点,另外一个指针指向结点的直接前驱结点。
链表的实际结构可以如下描述:
双向链表的几种形式
类型定义
typedef struct node {
ElemType data;
struct node *rlink,*llink;
}DNode,*DLinkList;
二、双向链表的插入
功能 在带有头结点的非空双向循环链表中第一个数据域的内容为x的链结点右边插入一个数据信息为item的新结点
需要做的工作
1.找到满足条件的结点
2.若找到,构造一个新的链结点
3.将新的结点插入到满足条件的结点后面
int INSERTD(DLinkList list, ElemType x, ElemType item)
{
int DLinkList p,q;
q = list->rlink;
while(q!=list && q->data!=x)
q = q->rlink;
if(q == list)
retrun -1;
p = (DLinkList)malloc(sizeof(DNode));
p->data = item;
p->llink = q;
p->rlink = q->rlink;
q->rlink->llink = p;
q->rlink = p;
return 1;
}
三、双向链表的删除
功能 删除带有头结点的非空双向循环链表中的第一个数据域的内容为x的链结点
需要做的工作
1.找到满足条件的额结点
2.若找到,删除(并释放)满足条件的结点
算法
int DELETED(DLinkList list, ElemType x)
{
DLinkList p,q;
q = list->rlink;
while(q!=list && q->data!=x)
q = q->rlink;
if(q == list)
return -1;
q->llink->rlink = q->rlink;
q->rlink->llink = q->llink;
free(q);
return 1;
}
构造一个带头结点的双向循环链表
算法
void INITALDLINK(int n)
{
int i;
DLinkList = list,p;
list = (DLinkList)malloc(sizeof(DNode));
list->llink = list;
list->rlink = list;
for(i = 0;i < n;i++) {
p = (DLinkList)malloc(sizeof(DNode));
READ(p->data);
INSERTNODE(list, p);
}
return list;
}
void INSERTNODE(DLinkList list,DLinkList p)
{
list->llink->rlink = p;
p->llink = list->link;
p->rlink = list;
list->llink = p;
}
相关文章推荐
- Redis源码学习3-基本数据结构之双向链表
- 数据结构 04 链表 双向链表
- 【Redis源码剖析】 - Redis内置数据结构之双向链表list
- 数据结构(C#)--双向链表
- 《Delphi 算法与数据结构》学习与感悟[10]: 双向链表
- [java数据结构]--java双向链表LinkedList的简单实现
- java数据结构之实现双向链表的示例
- 数据结构--双向带哨兵的循环链表
- 数据结构(四)——循环链表与双向链表
- php数据结构之双向链表(SplDoublyLinkedList)
- 线性表16:双向链表 - 数据结构和算法21
- 数据结构-双向链表插入
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]
- 数据结构-有头双向循环链表
- 数据结构 P36-37 算法实现 双向循环链表的插入与删除
- C 工具库 GLib --- 提供多种高级的数据结构,如内存块、双向和单向链表、哈希表、动态字符串等
- 微软等数据结构+算法面试100题(43)-- 把二元查找树转变成排序的双向链表
- 数据结构-双向链表(学习笔记)
- 数据结构--双向循环链表--插入
- 数据结构练习(01)把二元查找树转变成排序的双向链表