#include"stdio.h"
#include"malloc.h"
//#include"algo2_3.cpp"
typedef char ElemType;
//struct DNode
// {
// ElemType data;
// struct DNode *prior;
// struct DNode *next;
// }DLinkList;
//**********************************************************************************
typedef char ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *prior;
struct DNode *next;
}DLinkList;
void InitList(DLinkList *&L)//初始化双链表L
{
L=(DLinkList *)malloc(sizeof(DLinkList));
L->prior=L->next=NULL;
}
void DestroyList(DLinkList *&L)//释放双链表L
{
DLinkList * p=L,* q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
int ListEmpty(DLinkList * L)//判断双链表L是否为空
{
return(L->next==NULL);
}
int ListLength(DLinkList * L)
{
DLinkList *p=L;int i=0;
while(p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
void DispList(DLinkList * L)//输出双链表L
{
DLinkList * p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("/n");
}
int GetElem(DLinkList * L,int i,ElemType &e)//获取双链表L中的第i个元素
{
int j=0;
DLinkList * p=L;
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
e=p->data;
return 1;
}
}
int LocateElem(DLinkList * L,ElemType e)//在双链表L查元素
{
int n=1;
DLinkList * p=L->next;
while(p!=NULL&& p->data!=e)
{
n++;
p=p->next;
}
if(p==NULL)
return(0);
else
return(n);
}
int ListInsert(DLinkList * &L,int i,ElemType e)//尾追法插入元素
{
int j=0;
DLinkList * p=L,* s;
while((j<(i-1))&&(p!=NULL))
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=e;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return 1;
}
}
int ListDelete(DLinkList * &l,int i,ElemType &e)//在双链表L中删除第i个元素
{
int j=0;
DLinkList *p=l, * q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next;
if(q==NULL) return 0;
p->next=q->next;
if(p->next!=NULL) p->next->prior=p;
free(q);
return 1;
}
}
//*****************************************************************************************
extern void InitList(DLinkList *&L);
extern void DestroyLList(DLinkList *&L);
extern int ListEmpty(DLinkList * L);
extern int listLength(DLinkList *L);
extern void DispList(DLinkList *L);
extern int GetElem(DLinkList * L,int i,ElemType &e);
extern int LocateElem(DLinkList *L,ElemType e);
extern int ListInsert(DLinkList *&L,int i,ElemType e);
extern int ListDelete(DLinkList *&L,int i,ElemType &e);
void main()
{
DLinkList * h;
ElemType e;
printf("1 初始化双链表H/n");
InitList(h);
printf("2 采用尾插入法输入A ,B,C,D,E/n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
printf("3 输出双链表h: ");
DispList(h);
printf("4 双链表长度=%d/n",ListLength(h));
printf("5 双链表为%s/n",(ListEmpty(h)?"空":"非空"));
GetElem(h,3,e);
printf("6 双链表的第3个元素为%c/n",e);
printf("7 元素a的位置是%d/n",LocateElem(h,'a'));
printf("8 在第4个元素位置上插入F元素/n");
ListInsert(h,4,'f');
printf("9 输出双链表: ");
DispList(h);
printf("10 删除第3个元素/n");
ListDelete(h,3,e);
printf("11 输出双链表h: ");
DispList(h);
printf("12 释放双链表/n");
DestroyList(h);
}