循环链表的基本操作

/*
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;
}

程序执行结果:

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值