双向链表的构造
所谓的双向链表是指链表的每一个结点中除了数据域外设置两个指针域,其中之一指向结点的直接后继结点,另外一个指针指向结点的直接前驱结点。
链表的实际结构可以如下描述:
双向链表的几种形式
类型定义
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;
}