#include <stdio.h>
#include <stdlib.h>
typedef struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinklist;
int main(){
bool InitDLinkList(DLinklist &L);
bool InsertNextDNode(DNode *p,DNode *s);
bool DeleteNextDNode(DNode *p);
void DestoryList(DLinklist &L);
//初始化双链表
DLinklist L;
InitDLinkList(L);
int i;
DNode *s,*r=L;
for(i=1;i<=10;i++){
s=(DNode *)malloc(sizeof(DNode)); //分配一个结点
s->data=i;
InsertNextDNode(r,s);
r=r->next;
}
DNode *point=L;
while(point->next!=NULL){
point =point->next;
printf("%d\n",point->data);
}
//删除第i个结点的后继结点
point=L;
for(int j=1;j<=4;j++){
point=point->next;
}
DeleteNextDNode(point);
printf("-------------------\n");
point=L;
while(point->next!=NULL){
point =point->next;
printf("%d\n",point->data);
}
//删除整张表
DestoryList(L);
return 0;
}
//删除整条链表
void DestoryList(DLinklist &L){
bool DeleteNextDNode(DNode *p);
//循环释放各个数据结点
DNode *q=L;
while(q->next!=NULL){
q=q->next;
DeleteNextDNode(q);
}
free(L);
L=NULL;
}
//删除p结点的后继结点
bool DeleteNextDNode(DNode *p){
if(p==NULL){
return false;
}
DNode *q =p->next; //找到p的后继结点q
if(q==NULL){ //p没有后继
return false;
}
p->next =q->next;
if(q->next!=NULL){ //q结点不是最后一个结点
q->next->prior=p;
}
free(q);
return true;
}
//在p结点之后插入s结点
bool InsertNextDNode(DNode *p,DNode *s){
if(p==NULL || s==NULL){ //非法参数
return false;
}
s->next =p->next;
if(p->next!=NULL){ //如果p结点有后继结点
p->next->prior=s;
}
p->next=s;
s->prior=p;
return true;
}
bool InitDLinkList(DLinklist &L){
L=(DNode *)malloc(sizeof(DNode)); //分配一个头结点
if(L==NULL){ //内存不足,分配失败
return false;
}
L->prior =NULL; //头结点的 prior永远指向NULL
L->next =NULL; //头结点之后暂时还没有结点
return true;
}