#include<stdio.h>
#include<stdlib.h>
typedef struct DNode
{
int data;
struct DNode *prior,*next;
}DLinkList;
//基本的函数:
//建立一个只含头结点的空链表
void InitLinkList(DLinkList *&L);
//将数据x插入到链表L的尾部
void ListInsertTail(DLinkList *&L,int x);
//将数据x插入到链表的第i个位置
void ListInsert(DLinkList *&L,int x,int i);
//计算双链表的长度
int ListLength(DLinkList *L);
//删除链表的第i个元素
void ListDelete(DLinkList *&L,int i);
//输出双链表
void DispList(DLinkList *L);
//销毁链表L
void DestroyList(DLinkList *L);
//建立一个只含头结点的空链表
void InitLinkList(DLinkList *&L)
{
L=(DLinkList *)malloc(sizeof(DLinkList));
L->data=0;
L->prior=L->next=NULL;
}
//将数据x插入到链表L的尾部
void ListInsertTail(DLinkList *&L,int x)
{
DLinkList *p=NULL,*q=NULL;
p=q=(DLinkList *)malloc(sizeof(DLinkList));
p=L;
while(p->next!=NULL)
{
p=p->next;
}
q->data=x;
q->prior=p;
q->next=NULL;
p->next=q;
}
//将数据x插入到链表的第i个位置
void ListInsert(DLinkList *&L,int x,int i)
{
int j=0;
DLinkList *p=NULL,*q=NULL;
p=q=(DLinkList *)malloc(sizeof(DLinkList));
p=L;
if(i<1||i>ListLength(L)+1)
{
printf("插入不成功!选择插入数据的位置有误...\n");
return ;
}
while(j!=i-1)
{
p=p->next;
j++;
}
q->data=x;
q->next=p->next;
q->prior=p;
p->next=q;
}
//计算双链表的长度
int ListLength(DLinkList *L)
{
int length=0;
while(L->next!=NULL)
{
length++;
L=L->next;
}
return length;
}
//删除链表的第i个元素
void ListDelete(DLinkList *&L,int i)
{
int j=0;
DLinkList *p=NULL,*q=NULL;
p=q=(DLinkList *)malloc(sizeof(DLinkList));
p=L;
if(i<1||i>ListLength(L))
{
printf("删除不成功!输入有误...\n");
return ;
}
while(j!=i-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
if(q->next!=NULL)
q->next->prior=q->prior;
free(q);
}
//输出双链表
void DispList(DLinkList *L)
{
L=L->next;
while(L!=NULL)
{
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
//销毁链表L
void DestroyList(DLinkList *L)
{
DLinkList *p=NULL;
p=(DLinkList *)malloc(sizeof(DLinkList));
while(L->next!=NULL)
{
p=L;
L=L->next;
L->prior=NULL;
free(p);
}
free(L);
}
void main(void)
{
int x,y;
DLinkList *DL=NULL;
//新建一个只包含头结点的空链表
InitLinkList(DL);
//插入数据到链表
printf("请输入一串整数,以 0 结束:\n");
scanf("%d",&x);
while(x!=0)
{
ListInsertTail(DL,x);
scanf("%d",&x);
}
//输出双链表
printf("双链表为:"); DispList(DL);
//双链表的长度
printf("链表的长度为:%d\n",ListLength(DL));
//删除某个结点
printf("请选择删除某个结点:");
scanf("%d",&x);
ListDelete(DL,x);
printf("删除第%d个结点后的链表为:",x); DispList(DL);
//在链表的第i个位置插入数据x
printf("请选择插入的数据x和位置i:\n");
scanf("%d%d",&x,&y);
ListInsert(DL,x,y);
printf("在第%d个位置插入数据%d之后的链表为:",y,x); DispList(DL);
//销毁链表
DestroyList(DL);
}