首页 > 其他分享 >Doublelist

Doublelist

时间:2024-04-27 15:01:18浏览次数:16  
标签:Head DoubleLList next 链表 Phead New Doublelist

双向链表

1.创建并初始化链表
/*****************************************************************************
*                 函数名称:		 DoubleLList_Create
*                 函数功能:		创建空链表并完成初始化	
*                 函数参数:		NONE
*                 返回结果:		指向头节点的指针
*                 注意事项:		NONE
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/
//创建一个空双向链表,空链表应该有一个头结点,对链表进行初始化
DoubleLList_t * DoubleLList_Create(void)
{
	//1.创建一个头结点并对头结点申请内存
	DoubleLList_t *Head = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
	if (NULL == Head)
	{
		perror("Calloc memory for Head is Failed");
		exit(-1);
	}

	//2.对头结点进行初始化,头结点是不存储数据域,指针域指向NULL
	Head->prev = NULL;
	Head->next = NULL;

	//3.把头结点的地址返回即可
	return Head;
}
2.创建新元素并初始化

/*****************************************************************************
*                 函数名称:		DoubleLList_NewNode
*                 函数功能:		新建元素
*                 函数参数:
*						@data	新建元素的值
*                 返回结果:		指向新结点的地址
*                 注意事项:		NONE
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/
//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
DoubleLList_t * DoubleLList_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	DoubleLList_t *New = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

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

	return New;
}

3.遍历链表

/*****************************************************************************
*                 函数名称:		ShowDoubList
*                 函数功能:		遍历链表	
*                 函数参数:
*						@Head 头节点地址
*                 返回结果:		布尔型
*                 注意事项:		NONE
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/
//遍历
bool ShowDoubList(DoubleLList_t *Head)
{
	DoubleLList_t *Phead = Head;
	//判断链表是否为空
	if(	NULL == Head->next){
		printf("该链表为空\n");
		return false;
	}
	//链表不为空
	//首结点
	while(Phead->next){

		//把头的直接后继作为新的头结点	
		Phead = Phead->next;
		//输出头结点的直接后继的数据域
		printf("data = %d\n",Phead->data);
	}

}
4.头部插入元素

/*****************************************************************************
*                 函数名称:		 HeadAdd
*                 函数功能:		头部插入元素	
*                 函数参数:
						@Head	操作元素
						@data	输入的元素的值
*                 返回结果:		布尔型
*                 注意事项:		NONE
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/


//头插
bool HeadAdd(DoubleLList_t *Head,DataType_t data)
{
	DoubleLList_t *New = DoubleLList_NewNode( data);

	//对New进行错误判断
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	//判断链表是否为空
	if(	NULL == Head->next){
		Head->next = New;
		return true;
	}

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

5.尾部插入元素

/*****************************************************************************
*                 函数名称:		 EndAdd
*                 函数功能:		尾部插入元素
*                 函数参数:		
*						@Head	操作的链表
*						@data	插入的数值
*                 返回结果:		布尔型
*                 注意事项:		NONE
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/
//尾插
bool EndAdd(DoubleLList_t *Head,DataType_t data)
{
	DoubleLList_t *New = DoubleLList_NewNode( data);
	DoubleLList_t *Phead = Head;
	//1.对New进行错误判断
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	//2.判断链表是否为空
	if(	NULL == Head->next){
		Head->next = New;
		return true;
	}

	//3.如果链表为非空,则把新结点插入到链表的尾部

	//遍历链表
	while(Phead->next){

		//把头的直接后继作为新的头结点	
	
		Phead = Phead->next;
	}

	//插入
	Phead->next = New;
	New->prev   = Phead;
	return true;

}
6.中间插入


/*****************************************************************************
*                 函数名称:		 InstallAdd
*                 函数功能:		向链表的某个元素后面插入一个元素
*                 函数参数:
*						@Head	操作的链表
*						@dets	插入在哪一个元素的后面
*						@data
*                 返回结果:		布尔型
*                 注意事项:		NONE
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/

//中间插入
bool InstallAdd(DoubleLList_t *Head,DataType_t dets,DataType_t data)
{

	DoubleLList_t *New = DoubleLList_NewNode( data);
	DoubleLList_t *Phead = Head;
	//1.对New进行错误判断
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	//2.判断链表是否为空
	if(	NULL == Head->next){
		Head->next = New;
		return true;
	}

	//3.遍历链表
	while(Phead->next){
		
		//把头的直接后继作为新的头结点	
		Phead = Phead->next;
		  if(Phead->data == dets && Phead->next != NULL){

			New->next = Phead->next;
			Phead->next->prev = New;
			New->prev = Phead;
			Phead->next = New;
			return true;
			}  
	}
	//刚好到最后一个
	if(Phead->data == dets){
		Phead->next = New;
		New->prev = Phead;
		return true;
	}
	else{
	printf("链表插入失败\n");
	return false;
	}
}
7.尾部删除

/*****************************************************************************
*                 函数名称:		 EndDel
*                 函数功能:		在函数的尾部删除元素	
*                 函数参数:		
*						@Head 操作的链表
*                 返回结果:		布尔型
*                 注意事项:		NONE 
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/

//尾删
bool EndDel(DoubleLList_t *Head)
{
	DoubleLList_t *Pend = Head->next;				//用来记录尾结点的地址
	//1.判断链表是否为空
	if(	NULL == Head->next){
		printf("链表为空,删除失败\n");
		return false;
	}
	//2.遍历链表
	while(Pend->next){
		Pend = Pend->next;	
	}

	//3.删除
	Pend->prev->next = NULL;
	Pend->prev = NULL;
	free(Pend);
	return true;
}

8.中间删除
/*****************************************************************************
*                 函数名称:		 InstallDel
*                 函数功能:		删除链表中某一个元素	
*                 函数参数:		
*						@Head 操作的链表
*						@data 删除的元素的值
*                 返回结果:
*                 注意事项:
*                 函数作者:		[email protected] 
*                 创建日期:		2024.4.27
*                 修改历史:		2024/4
*                 函数版本:		1.0
*
*****************************************************************************/

bool InstallDel(DoubleLList_t *Head,DataType_t data)
{
	DoubleLList_t *Phead = Head->next;				//用来记录尾结点的地址
	//1.判断链表是否为空
	if(	NULL == Head->next){
		printf("链表为空,删除失败\n");
		return false;
	}
	//2.刚好是第一个元素
	if(Phead->data == data){
		
		Head->next		   = Phead->next;
		Phead->next->prev  = NULL;
		Phead->next 	   = NULL;
		free(Phead);
		return true;
	}
	//2.遍历链表
	while(Phead->next){
		
		//把头的直接后继作为新的头结点	
		Phead = Phead->next;
		  if(Phead->data == data && Phead->next != NULL){
			
			Phead->prev->next = Phead->next;
			Phead->next->prev = Phead->prev;
			Phead->next 		 = NULL;
			Phead->prev 		 = NULL;
			return true;
			}  
	}
	//3.刚好是最后一个
	if(Phead->data == data){

		Phead->prev->next 	= NULL;
		Phead->prev 		= NULL;
		free(Phead);
		return true;
	}
	else
	{
		printf("链表中没有该元素,删除失败\n");
		return false;
	}
}

文件下载链接

标签:Head,DoubleLList,next,链表,Phead,New,Doublelist
From: https://www.cnblogs.com/waibibabu-/p/18162066

相关文章

  • doublelist_add
    双向链表的插入操作的相关操作1.头部插入/******************************************************************************函数名称: HeadAdd*函数功能:双向链表的头部插入*函数参数:*@a:*He......