双向链表结点的定义如下:
typedef struct DLnode
{
DataType data;
struct DLnode *prior,*next;
}DLNode,*DLinkList;
在双向链表中,若p为指向表中某一结点的指针,则显然有:
p->next->prior=p->prior->next=p;
在双向链表中,对于只需要设计一个方向的指针操作,如Get_DLinkList,Location_DLinkList等,算法操作与单链表相同,但在插入,删除时有很大不同,这时 需要改变两个方向上的指针。
下面展示了在p指向的结点之后插入新节点s的操作,执行语句如下:
s->next=p-next;
p->next->prior=s;
s->prior=p;
p->next=s;
下面展示在p指向的节点之后删除其后继结点的操作:
DLinkList q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
双向循环链表的插入运算和删除运算如下:
void Insert_DLinkList(DLinkList L,int i,DataType x)
{
DLNode *p,*s;
p=Get_DLinkList(L,i-1);
if(p==L)
{
printf("插入位置不合法");
exit(1);
}
else
{
s=(DLinkList)malloc(sizeof(DLNode));
s->data=x;
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next;
}
}
void Delete_DLinkList(DLinkList L,int i)
{
DLNode *p,*q;
p=Get_DLinkList(L,i-1);
if(p==NULL)
{
printf("删除位置不合法");
//第i个结点的前驱结点不存在,不能执行删除操作
exit(1);
}
else
{
if(p->next==L){
printf("删除位置不合法");
// 第i个结点不存在,不能执行删除操作
exit(1);
}
else{
p->next=q->next;
q->next->prior=p;
free(q);
}
}
}