您的位置:首页 > 其它

实现循环单链表各种基本运算的算法

2013-01-27 14:39 387 查看
/*algo2-1.cpp*/

#include<stdio.h>

#include<malloc.h>

typedef char ElemType;

typedef struct LNode/*定义单链表结点类型*/

{

ElemType data;

struct LNode * next;

}LinkList;

void InitList(LinkList * &L)/*创建头结点*/

{

L=(LinkList *)malloc(sizeof(LinkList));

L->next=L;

}

void DestroyList(LinkList * &L)

{

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

while(q!=L)

{

free(p);

p=q;

q=p->next;

}

free(p);

}

int ListEmpty(LinkList *L)

{

return(L->next==L);

}

int ListLength(LinkList *L)

{

LinkList *p=L;int i=0;

while(p->next!=L)

{

i++;

p=p->next;

}

return(i);

}

void DispList(LinkList *L)

{

LinkList *p=L->next;

while(p!=L)

{

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

p=p->next;

}

printf("\n");

}

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

{

int j=0;

LinkList *p;

if(L->next!=L)/*单链表不为空表时*/

{

if(i==1)

{

e=L->next->data;

return 1;

}

else

{

p=L->next;

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

{

j++;

p=p->next;

}

if(p==L)

return 0;

else

{

e=p->data;

return 1;

}

}

}

else /*单链表为空表时*/

return 0;

}

int LocateElem(LinkList *L,ElemType e)

{

LinkList *p=L->next;

int n=1;

while(p!=L && p->data!=e)

{

p=p->next;

n++;

}

if(p==L)

return 0;

else

return n;

}

int ListInsert(LinkList * &L,int i,ElemType e)

{

int j=0;

LinkList *p=L,*s;

if(p->next==L||i==1)/*原单链表为空表或i==1时*/

{

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

s->data=e;

s->next=p->next;

p->next=s;

return 1;

}

else

{

p=L->next;

while(j<i-2 && p!=L)

{

j++;

p=p->next;

}

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

return 0;

else

{

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

s->data=e;

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

p->next=s;

return 1;

}

}

}

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

{

int j=0;

LinkList *p=L,*q;/*原单链表不为空表时*/

if(p->next!=L)

{

if(i==1)/*i==1时*/

{

q=L->next;/*删除第1个结点*/

L->next=q->next;

free(q);

return 1;

}

else/*i不为1时*/

{

p=L->next;

while(j<i-2 && p!=L)

{

j++;

p=p->next;

}

if(p==L)

return 0;/*未找到第i-1个结点*/

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

{

q=p->next;/*q指向要被删除的结点*/

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

free(q);

return 1;

}

}

}

else

return 0;

}

/*exp2-1.cpp*/

#include<stdio.h>

#include<malloc.h>

typedef char ElemType;

typedef struct LNode/*定义单链表结点类型*/

{

ElemType data;

struct LNode * next;

}LinkList;

extern void InitList(LinkList * &L);

extern void DestroyList(LinkList * &L);

extern int ListEmpty(LinkList *L);

extern int ListLength(LinkList *L);

extern void DispList(LinkList *L);

extern int GetElem(LinkList *L,int i,ElemType &e);

extern int LocateElem(LinkList *L,ElemType e);

extern int ListInsert(LinkList * &L,int i,ElemType e);

extern int ListDelete(LinkList * &L,int i,ElemType &e);

void main()

{

LinkList *h;

ElemType e;

printf("(1)初始化循环单链表\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);

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