您的位置:首页 > 理论基础 > 数据结构算法

循环链表的基本操作

2016-06-15 17:04 447 查看
/*
2016年6月15日16:55:27
循环链表的基本操作
插入,删除,查找,求一个元素的前驱,后继,求链表长度等
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct Node
{
int data;
struct Node *next;
}Node,*LinkList;

bool InitList(LinkList *L); //初始化
void ListEmpty(LinkList L); //判断是否为空
bool ListInsert(LinkList *L,int i,int e); //插入
int ListLength(LinkList L); //求表长
bool GetElem(LinkList L,int i,int *e); //查找
bool ListTraverse(LinkList L);	//遍历输出
bool PriorElem(LinkList L,int cur_e,int *pre_e); //求元素的前驱
bool NextElem(LinkList L,int cur_e,int *next_e); //求元素的后继
int LocateElem(LinkList L,int e, bool(*compare)(int,int) ); //求位序
bool compare(int c1,int c2);
bool ListDelete(LinkList *L,int i,int *e); //删除
bool ClearList(LinkList *L);	//清空
bool DestoryList(LinkList *L);   //销毁

int main()
{
LinkList L;
int len;
int e;
int e0;
int pos, i; //元素在表中的位置
InitList(&L);  //初始化单链表
ListEmpty(L);  //判断链表是否为空
ListInsert(&L,1,3); //在链表第1个位置前插入3
ListInsert(&L,2,6);

ListEmpty(L);
len = ListLength(L);
printf("len = %d\n",len);

GetElem(L,1,&e);
printf("第一个元素的值为 %d\n",e);
GetElem(L,2,&e0);
printf("第二个元素的值为 %d\n",e0);

printf("依次输出表中的元素:");
ListTraverse(L);

PriorElem(L,6,&e); //求元素的前驱
printf("元素6的前驱为 %d\n",e);
NextElem(L,3,&e0);
printf("元素3的后继为 %d\n",e0);

pos = LocateElem(L,6,compare);
if(pos)
printf("L的第%d个元素为6\n",pos);
else
printf("不存在值为6的元素!\n");

ListDelete(&L,2,&e);
if(i)
{
printf("删除的数据元素为%d,现在表中的数据为:\n",e);
ListTraverse(L);
}
else
printf("删除元素失败!\n");

ClearList(&L);
printf("清空后判断链表是否为空 ");
ListEmpty(L);

DestoryList(&L);

return 0;
}

bool InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node));
if( (*L) == NULL)
{
printf("内存分配失败程序终止!\n");
exit(-1);
}
(*L)->next = *L;
return true;
}

void ListEmpty(LinkList L)
{
if(L->next == L)
printf("循环链表为空!\n");
else
printf("循环链表不空!\n");
}

bool ListInsert(LinkList *L,int i,int e)
{
//在第i个元素之前插入元素e
LinkList p = (*L)->next, s; //p指向头结点
int j = 0;
if(i <= 0 || i > ListLength(*L)+1) //i值不合法
return false;
while(j < i - 1)  //寻找第i-1个结点
{
p = p->next;
j++;
}
s = (LinkList)malloc(sizeof(Node)); //生成新结点
s->data = e;
s->next = p->next;
p->next = s;
if(p == *L)
*L = s;
return true;
}

int ListLength(LinkList L)
{
int i = 0;
LinkList p = L->next; //p指向头结点
while(p != L) //没到表尾
{
i++;
p = p->next;
}
return i;
}

bool GetElem(LinkList L,int i,int *e)
{
//当第i个元素存在时 赋值给e
int j = 1; //j为计数器
LinkList p = L->next->next; // p指向第一个结点
if(i <= 0 || i > ListLength(L))
return true;
while(j < i)
{  // 顺指针向后查找 直到p指向第i个元素
p = p->next;
j++;
}
*e = p->data;
return true;
}

bool ListTraverse(LinkList L)
{
LinkList p = L->next->next;
while(p != L->next)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return true;
}

bool PriorElem(LinkList L,int cur_e,int *pre_e)
{
LinkList q, p = L->next->next; //p指向第一个结点
q = p->next;
while(q != L->next)
{
if(q->data == cur_e)
{
*pre_e = p->data;
return true;
}
p = q;
q = q->next;
}
return false;
}

bool NextElem(LinkList L,int cur_e,int *next_e)
{
LinkList p = L->next->next; //p指向第一个结点
while(p != L) //p没有到表尾
{
if(p->data == cur_e)
{
*next_e = p->next->data;
return true;
}
p = p->next;
}
return true;
}

int LocateElem(LinkList L,int e, bool(*compare)(int,int) )
{
//返回位序 (第1个与e满足关系compare()的数据元素)
int i = 0;
LinkList p = L->next->next; // p指向第一个结点
while(p != L->next)
{
i++;
if(compare(e,p->data)) //满足关系
return i;
p = p->next;
}
return 0;
}

bool compare(int c1,int c2)
{
if(c1 == c2)
return true;
else
return false;
}

bool ListDelete(LinkList *L,int i,int *e)
{
LinkList p = (*L)->next, q; //p指向头结点
int j = 0;
if(i <= 0 || i > ListLength(*L))
return false;
while(j < i - 1)
{
p = p->next;
j++;
}
q = p->next; // q指向待删除的结点
p->next = q->next;
*e = q->data;
if(*L == q) //删除的是表尾元素
*L = p;
free(q);
return true;
}

bool ClearList(LinkList *L)
{
//将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 true;
}

bool DestoryList(LinkList *L)
{   //销毁链表
LinkList q, p = (*L)->next;
while(p != *L)
{
q = p->next;
free(p);
p = q;
}
free(*L);
*L = NULL;
return true;
}

程序执行结果:

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