双向链表,添加,删除一个节点

news2024/12/24 7:54:19

文章目录

  • 前言
  • 一、创建双向链表(重命名)
  • 二、添加一个节点
        • 1.添加头指针:
        • 2.若 头指针为空
        • 3.若头指针非空
  • 三、删除一个节点
        • 1.找到某节点
        • 2.将节点从链表中删除
  • 四. 展示所有的节点
  • 五. 实验效果
  • 总结


前言

链表有几种,大致分为:单链表, 双向链表,循环链表,静态链表。这里为大家简单介绍双向链表节点的添加,删除。


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建双向链表(重命名)

双向链表,即有两个指针,pre 和 next。 其中 pre 可指向当前节点的前一个节点, next 指向当前节点的下一个节点。
将该结构体重命名为 T_Name, PT_Name 便于定义结果体变量。

typedef struct NAME{
	char *name;
	struct NAME *pre;
	struct NAME *next;
}T_Name, *PT_Name;

二、添加一个节点

1.添加头指针:

static PT_Name g_ptNameHead;

2.若 头指针为空

ptNew 的 next 要赋值为NULL, 避免其成为野指针。

	PT_Name ptNew
	if(!g_ptNameHead)
	{
		g_ptNameHead = ptNew;
		ptNew->next = NULL;
	}

3.若头指针非空

定义一个临时指针 ptTemp通过判断 ptTemp->next 来确定是否为结尾的指针,若确定 ptTemp 为结尾节点,就可以在其后添加新节点 ptNew。

ptTemp->next = ptNew; 其中 ptTemp 下一个节点为 ptNew, 且 ptNew 的pre指针,指向 ptTemp 。

		PT_Name ptTemp;

		ptTemp = g_ptNameHead;
		while(ptTemp->next)
		{
			ptTemp = ptTemp->next;
		}
		ptTemp->next = ptNew;
		ptNew->pre   = ptTemp;

具体代码如下:

void add_name(PT_Name ptNew)
{
	PT_Name ptTemp;
	if(!g_ptNameHead)
	{
		g_ptNameHead = ptNew;
		ptNew->next = NULL;
	}
	else
	{
		ptTemp = g_ptNameHead;
		while(ptTemp->next)
		{
			ptTemp = ptTemp->next;
		}
		ptTemp->next = ptNew;
		ptNew->pre   = ptTemp;
	}
}

void add_one_name(void)
{
	PT_Name ptNew;
	char *str;
	char name[128];
	printf("enter the name:");
	scanf("%s", name);
	str = malloc(strlen(name) + 1);
	strcpy(str, name);
	
	ptNew = malloc(sizeof(T_Name));
	ptNew->name = str;
	ptNew->next = NULL;
	ptNew->pre  = NULL;
	
	add_name(ptNew);
}

三、删除一个节点

要删除某个节点,首先我们要通过名字找到这个节点,再将其删除

1.找到某节点

若头指针为空,说明不存在节点,就直接返回。
否则 通过 strcmp 函数比较节点的名字,逐个寻找。若名字匹配,则将其节点返回。否则 ptTemp = ptTemp->next; 直到节点为空。

PT_Name get_name(char *name)
{
	PT_Name ptTemp;
	if(!g_ptNameHead)
	{
		return NULL;
	}
	else
	{
		ptTemp = g_ptNameHead;
		while(ptTemp)
		{
			if(0 == strcmp(name, ptTemp->name))
			{
				return ptTemp;
			}
			else
			{
				ptTemp = ptTemp->next;
			}
		}
	}
	return NULL;
}

2.将节点从链表中删除

要将一个中间节点删除。例如: 要删除的节点为 ptDel , 前一个节点为 ptPre, 后一个节点为 ptNext.
(1). ptPre 的 next 指针要指向 ptDel 的 next 。
(2). ptNext 的 pre 指针要指向 ptPre 。
(3),free(ptDel->name); free(ptDel);

在这里插入图片描述

void del_name(PT_Name ptDel)
{
	PT_Name ptCur;	
	PT_Name ptPre;	
	PT_Name ptNext;	
	
	if (g_ptNameHead == ptDel)
	{
		g_ptNameHead = ptDel->next;
		/* 释放 */
		return;
	}
	else
	{
		ptCur = g_ptNameHead->next;
		while (ptCur)
		{
			if (ptCur == ptDel)
			{
				/* 从链表中删除 */
				ptPre  = ptCur->pre;
				ptNext = ptCur->next;
				ptPre->next = ptNext;
				if (ptNext)
				{
					ptNext->pre = ptPre;
				}
				break;
			}
			else
			{
				ptCur = ptCur->next;
			}
		}
	}
	free(ptDel->name);
	free(ptDel);
}

四. 展示所有的节点

当 ptTemp 为空时,就以结束。

void list_all_name(void)
{
	PT_Name ptTemp = g_ptNameHead;
	int i=0;
	while(ptTemp)
	{
		printf("%02d : %s\n", i++, ptTemp->name);
		ptTemp = ptTemp->next;
	}
}

五. 实验效果

在这里插入图片描述


总结

双向指针并不难,大家要多加理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序之会议OA项目--其他界面

目录一、tabs组件及会议管理布局1、tabs.js2、tabs.wxml3、tabs.wxss4、app.wxss5、list.js6、list.json7、list.wxml二、个人中心布局1、ucenter/index/index.js2、ucenter/index/index.wxml3、ucenter/index/index.wxss一、tabs组件及会议管理布局 1、tabs.js // component…

UDS - 15.2 RequestDownload (34) service

15.2 请求下载(34)服务 来自:ISO 14229-1-2020.pdf 15.2.1 服务描述 客户机使用requestDownload服务发起从客户机到服务器的数据传输(下载)。 在服务器接收到requestDownload请求消息之后,服务器应该在发送积极响应消息之前采取所有必要的操作来接收数据…

常用图像像素格式 NV12、NV2、I420、YV12、YUYV

文章目录目的RGBYUVYCrCb采样格式YUV 4:4:4 采样YUV 4:2:2 采样YUV 4:2:0 采样YUV 存储格式YUV422:YUYV、YVYU、UYVY、VYUYYUV420:I420、YV12、NV12,、NV21扩展目的 了解常用图像像素格式 RGB 和 YUV,像素格式描述了像素数据存储所用的格式,…

Spring MVC框架学习

前言:本篇博客将从三个方面来写我们要学习SpringMVC的什么: 连接:当用户在游览器中输入一个url之后,能将这个url请求映射到自己写的程序,也就是访问一个地址时,能够连接到门自己写的服务器. 获取参数:用户访问时如果带一些参数,我该怎样获取.返回数据:执行业务代码之后…

NVM实现一台电脑对node的多版本管理。

一、NVM:Node Version Management; 下载地址:Releases coreybutler/nvm-windows GitHubA node.js version management utility for Windows. Ironically written in Go. - Releases coreybutler/nvm-windowshttps://github.com/coreybutl…

JavaScript寒假系统学习之数组(一)

JavaScript寒假系统学习之数组(一)一、数组1.1 什么是数组1.2 数组创建的2种方式1.2.1 利用new创建数组1.2.2 利用数组字面量创建数组1.3 访问数组元素1.4 遍历数组1.5 数组实战训练1.5.1 计算数组的和以及平均值1.5.2 求数组中的最大值1.5.3 数组转化为…

使用Qemu在Windows上模拟arm平台并安装debian10 arm系统(cd镜像) 安装记录

参考:使用Qemu在Windows上模拟arm平台并安装国产化操作系统_viyon_blog的博客-CSDN博客_qemu windows 镜像:debian-10.12.0-arm64-xfce-CD-1.iso 环境:qemu虚拟机,宿主机win10,amd64 QEMU_EFI.fd: (298条消息) qemu虚拟机的bi…

N皇后问题-leetcode51-java回溯解+详细优化过程

说明:问题描述来源leetcode 一、问题描述: 51. N 皇后 难度困难1592 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之…

实验八、直接耦合多级放大电路的调试

一、题目 两级直接耦合放大电路的调试。 二、仿真电路 图1(a)所示电路为两级直接耦合放大电路,第一级为双端输入、单端输出差分放大电路,第二级为共射放大电路。 由于在分立元件中很难找到在任何温度下均具有完全相同特性的两只晶体管,因而…

Active Directory 基础 —— 如何理解group的类型

因为创建一个跨域的组,重新温习了一下最基本的AD知识,所谓温故而知新,把温习的结果整理了一下。AD里面的group类型从范围来说分为global, universal 和 local domain, 从类型来分分为security和distribution。后面的类型理解很容易,security就是纯粹用来权限访问的,而dist…

Java实现FIFO、LRU、LFU、OPT四页面置换算法

题目要求 采用多道程序思想设计一个程序,模拟页存储管理地址变换的过程,可采用FIFO、LRU、LFU、OPT四页面置换算法。基本要求如下: 需要建立访问页表线程、访问快表线程、缺页中断处理线程、访问内存线程等,协同这些线程模拟完成…

JDK17升级之路:JCE cannot authenticate the provider BC问题

问题的产生 报错代码运行环境 JDK:Oracle JDK17 CentOS7.8 这个问题刚拿到比较棘手。原因是本地windows是OK的,centos上是不成功的,报了下面的错误: Caused by: java.lang.SecurityException: JCE cannot authenticate the provi…

论文阅读 DeepGCNs: Can GCNs Go as Deep as CNNs?

DeepGCNs: Can GCNs Go as Deep as CNNs?绪论1、介绍2、相关工作3、方法3.1、图神经网络的表针学习3.2、图神经网络的残差结构3.3、图神经网络的密集连接3.4、图神经网络的扩张性聚集绪论 CNN很强,但不能正确解决非欧几里得数据的问题,图卷积网络&…

YOLO-V5 系列算法和代码解析(五)—— 损失函数

文章目录基本简介调试准备损失函数基本简介 损失函数是神经网络的重要组成部分,用于评估网络的预测值和真实值的差异度。根据偏差的大小,反向调整网络的训练参数,迭代优化使得损失尽量小,也就得到最优的网络参数。 调试准备 debu…

Go-学生教务管理系统【无界面 / 离线版】(一)

【Go】学生教务管理系统(无界面 / 离线版)(一)Ⅰ. 程序说明一、博客日期二、引言Ⅱ. 版权声明Ⅲ. 开发环境一、开发配置二、开发工具Ⅳ. 效果演示一、工程结构(一)目录结构(二)目录说…

【Ctfer训练计划】——(六)

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

Springboot启动之自定义run方法

前言 之前分析的Springboot启动过程的源码分析中给自己留了一个扩展作业:执行自定义的run方法,此方法在B.7、调用运行器简单分析过,今天咱们就自定义一个Run方法试试。 一、实现自定义的run方法 由于java中的接口可以多实现,所以…

IOS----TangramKit 布局框架

文章目录系统结构CocoaPods安装举例下面一个应用场景:布局线性布局TGLinearLayout相对布局TGRelativeLayout框架布局TGFrameLayout表格布局TGTableLayout流式布局TGFlowLayout浮动布局TGFloatLayout路径布局MyPathLayoutgithub: https://github.com/youngsoft/TangramKit/blob…

day32【代码随想录】回溯之N皇后、N皇后||、解数独、有效的数独

文章目录前言一、N皇后(力扣51)二、N皇后||(力扣52)三、解数独(力扣37)四、有效的数独(力扣36)前言 1、N皇后、 2、N皇后||、 3、解数独、 4、有效的数独 一、N皇后(力扣…

材料表征仪器:慢正电子束谱仪最全知识讲解

1 引言 21世纪科学的发展将是微观与宏观的相互渗透与密切结合。凝聚态物理、材料科学等的研究,将由现在的宏观统计方法(包括宏观量子统计)深入发展到物质的原子层次物性研究,微观粒子(颗粒、孔隙)的量子效…