/*双链表*/
#include<stdio.h>
#include<stdlib.h>
typedef struct DNode
{
int data;
struct DNode *prior,*next;
}DNode,*DLinkList;
bool InitDLinkList(DLinkList &L); //初始化单链表
bool Empty(DLinkList L); //判断是否为空
DLinkList List_TailInsert (DLinkList &L); //利用尾插法建立双链表
bool InsertNextDNode(DLinkList &L); //双链表的插入在p结点之后插入s结点
bool DeleteNextNode(DLinkList &L); //删除指定节点p的后继结点
void travelDLinkList(DLinkList L); //遍历双链表
void DestoryList(DLinkList &L); //销毁双链表
/*初始化*/
bool InitDLinkList(DLinkList &L)
{
L=(DNode*)malloc(sizeof(DNode)); //分配头结点
if(L==NULL)
{
return false;
}
L->prior=NULL;
L->next=NULL;
return true;
}
/*判断链表是否为空*/
bool Empty(DLinkList L)
{
if(L->next==NULL)
return true;
else
return false;
}
//利用尾插法建立双链表
DLinkList List_TailInsert (DLinkList &L)
{
int x;
L=(DLinkList)malloc(sizeof(DNode));
DNode *s,*r=L;
printf("请输入链表中数据,请以9999作为结束标志:");
scanf("%d",&x);
while(x!=9999)
{
s=(DNode*)malloc(sizeof(DNode));
s->data=x;
r->next=s;
s->prior=r;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//双链表的插入在p结点之后插入s结点
bool InsertNextDNode(DLinkList &L)
{
int i;
int j=0;
DNode *p=L;
DNode *s=(DNode*)malloc(sizeof(DNode));
printf("请输入您要后插的位序(从0开始):");
scanf("%d",&i);
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
printf("请输入要插入的数据:");
scanf("%d",&s->data);
if(p==NULL||s==NULL)
{
return false;
}
s->next=p->next;
if(p->next!=NULL) //如果p有后继结点
{
p->next->prior=s;
}
s->prior=p;
p->next=s;
return true;
}
/*删除指定节点p的后继结点*/
bool DeleteNextNode(DLinkList &L)
{
int j=0;
int i;
DNode *p=L;
DNode *s=(DNode*)malloc(sizeof(DNode));
printf("请输入您要删除的结点的位序(从0开始,将会删除该节点的后继结点):");
scanf("%d",&i);
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
if(p==NULL)
{
return false;
}
DNode *q=p->next;
if(q==NULL)
{
return false;
}
p->next=q->next;
if(q->next!=NULL)
{
q->next->prior=p;
}
free(q);
return true;
}
/*双链表的遍历*/
void travelDLinkList(DLinkList L)
{
DNode* p =L;
while(p->next) //后向遍历 while(p!=NULL) //前向遍历
{ // {
// p=p->prior;
printf("%d ",p->next->data); // }
p=p->next;
}
printf("\n");
}
/*销毁双链表*/
void DestoryList(DLinkList &L)
{
//循环释放各个数据结点
while(L->next !=NULL)
{
DeleteNextNode(L);
}
free(L);
L=NULL;
return;
}
int main(void)
{
DLinkList L;
if(InitDLinkList(L))
{
printf("初始化成功!\n");
}
else
{
printf("初始化失败!\n");
}
if(Empty(L))
{
printf("此链表为空\n");
}
else
{
printf("此链表不为空\n");
}
List_TailInsert (L);
travelDLinkList(L);
InsertNextDNode(L);
travelDLinkList(L);
DeleteNextNode(L);
travelDLinkList(L);
return 0;
}