首页 > 其他分享 >单向循环链表

单向循环链表

时间:2024-04-23 21:44:19浏览次数:15  
标签:Head 单向 结点 CircLList next 链表 循环 Phead

image-20240423212240499

//头插
bool CircLList_HeadInsert(CircLList_t *Head,DataType_t data)
{
	//创建一个新节点
	CircLList_t *New = CircLList_NewNode(data);
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,就直接插入
	if (Head->next == Head)
	{
		Head->next = New;
		return true;
	}

	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			New->next = Head->next;
			Head->next = New;
			Phead->next = Head->next;
			break;
		}	
	}
	
}

image-20240423212316928

//尾插
bool CircLList_TailInsert(CircLList_t *Head,DataType_t data)
{
	//创建一个新节点
	CircLList_t *New = CircLList_NewNode(data);
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,就直接插入
	if (Head->next == Head)
	{
		Head->next = New;
		return true;
	}

	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			Phead->next = New;
			New->next = Head->next;
			break;
		}	
	}

}

image-20240423212349264

//指定位置插入
bool CircLList_DestInsert(CircLList_t *Head,DataType_t destval,DataType_t data)
{
	//创建一个新节点
	CircLList_t *New = CircLList_NewNode(data);
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,就直接插入
	if (Head->next == Head)
	{
		Head->next = New;
		return true;
	}

	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否找到目标数据,找到了新节点连接目标节点的下一个节点,目标节点再连接新节点
		if (New->data == destval)
		{
			New->next = Phead->next;
			Phead->next = New;
			break;
		}	
	}

	
}

image-20240423212834517

//头删
bool LList_HeadDel(CircLList_t *Head)
{
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	//对单向循环链表的首节点再进行备份
	CircLList_t *lhead = Head->next;

	
	//判断当前链表是否为空,为空则直接退出
	if (Head->next == Head)
	{
		printf("current linkeflist is empty!\n");
		return false;
	}

	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			Phead->next = lhead->next;
			Head->next = lhead->next;
			lhead->next = NULL;
			free(lhead);
			break;
		}	
	}
}

image-20240423212909026

//尾删
bool LList_TailDel(CircLList_t *Head)
{
	
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Pphead = Head;
	//对单向循环链表的首节点再进行备份
	CircLList_t *Phead = Pphead->next;
	//判断当前链表是否为空,为空则直接退出
	if (Head->next == Head)
	{
		printf("current linkeflist is empty!\n");
		return false;
	}

	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			Pphead->next = Head->next;
			Phead->next = NULL;
			free(Phead);
			break;
		}	

	}
}

image-20240423212935313

//中间删除
bool LList_MiddDel(CircLList_t *Head,DataType_t data)
{
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Pphead = Head;
	//对单向循环链表的首节点再进行备份
	CircLList_t *Phead = Pphead->next;
	//判断当前链表是否为空,为空则直接退出
	if (Head->next == Head)
	{
		printf("current linkeflist is empty!\n");
		return false;
	}

	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达找到想要删除的目标数据
		if (Phead->data != data)
		{
			printf("没有找到想要删除的文件!\n");
			return false;
		}	
		//找到达找到想要删除的目标数据
		if (Phead->data == data)
		{
			Pphead->next = Phead->next;
			Phead->next =NULL;
			free(Phead);
			break;
		}	

	}
}

标签:Head,单向,结点,CircLList,next,链表,循环,Phead
From: https://www.cnblogs.com/-110/p/18153809

相关文章

  • 单向循环链表的接口程序
    自定义单向循环链表的增删改查接口函数/********************************************************************文件名称: 01单向循环链表的接口程序文件作者:[email protected]创建日期:2024/04/23文件功能:对单向循环链表的增删改查功能的定义注意事项:......
  • 单向循环链表——查找、删除、插入结点
    /********************************************************************* filename: CircularLinkedList.c* author :Dazz* date :2024/04/23* function:用于学习单向循环链表,并添加插入、删除、查找结点等函数* note :None** CopyRight(c)202......
  • 单向循环链表(其一)
    单向循环链表(其一)单向循环链表的原理与应用:单向循环的链表的使用规则和普通的单向链表没有较大的区别,需要注意:*单向循环链表的尾结点的指针域中必须指向链表的首结点的地址*,由于带头结点的单向循环链表更加容易进行管理,如下图所示:上图所示的就是一个典型的单向循环链表的结构,......
  • 设计单向循环链表的接口
    /***********************************************************************************filename:003_单向循环链表.cauthor:[email protected]:2024/04/23function:设计单向循环链表的接口note:......
  • 单项循环链表的头插、尾插、中间插、头删、尾删、中间删
    单项循环链表的头插、尾插、中间插、头删、尾删、中间删/******************************************************************** author :[email protected]* date :2024/04/23* function:单项循环链表的头插、尾插、中间插、头删、尾删、中间删* note :Non......
  • 数据结构:单循环链表的创建插入与删除
    数据结构:单循环链表的创建·插入·删除/***@filename: 单循环链表的创建·插入·删除*@brief实现单循环链表的创建删除插入的功能*@[email protected]*@date2024/04/23*@version1.0:版本*@notenoone*CopyRight(c)2023-2024liuliu@......
  • 单向循环链表的接口程序
    /**@filename: main.c@brief单向循环链表的接口程序@[email protected]@date2024/04/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)[email protected]*/include<stdio.h>include......
  • 链表的查找操作例题
    代码/********************************************name:find*function:查找链表倒数第k位置的结点*argument:@head:头指针@k:链表倒数第k位置的结点数*retval:None*date:2024/04/22*note:Note*********************......
  • 探讨两种循环表示方法的区别,while循环与for循环的小总结
    基于前天建立的顺序表(sequeue)的其中一个功能函数,引出两个循环的表示方法的区别和比较。算法需求:在一个顺序队列中,合并相同的元素。总体思路:利用两层循环的框架,利用外层循环选中顺序表中第一个数(L->data[i]),再用内循环中进行对比(L->data[j]),如果相同就进行删除操作。首先采用......
  • 使用 Python 循环创建多个列表
    前言在Python中,我们可以使用循环来动态创建多个列表,这在处理数据、进行数据分析或进行算法实现时非常有用。本文将介绍几种常见的方法,以帮助大家学习如何使用循环创建多个列表。方法一:使用列表推导式列表推导式是Python中一种简洁的语法,可以快速生成列表。我们可以结合循......