您的位置:首页 > 其它

实现双链表的各种基本运算的算法

2013-01-27 14:49 561 查看
/*algo2-3.cpp*/

#include<stdio.h>

#include<malloc.h>

typedef char ElemType;

typedef struct DNode /*定义双链表结点类型*/

{

ElemType data;

struct DNode * prior;/*指向前驱结点*/

struct DNode * next;/*指向后继结点*/

}DLinkList;

void InitList(DLinkList * &L)

{

L=(DLinkList *)malloc(sizeof(DLinkList));/*创建头结点*/

L->prior=L->next=NULL;

}

void DestroyList(DLinkList * &L)

{

DLinkList *p=L,*q=p->next;

while(q!=NULL)

{

free(p);

p=q;

q=p->next;

}

free(p);

}

int ListEmpty(DLinkList *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)

{

DLinkList *p=L->next;

while(p!=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

int GetElem(DLinkList *L,int i,ElemType &e)

{

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)

{

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)/*未找到第i-1个结点*/

return 0;

else /**/

{

s=(DLinkList *)malloc(sizeof(DLinkList));/*创建结点*s*/

s->data=e;

s->next=p->next;/*将*s插到*p之后*/

if(p->next!=NULL)p->next->prior=s;

s->prior=p;

p->next=s;

return 1;

}

}

int ListDelete(DLinkList * &L,int i,ElemType &e)

{

int j=0;

DLinkList *p=L,*q;

while(j<i-1 && p!=NULL)

{

j++;

p=p->next;

}

if(p==NULL)/*未找到第i-1个结点*/

return 0;

else /*找到第i-1个结点*p*/

{

q=p->next;

if(q==NULL) return 0;/*不存在第i个结点*/

p->next=q->next;/*从单链表中删除*q结点*/

if(p->next!=NULL)p->next->prior=p;

free(q);/*释放*q结点*/

return 1;

}

}

/*exp2-3.cpp*/

#include<stdio.h>

#include<malloc.h>

typedef char ElemType;

typedef struct DNode /*定义双链表结点类型*/

{

ElemType data;

struct DNode * prior;/*指向前驱结点*/

struct DNode * next;/*指向后继结点*/

}DLinkList;

extern void InitList(DLinkList * &L);

extern void DestroyList(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)双链表h长度=%d\n",ListLength(h));

printf("(5)双链表h长度%s\n",(ListEmpty(h)?"空":"非空"));

GetElem(h,3,e);

printf("(6)双链表h的第3个元素=%c\n",e);

printf("(7)元素a的位置=%d\n",LocateElem(h,'a'));

printf("(8)在第4个元素位置上插入f元素\n");

ListInsert(h,4,'f');

printf("(9)输出双链表h:");

DispList(h);

printf("(10)删除h的第3个元素\n");

ListDelete(h,3,e);

printf("(11)输出双链表h:");

DispList(h);

printf("(12)释放双链表h\n");

DestroyList(h);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: