#include <stdio.h>
#include <malloc.h>
typedef struct DuLnode {
int data;
struct DuLnode *prior;
struct DuLnode *next;
}DuLnode,*DuLinkList;//定义双向链表
void Create_DuLinkList(DuLinkList &L)
{
L=(DuLinkList)malloc (sizeof(DuLnode));
int j=0;
DuLinkList q;
q=L;
L->prior=NULL;
L->next=NULL;
printf("请输入链表中的5个元素:");
for(int i=1;i<=5;i++)
{
DuLinkList p=(DuLinkList)malloc (sizeof(DuLinkList));
p->next=NULL;
p->prior=q;
q->next=p;
scanf("%d",&p->data);
q=q->next;
j++;
}
}//初始化双向链表
void Print_DuLinkList(DuLinkList L)
{
DuLinkList p=L->next;
printf("输出双向链表:");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}//输出双向链表
void Clear_DuLinkList(DuLinkList L)
{
L->next=NULL;
}//将双向链表置空
void Empty_DuLinkList(DuLinkList L)
{
if(L->next) printf("双向链表非空/n");
else printf("双向链表空/n");
}//判断双向链表是不是空表
int Length_DuLinkList(DuLinkList L)
{
DuLinkList p=L;
int j=0;
while (p->next)
{
p=p->next;
j++;
}
return j;
}//求双向链表的长度
void GetElem_DuLinkList(DuLinkList L,int i,int &e)
{
DuLinkList p=L->next;
int j=1;//计数器
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i) printf("error/n");//第i个元素不存在
e=p->data;//取第i个元素
}//取双向链表中第i个元素
void Delete_DuLinkList(DuLinkList &L,int i,int &e)
{
DuLinkList p=L->next;
int j=1;//计数器
while (p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1) printf("error1/n");
DuLinkList q=p->next;
p->next=q->next;
q->next->prior=p;
e=q->data;//存储删除的元素
free(q);//释放删除的空间
}//删除双向链表中第i个元素
void Insert_DuLinkList(DuLinkList &L,int i,int e)
{
DuLinkList p=L->next;
int j=1;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j<i-1) printf("error2/n");
DuLinkList s=(DuLinkList)malloc(sizeof(DuLnode));
s->data=e;
s->next =p->next ;
p->next->prior =s;
s->prior=p;
p->next=s;
}//在双向链表的第i个元素前插入e
int Locate_DuLinkList(DuLinkList L,int e)
{
DuLinkList p=L->next;
int j=1;
while(p->data!=e&&p->next)
{
p=p->next;
j++;
}
if(!p)
{
printf("无当前元素/n");
return 0;
}
if(p->data=e) return j;
else
{
printf("无当前元素/n");
return 0;
}
}//找到元素e的位置
main()
{
int a;//表长
int b;//所取元素
int c;//删除元素
int d;//元素6的位置
DuLinkList La;//创建双向链表
Create_DuLinkList(La);//初始化双向链表
Empty_DuLinkList(La);//判断双向链表是不是为空
a=Length_DuLinkList(La);//求双向链表的长度
GetElem_DuLinkList(La,3,b);//取双向链表中的第3个元素
Delete_DuLinkList(La,3,c);//删除第3个元素(出现了未知异常)
Insert_DuLinkList(La,3,5);//在第3个元素前插入5
printf("b=%d,c=%d,d=%d",b,c,d);
printf("a=%d",a);
Print_DuLinkList(La);
return 0;
}