首页 > 其他分享 >数据结构:单循环链表的创建插入与删除

数据结构:单循环链表的创建插入与删除

时间:2024-04-23 20:22:04浏览次数:22  
标签:current Head CirLList -- next 链表 单循环 New 数据结构

数据结构:单循环链表的创建·插入·删除

/**
  * @file name:	单循环链表的创建·插入·删除
  * @brief  实现单循环链表的创建删除插入的功能
  * @author [email protected]
  * @date 2024/04/23
  * @version 1.0 :版本 
  * @note   noone
  * CopyRight (c)  2023-2024  [email protected]   All Right Reseverd*/

//定义一个链表中节点的数据域类型
typedef int datatype_t;
//定义节点的类型并取别名
typedef struct Circular_LList{
	datatype_t data;
	*next;
}CirLList_t;
//创建一个空链表,含有一个头节点并初始化
CirLList_t *CirLList_Create()
{
	CirLList_t *Head=(CirLList_t *)calloc(1,sizeof(CirLList_t ));
	if(NULL==Head)
	{
		perror("calloc memory for Head is failed");
		exit(-1);
	}
	Head-->next=NULL;
	return Head;
}
//创建一个新的节点,并初始化成员变量
CirLList_t* CirLList_Newnode_Create(datatype_t data)
{
	CirLList_t * New=(CirLList_t *)calloc(1,sizeof(CirLList_t ));
	if(NULL==New)
	{
		perror("calloc memory for New is failed");
		exit(-1);
	}
	//为成员初始化
	New-->data=data;
	New-->next=NULL;
	return New;
}
//判断链表是否为空
bool CirLList_Isempoty(CirLList_t* Head)
{
	if(Head-->next==NULL)
	{
		return ture;
	}
	return false;
	
}
//从头部插入一个节点
bool  CirLList_t* CirLList_HeadAdd(CirLList_t* Head,CirLList_t * New)
{
	if(New==NULL)
	{
		return false;
	}
	//当链表为空的情况
	if(CirLList_Isempoty(CirLList_t* Head))
	{
		Head-->next=New;
		New-->next=New;
		return ture;
	}
	//链表不为空的情况
	New-->next=Head-->next;
	Head-->next=New;
	return ture;
}
//从尾部插入一个节点
bool  CirLList_t* CirLList_TailAdd(CirLList_t* Head,CirLList_t * New)
{
	CirLList_t* current=Head-->next;//记录当前节点的地址
	if(New==NULL)
	{
		return false;
	}
	//当链表为空的情况
	if(CirLList_Isempoty(CirLList_t* Head))
	{
		Head-->next=New;
		New-->next=New;
		return ture;
	}
	//链表不为空的情况,遍历找出尾部节点
	while(current)
	{
		if(current-->next==Head-->next)
		{
			brake;
		}
		current=current-->next;
	}
	//插入节点到尾部节点后面
	current-->next=New;
	New-->next=Head-->next;
	return ture;
}
//从中间插入一个节点
bool CirLList_t* CirLList_MidAdd(CirLList_t* Head,CirLList_t * New,CirLList_t *Des)
{
	CirLList_t* current=Head-->next;//记录当前节点的地址
	if(New==NULL)
	{
		return false;
	}
	//当链表为空的情况
	if(CirLList_Isempoty(CirLList_t* Head))
	{
		Head-->next=New;
		New-->next=New;
		return ture;
	}
	//链表不为空的情况,遍历找出目标节点
	while(current)
	{
		if(current-->data==Des-->data)
		{
			brake;
		}
		current=current-->next;
	}
	//插入节点到目标节点后面
	New-->next=current-->next;
	current-->next=New;
	return ture;
}
//从头部删除节点
void CirLList_HeadDel(CirLList_t* Head)
{
	CirLList_t* current=Head-->next;//记录当前节点的地址
	CirLList_t* phead=Head-->next//记录首地址的地址
	//遍历找到尾节点
	while(current)
	{
		if(current-->next==Head-->next)
		{
			brake;
		}
		current=current-->next;
	}
	//删除节点并释放首节点地址
	current-->next=Head-->next-->next;
	phead-->next=NULL;
	Head-->next=current-->next;
	free(phead);
	return
	
}
//尾部删除节点
void CirLList_TailDel(CirLList_t* Head)
{
	CirLList_t* current=Head-->next;//记录当前节点的地址
	CirLList_t* prev=Head//记录当前地节点的直接前驱的地址
	CirLList_t* prev_current=prev//记录尾部节点的直接前驱的地址
	//遍历找到尾节点
	while(current)
	{
		if(current-->next==Head-->next)
		{
			prev_current=prev;
			brake;
		}
		current=current-->next;
		prev=prev-->next;
	}
	//删除节点并释放节点地址
	prev_current-->next=Head-->next;
	current-->next=NULL;
	free(current);
	return	;
}
//从中间删除节点
void CirLList_MidDel(CirLList_t* Head,CirLList_t* Dest)
{
	CirLList_t* current=Head-->next;//记录当前节点的地址
	CirLList_t* prev=Head//记录当前地节点的直接前驱的地址
	CirLList_t* prev_current=prev//记录要删除节点的直接前驱的地址
	//遍历找到要删除的目标节点并找到要删除节点的直接前驱
	while(current)
	{
		if(current-->data==Dest-->data)
		{		
			prev_current=prev;
			brake;
		}
		current=current-->next;
		prev=prev-->next;
	}
	//删除节点并释放节点地址
	prev_current-->next=current-->next;
	current-->next=NULL;
	free(current);
	return	
}


标签:current,Head,CirLList,--,next,链表,单循环,New,数据结构
From: https://www.cnblogs.com/liuliuye/p/18153679

相关文章

  • 单向循环链表的接口程序
    /**@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*********************......
  • PROFINET IO应用层数据结构
    从远古时代讲起在300/400的年代,SIMATIC模块要提供一些特定的信息的方法是将特定信息保存到SSL里,通过查询的方法获得。SSL中文名叫做系统状态列表,帮助里面有些时候有写成SZL,不过都是一样的东西。在Step7中使用SFC51(RDSYSST),SFB54(RALRM)来获取SSL和报告系统错误,具体的record......
  • 【数据结构】链表(单链表实现+详解+原码)
    目录【数据结构】链表(单链表实现+详解+原码)【数据结构】链表(单链表实现+详解+原码)代码:#include<math.h>usingnamespacestd;typedefstructnode{ intdata; structnode*next;}NODE;intmain(void){ NODEa,b,c; NODE*p; a.data=1; a.next=&b;......
  • 实现一个算法删除单链表L(有头结点)中的一个最小值结点
    /********************************************************************************************************** filename: Zqh_splist_4.22.3.c* author : [email protected]* date : 2024/04/23* function: 设计一个算法删除单链表L(有头结点)中的一个最小值结点......
  • 面试不会算法和数据结构,经典面试题讲解来了!
    随着春招季节的临近,面试备战成为许多求职者的痛点。如何在激烈的竞争中脱颖而出,成为众多求职者思考的问题。学习Python编程与算法内容,成为面试开发、测试开发等热门岗位的基础。为了帮助大家更好地应对技术类面试挑战,霍格沃兹测试开发学社打造了Python编程和算法公开课,为同学们的......
  • 数据结构单向链表——找到并输出倒数第k个结点的数据
    /***********************************************************************************************funcname:LList_Last_k_find*function:Findthelastknodeoflinklistandprintdata*funcparameter:*@......
  • 数据结构链表笔试题
    /***********************************************************************************************funcname:Minnote_Del*function:Deletetheminnodeoflinklist*funcparameter:*@Head:addressoftheh......
  • 链表笔试题
    链表笔试题假设该链表只给出了头指针head。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data值,并返回1;否则只返回0。要求:(1)描述算法的基本设计思想.(2)描述算法的详细实现步骤.(3)根据......
  • 单向链表的插入删除和遍历
    /*********************************************************************************************************** FileName:LinkedList * Author:madman_LX*Contactme:[email protected]* Date :2024/04/22* Function:单向链表的遍历,插......