数据结构之循环单链表(学习笔记)

一、循环链表的定义

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表

在这里插入图片描述

二、带头结点的循环链表的判空条件

在这里插入图片描述

p->next 不等于头结点

在设计循环单链表时,仅设计指向终端结点的尾指针可以提高效率,此时查找开始结点和终端结点就很方便了,下面以此来实现循环单链表

三、循环单链表的基本操作
1.循环单链表的整表创建
typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node* next;
}Node, * LinkList;

void CreateCycleList(LinkList* rear,int n)
{
	int data;
	LinkList p,head;
	(*rear) = (LinkList)malloc(sizeof(Node)); //创建头结点
	head = (*rear);  //记录下头结点的位置
	(*rear)->next = head; //初始化头结点的后继结点指向自己
	for(int i=0;i<n;i++)
	{
		scanf("%d",&data);  //假设数据域是int类型
		 p = (LinkList)malloc(sizeof(Node)):
		 p->data = data;
		 p->next = head; //新结点的后继结点指向头结点
		 (*rear)->next = p; //尾指针指向结点的后继结点指向新结点
		 (*rear)  = p;//更新尾指针
	}
}
2.循环单链表结点的获取
/*初始条件:表已经存在*/
/*操作结果:返回第i个位置的结点*/
LinkList GetNode(LinkList rear,int i)
{
	if(i==0)
		return rear->next; //i等于0时可以选择返回头结点
	LinkList p,head;
	int j = 1;
	head = rear->next; //记下头结点位置
	p = head->next; //给p赋值为第一个结点
	while(p!=head&&j<i) //当p等于头结点说明已经遍历完整个链表
	{
		 p = p->next;
		 j++;
	}
	if(p==head||j>i)
		return NULL;
	return p;
}
3.循环链表获取表长
/*初始条件:表已经存在*/
/*操作结果:返回表长*/
int GetLength(LinkList rear)
{
	int count = 0;
	LinkList p,head;
	head = rear->next; //记下头结点
	p = head->next; //从第一个结点开始
	while(rear!=head)
	{
	 	P = P->next;
	 	count++;
	}
	return count;
}
4.循环单链表插入
/*初始条件:表已经存在*/
/*操作结果:在第i个结点插入结点*/
Status ListInsert(LinkList* rear,int i,ElemType e)
{
	LinkList p,s;
	p = GetNode((*rear),i-1);
	if(p==NULL)
		return false;.
	s = (LinkList)malloc(sizeof(Node));
	if(i>GetLength(*rear))
		(*rear) = s; //如果i>表长,说明是在表尾插入元素,则尾指针要及时更新
	s = (LinkList)malloc(sizeof(Node));
	if (i > GetLength(*rear))
		(*rear) = s;
	s->data = e;
	s->next = p->next; //p的后继指针赋值给s的后继指针,如果s是插入在表尾的元素,则s的后继指针就指向的了头结点
	p->next = s;  //p的后继指针指向s
	return true;
}
5.循环单链表的删除
/*初始条件:表已经存在*/
/*操作结果:删除第i个位置上的结点,并用e回收删除结点的数据域*/
Status ListDelete(LinkList* rear, int i, ElemType* e)
{
	LinkList p, s;
	p = GetNode((*rear), i - 1);
	if (p == NULL)
		return false;
	if (i == GetLength(*rear))
		(*rear) = p;
	s = p->next;
	p->next = s->next;
	*e = s->data;
	free(s);
	return true;
}
5.循环单链表整表删除
/*初始条件:表已经存在*/
/*操作结果:删除所有数据元素,将表重置为空表*/
void ClearList(LinkList* rear)
{
	LinkList p, q, head;
	head = (*rear)->next; //记下头结点位置
	p = head->next;  //从第一个结点开始
	while (p != head) //当p等于头结点说明已经清空完毕
	{
		q = p;
		p = p->next;
		free(q);
	}
	(*rear) = head; //更新尾指针
	(*rear)->next = head; //尾指针的后继指针指向头结点
}
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习数据结构的C语言笔记,我可以给你一些基本的指导和概念。数据结构是计算机科学中非常重要的一门课程,它涉及存储和组织数据的方法。C语言是一种常用的编程语言,很适合用于实现各种数据结构。 下面是一些数据结构的基本概念,你可以在学习笔记中包含它们: 1. 数组(Array):一种线性数据结构,可以存储相同类型的元素。在C语言中,数组是通过索引访问的。 2. 链表(Linked List):也是一种线性数据结构,但不需要连续的内存空间。链表由节点组成,每个节点包含数据和指向下一个节点的指针。 3. 栈(Stack):一种后进先出(LIFO)的数据结构,类似于装满物品的箱子。在C语言中,可以使用数组或链表来实现栈。 4. 队列(Queue):一种先进先出(FIFO)的数据结构,类似于排队等候的队伍。同样可以使用数组或链表来实现队列。 5. 树(Tree):一种非线性数据结构,由节点和边组成。每个节点可以有多个子节点。二叉树是一种特殊的树结构,每个节点最多有两个子节点。 6. 图(Graph):另一种非线性数据结构,由节点和边组成。图可以用来表示各种实际问题,如社交网络和地图。 这只是数据结构中的一些基本概念,还有其他更高级的数据结构,如堆、哈希表和二叉搜索树等。在学习笔记中,你可以介绍每个数据结构定义、操作以及适合使用它们的场景。 希望这些信息对你有所帮助!如果你有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值