数据结构C语言版 循环链表表示和实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构C语言版循环链表表示和实现.txt37真诚是美酒,年份越久越醇香浓烈;真诚是焰火,在高处绽放才愈显美丽;真诚是鲜花,送之于人,手有余香。/*

数据结构C语言版循环链表表示和实现

P35

编译环境:Dev-C++ 4.9.9.2

日期:2011年2月10日

*/

#include

#include

#include

typedef int ElemType;

// 线性表的单链表存储结构

typedef struct LNode

{

ElemType data;

struct LNode *next;

}LNode, *LinkList;

// 要好好区分什么是头结点((*L)->next),尾结点(*L),以及第一个结

// 点(*L)->next->next,设立尾指针的单循环链表(头尾相接,即头结点

// 与尾结点是一样的,它们都没数据域.

// 构造一个空的循环链表L

int InitList_CL(LinkList *L)

{

// 产生头结点,并使L指向此头结点

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

if(!*L)

exit(0);

// 指针域指向头结点,这样就构成了一个循环,空表循环,*L为表尾

(*L)->next = *L;

return 1;

}

// 销毁循环链表L

int DestroyList_CL(LinkList *L)

{

LinkList q,

p = (*L)->next; // p指向头结点

while(p != *L) // 没到表尾,*L为表尾

{

q = p->next;

free(p);

p = q;

}

free(*L);

*L = NULL;

return 1;

}

// 将L重置为空表

int ClearList_CL(LinkList *L)

{

LinkList p, q;

*L=(*L)->next; // L指向头结点

p=(*L)->next; // p指向第一个结点

while(p!=*L) // 没到表尾

{

q=p->next;

free(p);

p=q;

}

(*L)->next=*L; // 头结点指针域指向自身return 1;

}

// 若L为空表,则返回1,否则返回0

int ListEmpty_CL(LinkList L)

{

if(L->next==L) // 空

return 1;

else

return 0;

}

// 返回L中数据元素个数

int ListLength_CL(LinkList L)

{

int i=0;

LinkList p=L->next; // p指向头结点

while(p!=L) // 没到表尾

{

i++;

p=p->next;

}

return i;

}

// 当第i个元素存在时,其值赋给e并返回1,否则返回0

int GetElem_CL(LinkList L,int i,ElemType *e)

{

int j=1; // 初始化,j为计数器

LinkList p=L->next->next; // p指向第一个结点

if(i<=0||i>ListLength_CL(L)) // 第i个元素不存在

return 0;

while(j

{

// 顺指针向后查找,直到p指向第i个元素

p=p->next;

j++;

}

*e=p->data; // 取第i个元素

return 1;

}

// 返回L中第1个与e满足关系compare()的数据元素的位序。

// 若这样的数据元素不存在,则返回值为0

int LocateElem_CL(LinkList L,ElemType e,int(*compare)(ElemType,ElemType)) {

int i=0;

LinkList p=L->next->next; // p指向第一个结点

while(p!=L->next)

{

i++;

if(compare(p->data,e)) // 满足关系

return i;

p=p->next;

}

return 0;

}

// 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱.

int PriorElem_CL(LinkList L,ElemType cur_e,ElemType *pre_e)

{

LinkList q,p=L->next->next; // p指向第一个结点

q=p->next;

while(q!=L->next) // p没到表尾

{

if(q->data==cur_e)

{

*pre_e=p->data;

相关文档
最新文档