数据结构-双向链表

双向链表的构造

所谓的双向链表是指链表的每一个结点中除了数据域外设置两个指针域,其中之一指向结点的直接后继结点,另外一个指针指向结点的直接前驱结点。

链表的实际结构可以如下描述:

Pasted Graphic 1.tiff

双向链表的几种形式

Pasted Graphic 2.tiff

类型定义

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;

}


构造一个带头结点的双向循环链表


Pasted Graphic 3.tiff

算法 

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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值