首页 > 其他分享 >linkedlist

linkedlist

时间:2024-04-25 11:34:27浏览次数:23  
标签:Head return linkedlist 结点 next 链表 LList

单链表

1.单链表的管理结构

/********************************************************************
*		DataType_t  		 data	存放数据
*		struct LinkedList	*next	存放下一个元素的地址
********************************************************************/
typedef struct LinkedList
{
	DataType_t  		 data; //结点的数据域
	struct LinkedList	*next; //结点的指针域

}LList_t;

2.创建链表并完成初始化


/*****************************************************************************
*                 函数名称:		LList_Create
*                 函数功能:	创建一个空链表,空链表应该有一个头结点,对链表进行初始化
*                 函数参数:	NONE
*                 返回结果:	Head	返回头结点的地址
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
******************************************************************************/

LList_t * LList_Create(void)
{
	//1.创建一个头结点并对头结点申请内存
	LList_t *Head = (LList_t *)calloc(1,sizeof(LList_t));
	if (NULL == Head)
	{
		perror("Calloc 内存申请失败");
		exit(-1);
	}

	//2.对头结点进行初始化,头结点是不存储有效内容的!!!
	Head->next = NULL;

	//3.把头结点的地址返回即可
	return Head;
}

3.创建新结点,并初始化

/*****************************************************************************
*                 函数名称:		LList_NewNode
*                 函数功能:	创建新的结点,并对新结点进行初始化
*                 函数参数:	
*								@a:data	新增的元素的值
*                 返回结果:	New	返回新结点的地址
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
******************************************************************************/

LList_t * LList_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	LList_t *New = (LList_t *)calloc(1,sizeof(LList_t));
	if (NULL == New)
	{
		perror("Calloc 内存申请失败");
		return NULL;
	}

	//2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}

4.头插

/*****************************************************************************
*                 函数名称:		LList_HeadInsert
*                 函数功能:	向链表的头部插入元素
*                 函数参数:	
*								@a:Head	操作的链表
*								@b:data	新增的元素的值
*                 返回结果:	布尔型
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
*******************************************************************************/
bool LList_HeadInsert(LList_t *Head,DataType_t data)
{
	//1.创建新的结点,并对新结点进行初始化
	LList_t *New = LList_NewNode(data);
	if (NULL == New)
	{
		printf("不能加入新元素\n");
		return false;
	}

	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}

	//3.如果链表为非空,则把新结点插入到链表的头部
	New->next  = Head->next;
	Head->next = New;

	return true;
}

5.尾插

/*****************************************************************************
*                 函数名称:		LList_TailInsert
*                 函数功能:	向链表的尾部插入元素
*                 函数参数:	
*								@a:Head	操作的链表
*								@b:data	新增的元素的值
*                 返回结果:	布尔型
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
*******************************************************************************/
bool LList_TailInsert(LList_t *Head,DataType_t data)
{
	//1.创建新的结点,并对新结点进行初始化
	LList_t *New = LList_NewNode(data);
	LList_t *Pend = Head;
	if (NULL == New)
	{
		printf("不能加入新元素\n");
		return false;
	}

	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}
	//3.插入
	while(Pend->next)
	{
		//把头的直接后继作为新的头结点
		Pend = Pend->next;
	}

	Pend->next = New ;
	return true;
}

6.中间插入

/*****************************************************************************
*                 函数名称:		LList_DestInsert
*                 函数功能:	向链表的中间插入元素
*                 函数参数:	
*								@a:Head	操作的链表
*								@b:data	新增的元素的值
*                 返回结果:	布尔型
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
*******************************************************************************/
bool LList_DestInsert(LList_t *Head,DataType_t dest,DataType_t data)
{
	//1.创建新的结点,并对新结点进行初始化
	LList_t *New = LList_NewNode(data);
	LList_t *Phead = Head;				//记录前驱
	if (NULL == New)
	{
		printf("不能加入新元素\n");
		return false;
	}

	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}

	//3.遍历链表比较数值
	while( Phead->next )
	{
		Phead = Phead->next;
		if( Phead->data== dest ){
			New->next   = Phead->next;
			Phead->next = New;
			return true;
		}
		
	}
	return false;

}

7.头删

/*****************************************************************************
*                 函数名称:		HeadDel
*                 函数功能:	从链表的头部删除元素
*                 函数参数:	
*								@a:Head	操作的链表
*								@b:data	新增的元素的值
*                 返回结果:	布尔型
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
*******************************************************************************/
bool HeadDel(LList_t *Head)
{
	LList_t *Phead = Head->next;			//记录首结点
	//1.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		printf("链表为空,删除失败\n");
		return false;
	}
	//2.链表不为空
	 Head->next  = Phead->next;
	 Phead->next = NULL;
	//3.释放空间
	free(Phead);
	return true;
}

8.尾删

/*****************************************************************************
*                 函数名称:		EndDel
*                 函数功能:	从链表的尾部删除元素
*                 函数参数:	
*								@a:Head	操作的链表
*								@b:data	新增的元素的值
*                 返回结果:	布尔型
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
*******************************************************************************/
bool EndDel(LList_t *Head)
{
	LList_t *Prev = Head;				//记录前驱
	LList_t *Pend = Head->next;			//记录首结点
	//1.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		printf("链表为空,删除失败\n");
		return false;
	}
	//2.遍历
	while( Pend->next )
	{
		Prev = Prev->next;
		Pend = Pend->next;
	}

	//3.删除并释放
	Prev->next = NULL;
	free(Pend);
	return true;
}

9.中间删除

/*****************************************************************************
*                 函数名称:		InstallDel
*                 函数功能:	从链表的中间删除元素
*                 函数参数:	
*								@a:Head	操作的链表
*								@b:data	新增的元素的值
*                 返回结果:	布尔型
*                 注意事项:	NONE
*                 函数作者:	[email protected]
*                 创建日期:	2024/4/25
*                 修改历史:	2024/4/1.0
*                 函数版本:	1.0
*
*******************************************************************************/
bool InstallDel(LList_t *Head,DataType_t dest)
{
	LList_t *Prev = Head;				//记录前驱
	LList_t *Pend = Head->next;
	
	//1.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		printf("链表为空,删除失败\n");
		return false;
	}

	//2.遍历
	while( Pend->next )
	{

		Prev = Prev->next;
		Pend = Pend->next;
		if( Pend->data== dest ){
			Prev->next = Pend->next;
			Pend->next = NULL;
			free(Pend);
			return true;
		}
	}
	printf("链表里面没有该元素\n");
	return false;
}

标签:Head,return,linkedlist,结点,next,链表,LList
From: https://www.cnblogs.com/waibibabu-/p/18157250

相关文章

  • Java中LinkedList
    LinkedList的长度是可变的。LinkedList是Java中的一个双向链表实现,它可以动态地增加或减少元素,因此其长度是可变的。这种动态性使得LinkedList在需要频繁插入或删除元素时具有一定的优势,因为它不需要像数组那样进行元素的移动操作。当你向LinkedList中添加或删除元素时,它......
  • ArrayList的扩容机制以及ArrayList与LinkedList的区别
    ArrayList的扩容机制假设采用无参构造器来实列化ArrayList对象ArrayListarrayList=newArrayList();此时,arrayList的初始容量为零,当第一次调用add方法时,会触发扩容机制,容量扩容为10。此后,在调用add方法时,如果容量不足,则容量会扩容为当前容量的1.5倍。capcity=capacity......
  • LinkedList源码解析和设计思路
    一、继承体系LinkedList类位于java.util包中,它实现了List接口和Deque接口,LinkedList可以被当做链表、双端队列使用,并且继承自AbstractSequentialList类。在继承关系中,它的父类是AbstractSequentialList,而AbstractSequentialList又继承自AbstractList,AbstractList继承自Abs......
  • 数据结构之LinkedList底层代码全方位细节实现!
    题外话我很想发点nb的知识,但是路得一步一步走,饭也得一点一点吃,所以说不积跬步无以至千里,不积小流无以成江海!!!大家一起努力,未来属于我们!!正题理解链表相信大家看到这都应该明白链表,那就简单讲下链表组成今天实现LinkedList底层,LinkedList是一个双向链表,但是咱......
  • java集合框架——List集合概述及ArrayList,LinkedList的区别
    前言:List系列集合是Collection集合中两个系列的其中一个,整理下笔记。打好基础,daydayup!需要了解Collection的,可以看这篇java集合框架——Collection集合概述  List系列集合List系列集合的特点为添加的元素有序,可重复,有索引。在继承了Collection方法的基础上,有很多索引......
  • ArrayList和LinkedList底层原理的区别和使用场景
    (1)ArrayList底层是动态数组,查询快、增删慢。存储空间是连续的,可以根据寻址方式直接找到对应的元素位置,所以查询时间复杂度是o(1)。扩容:ArrayList支持动态扩容,在每次新增元素的时候会判断容量是否溢出,如果溢出则会进行扩容操作。当size=elementData.length时,表示数据数量已经超过......
  • Java ArrayList 与 LinkedList 的灵活选择
    JavaArrayListJavaArrayList类是一个可变大小的数组,位于java.util包中。创建ArrayListimportjava.util.ArrayList;ArrayList<String>cars=newArrayList<String>();//创建一个ArrayList对象添加元素cars.add("Volvo");cars.add("BMW");cars.add(......
  • LinkedList
    底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也很快。Node内部类,双向节点结构//双向链表的内部节点privatestaticclassNode<E>{Eitem;//现在索要存储的数据Node<E>next;//下一个节点的地址Node<E>prev;......
  • Java集合篇之深入解析LinkedList
    写在开头作为ArrayList的同门师兄弟,LinkedList的师门地位逊色不少,除了在做算法题的时候我们会用到它之外,在实际的开发工作中我们极少使用它,就连它的创造者都说:“Iwroteit,andIneveruseit”,想想颇有点好笑,但这并不影响我们去学习它,个人认为它底层的链表逻辑对于我们代码思想......
  • LinkedList(Deque)中添加/删除方法
    转:https://www.jianshu.com/p/ae28d514003c 1简介最近在使用LinkedList/Deque的时候,发现其中有很多类似的方法,我就想简简单单做个添加/删除的操作,发现竟然有那么多类似的方法,比如“添加”操作可以用的方法有:add/offer/push/offerFirst/offerLast,“删除”操作可以用......