首页 > 其他分享 >数据结构:双向链表的创建·插入·删除

数据结构:双向链表的创建·插入·删除

时间:2024-04-24 09:11:54浏览次数:23  
标签:current Head return DouLList next 链表 双向 New 数据结构

数据结构:双向链表的创建·插入·删除

/**
  * @file name : 数据结构:双向链表的创建·插入·删除
  * @brief     : 实现双向链表的创建·插入·删除
  * @author	   : [email protected]
  * @date 	   :2024/04/23
  * @version   :1.0
  * @note      :none
  * CopyRight(c):  2023-2024   [email protected]   All Right Reseverd
    */

  //定义节点的数据域类型
  typedef int data_type;
  //定义节点的类型并起别名
  typedef struct Double_LList{
  	data_type data;
  	struct Double_LList *next;//后驱的指针域
  	struct Double_LList *perv;//前驱的指针域
  }DouLList_t;
//创建一个空链表,其中只包含一个头节点
DouLList_t * DouLList_Create()
  {
  	DouLList_t *Head=(DouLList_t *)calloc(1,sizeof(	DouLList_t ));
  	//判断是否申请成功
​	if(NULL==Head)
	{
		perror("calloc memory for Head is failed");
		exit(-1);
	}
	//初始化前驱和后驱指针并返回头节点的地址
	Head->next=NULL;
	Head->prev=NULL;
	return Head;
  }
//创建一个新节点
DouLList_t * DouLList_Newnode_Create(data_type data)
{
	DouLList_t * New=(DouLList_t *)calloc(1,sizeof(DouLList_t ));//为新节点申请一块内存
	//判断内存是否申请成功
	if(NULL==New)
	{
		perror("calloc memory for New is failed");
		return NULL;
	}
	//初始化前驱和后驱指针并返回头节点的地址
	New->next=NULL;
	New->prev=NULL;
	New->data=data;
	return New;
}
//判断是否为空链表
bool DouLList_Isful(DouLList_t *Head)
{
	if(Head->next==NULL)
	{
		return ture;
	}
	return false;
}
//从头部插入一个节点
bool DouLList_HeadAdd(DouLList_t *Head,DouLList_t *New)
{
	
	if(New==NULL)
	{
		return false;
	}
	//如果链表为空
	if(DouLList_Isful(DouLList_t *Head))
	{
		Head->next=New;
		return ture;
	}
	
	//链表不为空
	New->next=Head->next;
	Head->next->prev=New;
	Head->next=New;
	return ture;
}

//从尾部插入一个节点
bool DouLList_TailAdd(DouLList_t *Head,DouLList_t *New)
{
	DouLList_t * current=Head->next;
	if(New==NULL)
	{
		return false;
	}
	//如果链表为空
	if(DouLList_Isful(DouLList_t *Head))
	{
		Head->next=New;
		return ture;
	}
	//链表不为空,先遍历到最后一个节点
	while(current)
	{
		if(NULL==current->next)
		{
			brake;
		}
		current=current->next;
	}
	current->next=New;
	New->prev=current;
	return ture;
}
//从中间插入一个节点
bool DouLList_MidAdd(DouLList_t *Head,DouLList_t *New,DouLList_t *Dest)
{
	DouLList_t * current=Head->next;
	if(New==NULL)
	{
		return false;
	}
	//如果链表为空
	if(DouLList_Isful(DouLList_t *Head))
	{
		Head->next=New;
		return ture;
	}
	//链表不为空,遍历到最后目标节点
	while(current)
	{
		if(Dest—>data==current->data)
		{
			brake;//找到了就跳出循环
		}
		current=current->next;
	}
	New->next=current->next;
	current->prev=New;
	New->prev=current;
	current->next=New;
	return ture;
}
//从头部删除节点
bool DouLList_HeadDel(DouLList_t *Head)
{
	DouLList_t *phead=Head->next;//记录首节点地址
	//如果链表为空
	if(DouLList_Isful(DouLList_t *Head))
	{
		return false;
	}
	//链表不为空
	Head->next=Head->next->next;
	phead->next=NULL;
	phead->next->prev=NULL;
	free(phead);//释放内存
	return ture;	
}
//从尾部删除节点
bool DouLList_TailDel(DouLList_t *Head)
{
	DouLList_t *current=Head->next;//记录当前节点地址
	//如果链表为空
	if(DouLList_Isful(DouLList_t *Head))
	{
		return false;
	}
	//链表不为空,遍历找到尾部节点
	while(current)
	{
		if(current->next==NULL)
		{
			brake;//找到了就跳出循环
		}
		current=current->next;
	}
	current->prev->next=NULL;
	current->prev=NULL;
	free(current);//释放被删除的节点内存
	return ture;	
}
//从中间删除节点
bool DouLList_MidDel(DouLList_t *Head,DouLList_t *Dest)//接收要删除的目标节点
{
	DouLList_t *current=Head->next;//记录当前节点地址
	//如果链表为空
	if(DouLList_Isful(DouLList_t *Head))
	{
		return false;
	}
	//链表不为空,遍历找到目标节点
	while(current)
	{
		if(current->data==Dest->data)
		{
			brake;找到了就跳出循环
		}
		current=current->next;
	}
	current->prev->next=current->next;
	current->next->prev=current->prev;
	current->prev=NULL;
	current->next=NULL;
	free(current);//释放被删除的节点内存
	return ture;	
}



  

标签:current,Head,return,DouLList,next,链表,双向,New,数据结构
From: https://www.cnblogs.com/liuliuye/p/18154318

相关文章

  • 双向链表(不循环)
    双向链表双向链表的原理与应用如果想要提高单向链表或者单向循环链表的访问速度,则可以在链表中的结点中再添加一个指针域,让新添加的指针域指向当前结点的直接前驱的地址,也就意味着一个结点中有两个指针域(prev+next),也被称为双向链表(DoubleLinkedList)。单向循环链表实现分析......
  • 双向不循环链表
    双向不循环链表/***********************************************************************************************************设计双向链表的接口****Copyright(c)[email protected]*******************************......
  • 单项链表的一些基础操作
    /***********************************************filename:LinkList.c*author:[email protected]:2024/4/2function:设计顺序表note:NoneCopyRight(c)2023-2024邮箱AllRightReseverd///指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改type......
  • 单项循环链表的一些基本操作
    //设计单向循环列表/***********************************************filename:circularlinkedlist.c*author:[email protected]*date:2024/4/23*function:设计单向循环列表*note:None*CopyRight(c)2023-2024邮箱AllRightReseverd**************************......
  • 双向循环链表的一些基础操作
    /***********************************************filename:DoubleList.c*function:设计双向链表*author:[email protected]*date:2024/4/23*note:None*CopyRight(c)2023-2024邮箱AllRightReseverd***********************************************///指的是......
  • 数据结构笔试题——基于C语言的链表功能函数实现
    题目1题目要求如下:/***@functionname:LList_CntdmFind*@brief查找链表中,倒数第k个位置上的节点*@param:​ @Head:链表头节点​ @k :倒数第k个位置*@retval:int型返回值;返回-1时即为失败,返回0时表示成功;*@date:2024/04/23*@version1.0*@n......
  • 数据结构基础第3讲
    数据结构基础第3讲栈及其应用内容考点一:栈的概念1.顺序栈的定义:出栈顺序情况计算给定n个元素,出栈顺序的情形满足卡特兰数,计算公式:\[\frac{C_{2n}^{n}}{n+1}\]例题:确定第一个出栈的谁。有两种可能:找带头大哥。栈的顺序存储结构顺序栈操作顺序栈4要素栈空......
  • 数据结构基础第4讲
    数据结构基础第4讲队列内容考点一:队列概念代码不考1.队列的定义考点二:顺序队列的定义考点三顺序队列的性质与操作4要素:考点四:循环队列的定义由于顺序队列会存在假溢出问题,引入循环队列。假溢出:描述:考点五:循环队列的操作判断空满:性质:考频75%元素个......
  • 数据结构基础第6讲
    数据结构基础第6讲图及其应用1-2个选择考点一:图的基本概念1.图基本概念连通图:极大连通子图-连通分量:极小连通子图-生成树:强连通顶点给定n个顶点,要保证图在任何情况下连通需要最小边数:1.生成树,边(n-1)2.完全无向图\(\frac{(n-1)\timesn}{2}\)3.\(\left......
  • 数据结构基础第5讲
    数据结构基础第5讲树和二叉树本章内容:考点一:基本术语1.数的引入2.树的定义层次,分支,一对多。互不相交的含义:3.结点的分类结点的度:4.结点的关系树的深度:树中结点最大高度称为树的高度(或树的深度)行兄弟结点:在同一层但不是兄弟的结点路径长度:等于路径......