首页 > 其他分享 >双向链表实现

双向链表实现

时间:2024-05-06 22:45:17浏览次数:17  
标签:结点 Head 实现 DoubleLList next 链表 Phead 双向 New

/********************************************************************************************************
*
*	file name:	Zqh_链表.c
* 	author	 :	[email protected]
* 	date	 :	2024/05/05
*	function :	链表的增删改查
*	note	 :	模板
*	
*  Copyright (c)  2023-2025   [email protected]    All right Reserved
* ******************************************************************************************************/


//指的是双向链表中的结点有效数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造双向链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct DoubleLinkedList
{
	DataType_t  		     data; //结点的数据域
	struct DoubleLinkedList	*prev; //直接前驱的指针域
	struct DoubleLinkedList	*next; //直接后继的指针域

}DoubleLList_t;


//创建一个空双向链表,空链表应该有一个头结点,对链表进行初始化
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;
}


//创建新的结点,并对新结点进行初始化(数据域 + 指针域)

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;
}

//头插
bool DoubleLList_HeadInsert(DoubleLList_t*Head, DataType_t data)
{
	//创建一个变量来保存头结点
	DoubleLList_t* Phead = Head->next;
	//1.创建新的结点,并对新结点进行初始化
	DoubleLList_t* New = DoubleLList_NewNode(data);
	if (NULL == New){
		printf("can not insert new node\n");
		return false;
	}

	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next){
		New->next = Head->next;		//将首结点的地址给新结点的next指针
		Head->next->prev= New;
		Head->next = New;
		return false;
	}

	New->next = Phead;
	Phead->prev=New;
	Head->next = New;
	return false;
}

//删除目标结点
bool DoubleLList_DestInsert(DoubleLList_t*Head,DataType_t dest,DataType_t data)
{
	DoubleLList_t* Phead = Head->next;
	if (NULL == Head->next){
		printf("双向链表为空,无法删除");
		return false;
	}
	
	//循环查找需要删除的目标
	while(Phead->data != dest){
		if (NULL == Phead->next){
			printf("只有一个首结点\n");
			free(Phead);
			return true;
		}

		Phead = Phead->next;

	}

	Phead->next->prev = Phead->prev;
	Phead->prev->next = Phead->next;
	Phead->prev = NULL;
	Phead->next = NULL;
	free(Phead);
	return true;
}



int main(int argc, char const *argv[])
{
	
	return 0;
}

标签:结点,Head,实现,DoubleLList,next,链表,Phead,双向,New
From: https://www.cnblogs.com/kencszqh/p/18176116

相关文章

  • 单向循环链表的实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 顺序表的实现
    /********************************************************************************************************** filename: Zqh_顺序表.c* author : [email protected]* date : 2024/05/05* function: 顺序表的增删改查* note : 模板* *Copyright(c)2023......
  • HarmonyOS 实现下拉刷新,上拉加载更多
    组件介绍PullToRefreshList允许用户通过下拉动作来刷新列表内容,以及通过上拉动作来加载更多的数据。组件内部封装了滚动监听、状态管理和动画效果,使得开发者可以轻松集成到自己的项目中。1.实现思路封装成可复用的公共控件:将下拉刷新和上拉加载更多功能封装为一个可复用的组......
  • 在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理
    在缺少标注数据场景,SetFit是解决的建模问题的一个有前途的解决方案,其由HuggingFace与Intel实验室以及UKPLab合作共同开发。作为一个高效的框架,SetFit可用于对SentenceTransformers模型进行少样本微调。SetFit仅需很少的标注数据就能达到较高的准确率,例如,在使用3-......
  • 单链表逆序
    逆序原理:保留头节点下一个结点地址,将头节点断开,遍历除头节点以外的节点,将那些节点头插入头节点中。就能实习逆序。/********************************************************************* filename: demo2.c* author :lzj* date :2024/04/23* function:单向链......
  • docker-compose+nginx实现服务不中断更新
    思路是写一个脚本,docker-composescale扩容,然后重写nginx配置文件,刷新负载均衡nginx重写的配置文件,文件名service,里面只有upstream,例如:upstreame-chatbot-server-dev{server0.0.0.0:8080;server0.0.0.0:8081;}脚本使用方法:./rollupdate.sh--service=test-serve......
  • 以数组为基础实现循环队列
    /*****************************************************************name;CirQueue_Create*function:创建循环队列*parameter;unsighedintsize*ReValue;CirQueue_t**author;小北blog*attention;*date;2024.04.26*history;*version;*Copyright(c)......
  • WPF上位机 - 实现TIA Wincc中的输入输出域
    在TIAWincc中输入输出域可以显示PLC中的变量,同时可以改变PLC中的变量,而在上位机中,使用多线程实时读取数据,在输入数据的时候可能PLC数据改变使得上位机数据同时改变。所以需要在文本框获取到焦点的时候断开绑定,失去焦点的时候重新绑定数据。//view代码<TextB......
  • easyExcel多行表头设定不同样式和特定单元格设定样式的实现
    前言有个需求,需要设置Excel导出的样式,样式如下图所示,有三个表头行,第一个表头行需要加粗和灰色背景,另外两个表头行使用另外的样式,并且当测试结果单元格出现x或者未通过的时候,设置其为红色字体。实现步骤写入ExcelSheet的部分代码for(Map.Entry<String,List<ExcelDTO>>entr......
  • 二叉树进阶:二叉搜索树、平衡二叉树、KD树(实现KNN算法的快速寻找k个邻居)
    二叉搜索树二叉搜索树又称为二叉排序树、二叉查找树。请记住,本篇所介绍的所有树,都是二叉搜索树,也就是说都用到了二分查找的思想。二叉搜索树的特征:每个结点的左结点都小于结点本身,右结点都大于结点本身。用中序遍历来遍历一棵二叉搜索树,结果必然是有序的。时间复杂度很低......