数据结构C语言版 循环链表表示和实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;