链表——C语言——day17

news2024/12/22 12:01:22

链表

链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。在用数组存放数据时,必须事先定义固定的长度(即元素个数)。链表则没有这种缺点,它根据需要开辟内存单元。
在这里插入图片描述
链表有一个“头指针“变量,图中以 head 表示,它存放一个地址,该地址指向一个元素。链表中每一个元素称为"结点",每个结点都应包括两个部分:用户需要用的实际数据和下一个结点的地址,也称为数据域和指针域。可以看出,head 指向第一个元素;第一个元素又指向第二个元素……直到最后一个元素,该元素不再指向其他元素,它称为”表尾”,它的地址部分放一个"NULL"( 表示"空地址"),链表到此结束。

链表中各元素在内存中可以不是连续存放的。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素。如果不提供“头指针”(head),则整个链表都无法访问。

我们可以这样设计结构体类型:

struct student 
{	int num; 
	float score;
	struct student * next;
};

其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),相当于上图结点中的 A,B,C,D。next 是指针类型的成员,它指向 struct student 类型数据(这就是next 所在的结构体类型)。一个指针类型的成员既可以指向其他类型的结构体数据,也可以指向自己所在的结构体类型的数据。现在,next是struct student 类型中的一个成员,它又指向struct student 类型的数据。用这种方法就可以建立链表。
在这里插入图片描述

建立链表

首先,链表分为有头链表和无头链表

在这里插入图片描述

在本文章中,我们主要研究“有头单向链表”

空链表 ——代表头节点的next指针指NULL

void initList(struct Node *pHead)
{
	pHead->next = NULL;
}

链表的插入

在这里插入图片描述

头插法

step1:首先是创建新节点
struct Node *pNew = malloc (sizeof(struct Node));
pNew->data = 100;
step2:将新节点插入链表
struct Node *pNew= malloc(sizeof(stiuct Node));
pNew->data= 100;
(1).pNew->next = pHead->next;
(2).pHead->next = pNew;
在这里插入图片描述

我们可以将头插法函数写成这样:
void pushFront(struct Node *pHead,int n)
{
	struct Node *pNew = malloc (sizeof(struct Node));  // 在堆上创建空间
	pNew->data= n;  //输入新节点的数据
	pNew->next = pHead->next;	//将头节点的指针域上的地址赋值给新节点指针域
	pHead->next = pNew;	//头节点的指针域上的地址指向新节点
}
尾插法

step1:首先是创建新节点
step2:定位到尾节点

定位到尾节点:
while(p->next != NULL)
{
p = p->next;
}

step3:将新节点插入链表
在这里插入图片描述
但是,我们需要考虑如果链表本身是个空链表,怎么尾插?并且还需要判断链表是否为空?
所以,我们将尾插法可以写成这样:

int isEmpty(struct Node *pHead) //判断链表是否为空链表
{
	return pHead->next == NULL;
}

void pushBack(struct Node *pHead, int n)
{
	if(isEmpty(pHead))
	{
		pushFront(pHead, n);	//空的话直接使用头插法
	}
	else
	{
		struct Node *pNew= mallcc(sizeof(struct Node));
		pNew->data=n;
		struct Node *p = pHead->next;
		while(p->next)
		{
			p = p->next;
		}
		p->next = pNew;
		pNew->next = NULL;
	}
}
链表遍历

在这里插入图片描述
只要p不为NULL,直接输出数据即可。

void printList(struct Node *pHead)
{
	struct Node *p;
	p =pHead->next;
	while(p != NULL)
	{
		printf("&d\n", p->data);
		p = p->next;
	}
}
计算链表中有效节点的个数
size_t length(struct Node *pHead)
{
	size_t ret =0;
	struct Node *p= pHead->next;
	while(p)
	{
		++ret;
		p = p->next;
	}
	return ret;
}
头删法

在删除的时候,我们首先要确定链表是否为空,若链表为空,则不能删除。
在这里插入图片描述
首先,头节点的地址域指针指向p->next的地址,随后释放p即可。

void popFront(struct Node *pHead)
{
	if(!isEmpty(pHead))
	{
		struct Node *p= pHead->next;
		pHead->next = p->next;
		free(p);
	}
}
尾删法

在这里插入图片描述
我们首先要判断链表是否为空,为空的话直接结束,随后判断链表中是否至少有两个以上的有效节点,如果只有一个节点,直接转到头删法即可。

void popBack(struct Node *pHead)
{
	if(!isEmpty(pHead))	//判断是否为空链表
	{
		if(length(pHead)== 1) 	//判断有几个节点
		{
			popFront(pHead);
		}
		else
		{
			struct Node *p= pHead->next;
			while(p->next->next != NULL)
			{
				p = p->next;
			}
			free(p->next);
			p->next = NULL;
		}
	}
}
链表销毁
void destroyList(struct Node *pHead)
{
	while(!isEmpty(pHead))
	{
		popBack(pHead);popFront(pHead);
	}
}

以上就是链表的常见操作。

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

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

相关文章

电脑怎么录屏?打造专业级视频内容!

随着科技的进步,电脑已经深入到我们的日常生活和工作中。而在这个数字时代,录制屏幕内容变得日益重要。无论是制作教程、分享游戏技巧,还是记录重要的演示,录屏都是一个不可或缺的功能。可是电脑怎么录屏呢?本文将深入…

ESU毅速丨3D打印随形水路在模具制造中应用越来越多

在模具制造领域,冷却水路的设计和制造至关重要,它直接影响到产品的质量和生产效率。3D打印随形水路在设计和制造上相比传统模具水路有哪些优势,为什么越来越受到企业追捧? 传统模具水路通常是直线或规则形状的通道,设计…

高宇辰:打造“π”型人才 | 提升之路系列(七)

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

ADAS感知摄像头的分辨率与帧率选择分析

说明:可以作为对智能驾驶爱好者对摄像头参数理解或者从业工程人员对设计硬件选型参考 前言 在当前智能驾驶中,基于摄像头的 ADAS 因其应用、更高的可靠性和对新要求的适应性而被广泛采用。 ADAS 摄像头通常部署在汽车的前部、侧面和后部,提…

计算视图里的projection和aggregation节点区别

Projection 和 Aggregation到底有什么区别? 看名字就能看出来的。 那么在什么场景下用呢? 1. Projection就是投影,也就是说你本来的源里有什么,就直接给你拿出来。 除了这个,它使用的场景就是: 只映射需…

基于JAVA+SpringBoot+Vue的前后端分离的仓库管理系统(进销存)系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着全球经济的不断发…

linux 下mongodb7版本怎么连?

概述:linux下的mongodb7版本默认是没有安装客户端的,需要下载shell客户端才能连,下载之后解压,不需要编译,进入bin目录就能自己运行,。 安装: linux 下mongodb7版本没有安装客户端需要当地下载…

vscode实时预览markdown效果

安装插件 Markdown Preview Enhanced 上面是搜索框 启动预览 右键->Open Preview On the Side 效果如下: 目录功能 目录功能还是使用gitee吧 push后使用gitee,gitee上markdown支持侧边生成目录

数据结构篇-05:哈希表解决字母异位词分组

本文对应力扣高频100 ——49、字母异位词分组 哈希表最大的特点就是它可以把搜索元素的时间复杂度降到O(1)。这一题就是要我们找到 “字母异位词” 并把它们放在一起。 “字母异位词”就是同一个单词中字母的不同组合形式。判断“字母异位词”有两个视角:1、所含字…

UE4 C++ 静态加载类和资源

静态加载类和资源:指在编译时加载,并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

XXE基础知识整理(附加xml基础整理)

全称:XML External Entity 外部实体注入攻击 原理 利用xml进行读取数据时过滤不严导致嵌入了恶意的xml代码;和xss一样 危害 外界攻击者可读取商户服务器上的任意文件; 执行系统命令; 探测内网端口; 攻击内网网站。 商…

arcgis javascript api4.x加载非公开或者私有的arcgis地图服务

需求: 加载arcgis没有公开或者私有的地图服务,同时还想实现加载时不弹出登录窗口 提示:​ 下述是针对独立的arcgis server,没有portal的应用场景; 如果有portal可以参考链接:https://mp.weixin.qq.com/s/W…

麒麟系统—— openKylin 安装 Maven

麒麟系统—— openKylin 安装 Maven 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕 二、下载Maven三、解压 Maven 与环境配置解压配置环境变量验证 最终:介绍配置的其他参数使用 本文将分享如何在麒麟操作系统 openKylin 上安装…

【持续更新】2024牛客寒假算法基础集训营1题解 | JorbanS

文章目录 [A - DFS搜索](https://ac.nowcoder.com/acm/contest/67741/A)[B - 关鸡](https://ac.nowcoder.com/acm/contest/67741/B)[C - 按闹分配](https://ac.nowcoder.com/acm/contest/67741/C)[D - 数组成鸡](https://ac.nowcoder.com/acm/contest/67741/D)[E - 本题又主要考…

go_view同后端集成时的注意事项

goview是一个不错的可视化大屏配置工具;提供了丰富的功能可供调用。 官方地址和文档: https://gitee.com/dromara/go-view https://www.mtruning.club/guide/start/ 同nodejs集成可参考;https://gitee.com/qwdingyu/led (建议–后端集成有api功能,可直接配置sql)同dotne…

1 初识JVM

JVM(Java Virtual Machine),也就是 “Java虚拟机”。 对于第三点功能:即时编译 常见的JVM 默认安装在JDK中的虚拟机为HotSpot:可以用“java -version”进行查看

【tensorflow 版本 keras版本】

#. 安装tensorflow and keras, 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表,确定安装的tesorflow, keras

Unity通过物理带动实现传输带运输物品

前言:遇到个听起来挺简单的需求,就是实现一个传输带,传输物品。但细想发现如果是直接设置物品的速度,或者通过设置父物体的方式带动物品,都挺不好,关联性太强。最后选择用到一个很实用的API, Rigidbody.M…

基于springboot的宠物店系统的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

Beyond Compare 30天试用到期的2024最新解决办法

目录 BeyondCompare:你的30天评估期已经结束 beyond Compare 3: 1)WinRun: regedit ,打开注册表 2. 删除项⽬:计算机\HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare 3\CacheId beyond Compare 4: …