单项链表的学习

1:链表概念 

链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

1:结点

与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点 / 结点”.
结点的组成主要有两个部分:当前结点要保存的数据和保存下⼀个结点的地址(指针变量)。
图中指针变量 plist保存的是第⼀个结点的地址,我们称plist此时“指向”第⼀个结点,如果我们希望
plist“指向”第⼆个结点时,只需要修改plist保存的内容为0x0012FFA0。
链表中每个结点都是独⽴申请的(即需要插⼊数据时才去申请⼀块结点的空间),我们需要通过指针变量来保存下⼀个结点位置才能从当前结点找到下⼀个结点

2:链表性质

1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续
2、结点⼀般是从堆上申请的
3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续

3:结点结构体的代码

typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SListNode;

2:链表的打印

void SLPrint(SLTNode* phead){
SLTNode* pcur=phead;
while(pcur){
      printf("%d -> ",pcyr);
      pcur = pcur -> next;
           }
      printf("NULL");
}

代码和图片联系一下

 

将int 重命名为SLDateType是为了将链表的元素和整型做出区分。

当我们想要保存⼀个整型数据时,实际是向操作系统申请了⼀块内存,这个内存不仅要保存整型数据,也需要保存下⼀个结点的地址(当下⼀个结点为空时保存的地址为空)。
当我们想要从第⼀个结点⾛到最后⼀个结点时,只需要在当前结点拿上下⼀个结点的地址就可以了。

3:链表代码

我们需要在VS 2022上面创建3个文件。

1:头文件node.h(很全)

#pragma once
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SListNode;

// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);

// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

// 在pos的前面插入
void SLTInsert(SListNode** pphead, SListNode* pos, SLTDateType x);
// 删除pos位置
void SLTErase(SListNode** pphead, SListNode* pos);
void SLTDestroy(SListNode** pphead);

对于链表,我们不需要进行初始化的行为。

对于链表,我们和顺序表一样,需要进行数据的增删查改。指定位置插入,指定位置删除。

2:函数实现文件node.c

#include"node.h"
SListNode* BuySListNode(SLTDateType x)
{
	SListNode* newnode=(SListNode*)malloc(sizeof(SListNode));
	if (newnode == NULL)
	{
		perror("buy fail");
		exit(10086);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

void SListPrint(SListNode* plist)
{
	SListNode* pcur = plist;
	while (pcur!=NULL)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("NULL");
}

void SListPushBack(SListNode** pplist, SLTDateType x)
{
	SListNode*newnode = BuySListNode(x);
	if (*pplist == NULL)
	{
		*pplist = newnode;
	}
	else
	{
		SListNode* ptail = *pplist;
		while (ptail->next)
		{
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

void SListPushFront(SListNode** pplist, SLTDateType x)
{
	assert(pplist);
	SListNode* newnode = BuySListNode(x);
	newnode->next = *pplist;
	*pplist = newnode;
}

void SListPopBack(SListNode** pplist)
{
	assert(pplist&&*pplist);
	if ((*pplist) -> next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		SListNode* pcr = *pplist;
		SListNode* pev = NULL;
		while (pcr->next)
		{
			pev = pcr;
			pcr = pcr->next;
		}
		pev->next=NULL;
		free(pcr);
		pcr = NULL;

	}
}

void SListPopFront(SListNode** pplist)
{
	assert(*pplist&& pplist);
	if ((*pplist)->next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		SListNode* pev = *pplist;
		*pplist = pev->next;
		free(pev);
		pev = NULL;
	}
}

SListNode* SListFind(SListNode* plist, SLTDateType x)
{
	SListNode* pcr = plist;
	while (pcr->next)
	{
		if (pcr->data==x)
		{
			printf("%d\n", x);
			return pcr;
		}
		pcr = pcr->next;
	}
	printf("Can't find\n");
	return NULL;
}

void SListInsertAfter (SListNode* pos, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

void SLTInsert(SListNode** pphead, SListNode* pos, SLTDateType x)
{
	assert(pphead && pos);
	if (pos == *pphead)
	{
		SListPushFront(pphead, x);
	}
	else
	{
		SListNode* newnode = BuySListNode(x);
		SListNode* pre = *pphead;
		while (pre->next != pos)
		{
			pre = pre->next;
		}
		newnode->next = pos;
		pre->next = newnode;
	}
}

void SListEraseAfter(SListNode* pos)
{
	assert(pos&&pos->next);
	SListNode* now = pos->next;
	pos->next = pos->next->next;
	free(now);
	now = NULL;
}

void SLTErase(SListNode** pphead, SListNode* pos)
{
	assert(pphead&&pos);
	if (pos == *pphead)
	{
		SListPopFront(pphead);
	}
	else
	{
		SListNode* prc = *pphead;
		while (prc->next != pos)
		{
			prc = prc->next;
		}
		prc->next = pos->next;
		free(pos);
		pos = NULL;
	}
}

void SLTDestroy(SListNode** pphead)
{
	assert(pphead);
	SListNode* pev = *pphead;
	while (pev)
	{
		SListNode* next = pev->next;
		free(pev);
		pev = next;
	}
	*pphead = NULL;
}

3:测试文件

#include"node.h"

void test()
{
	SListNode* node = BuySListNode(1);
	SListPushFront(&node, 4);
	SListPushFront(&node, 4);
	SListPushFront(&node, 4);
	SListNode* op = SListFind(node, 4);
	SListPushFront(&node, 2);
	SListPushFront(&node, 4);
	SListPrint(node);
	SLTErase(&node, op);
	SListPrint(node);
	SListPushFront(&node, 6);
	SListPushFront(&node, 27);
	SListPushFront(&node, 999);
	SListPushFront(&node, 56);
	SListPushFront(&node, 6);
	SListPushFront(&node, 567);
	SListNode* ret = SListFind(node, 56);
	SListPrint(node);
	SListEraseAfter(ret);
	SListPrint(node);
	SLTDestroy(&node);
}

int main()
{
	test();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于大语言模型的多代理下一代制造系统能灵活动态管理制造资源的高效调度方法

摘要 论文地址&#xff1a;https://arxiv.org/pdf/2405.16887 随着生产率的提高&#xff0c;客户对多品种、小批量生产的需求也在不断增加&#xff0c;这反过来又对制造系统提出了更高的要求。由于这种需求&#xff0c;当生产任务频繁变化时&#xff0c;传统的制造系统往往无法…

FPGA-PS端编程1:

目标 在小梅哥的zynq 7015上&#xff0c;完成以下目标&#xff1a; 读取 S1 按键的电平&#xff0c; 当 S1 按键为按下状态时&#xff0c;驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别)&#xff0c; 当 S1 释放后&#xff0c;停止…

模型 QFD(质量功能展开/质量屋)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。将客户需求转化为产品设计。 1 模型 QFD&#xff08;质量功能展开&#xff09;的应用 1.1 电信服务及网络维护过程质量改进QFD应用案例 背景介绍&#xff1a; 随着中国加入WTO和国家对电信管制的普遍…

安装@wangeditor/editor-for-vue失败原因

链接: 安装wangeditor/editor-for-vue失败原因 或者下述命令行: 安装成功可到packa.json里面查看&#xff1a;

敏捷多模态微型机器人:独特的被动变形轮设计

大家好&#xff01;今天来了解一种微型机器人——《An agile multimodal microrobot with architected passively morphing wheels》发表于《SCIENCE ADVANCES》。这个微型机器人&#xff0c;具有独特的设计和卓越的性能。它带有被动变形轮子&#xff0c;这种轮子的设计灵感源自…

键盘扫描及显示设计实验-微机原理与接口技术课程设计

1.实验要求 将 8255 单元与键盘及数码管显示单元连接&#xff0c;编写实验程序&#xff0c;扫描键盘输入&#xff0c;并将扫描结果送数码管显示。键盘采用 44 键盘&#xff0c;每个数码管显示值可为 0&#xff5e;F 共 16 个数。实验具体内容如下&#xff1a;将键盘进行编号&am…

超维机器人油气化工智能巡检解决方案

随着油气化工行业的快速发展和生产环境的日益复杂&#xff0c;安全、环保和高效的运营管理成为企业发展的关键目标。然而&#xff0c;传统的人工巡检方式面临着许多挑战&#xff0c;包括安全隐患、效率低下和人为误差等问题。为了应对这些挑战&#xff0c;智能化技术的引入为油…

unity webgl部署到iis报错

Unable to parse Build/WebGLOut.framework.js.unityweb! The file is corrupt, or compression was misconfigured? (check Content-Encoding HTTP Response Header on web server) iis报错的 .unityweb application/octet-stream iis中添加 MIME类型 .data applicatio…

【Lua热更新】下篇 -- 更新中

上篇链接&#xff1a;【Lua热更新】上篇 文章目录 三、xLua热更新&#x1f4d6;1.概述&#x1f4da;︎2.导入xLua框架&#x1f516;3. C#调用Lua3.1Lua解析器3.2Lua文件夹的重定向3.3Lua解析器管理器3.4全局变量获取3.5全局函数获取3.6映射到List和Dictionary3.7映射到类3.8映…

基于 uniapp 开发 android 播放 webrtc 流

一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回&#xff0c;流地址如&#xff1a;rtsp://127.0.0.1:5115/session.mpg&#xff0c;uniapp的 <video> 编译到android上直接就能播放&#xff0c;但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…

Redis应用—7.大Value处理方案

大纲 1.⽅案设计 2.安装与配置环境 1.⽅案设计 步骤一&#xff1a;首先需要配置一个crontab定时调度shell脚本&#xff0c;然后该脚本每天凌晨会通过rdbtools⼯具解析Redis的RDB⽂件&#xff0c;接着对解析出的内容进行过滤&#xff0c;把RDB⽂件中的⼤key导出到CSV⽂件。 步…

Kafka常见面试题+详细解释,易理解。

目录 题库 1.Kafka中的ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么&#xff1f; 2.Kafka中的HW、LEO等分别代表什么&#xff1f; 3.Kafka的用途有哪些&#xff1f;使用场景如何&#xff1f; 4.Kafka中是怎么体现消息顺序性的&#xff1f; 5.“消费组中的…

泷羽sec学习打卡-brupsuite7搭建IP炮台

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-IP炮台搭建 搭建炮台服务端安装zmap1、更新系统和安装基础依赖&#xff…

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献&#xff08;CAJPDF&#xff09;批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件&#xff0c;格式为es6文件&#xff0c;需使用知网研学软件打开&#xff0c;故需先安装该…

强化学习的产业界探索

RL China 2024的会议上&#xff0c;赵鉴博士发表了一个有关强化学习的产业界探索的Topic&#xff0c;我看完之后结合他的ppt和我的看法谈下强化学习的应用落地。 强化学习在很多领域都有应用&#xff0c;据我所知&#xff0c;在好几个热点中都有强化学习的身影&#xff0c;而且…

【RAG实战】Prompting vs. RAG vs. Finetuning: 如何选择LLM应用选择最佳方案

在构建基于大型语言模型&#xff08;LLM&#xff09;的应用时&#xff0c;通常不可能立即使用模型而无需任何调整。为了保持高实用性&#xff0c;我们可以选择以下几种方法之一&#xff1a; Prompt Engineering&#xff08;提示工程&#xff09;Fine-tuning&#xff08;微调&a…

小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6

1. 安装JDK1.8 官网下载安装包&#xff0c;上传至服务器&#xff0c;解压tar包 http://planetone.online/downloads/java/jdk/jdk-8u221-linux-x64.tar.gz上传安装包至服务器并解压到指定目录&#xff1a; tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/module/2. 配置java…

sql-labs 练习笔记

简介# 这个节不涉及过多原理&#xff0c;而主要是靶场练习&#xff0c;想获得更多原理请见上篇博客。 基础知识# 如何闭合括号# 如果有报错则直接利用报错信息进行&#xff0c;否则尝试常见的闭合形式&#xff0c;简单的可以直接使用 bool 探测&#xff0c;而困难一点的可以…

NOTEBOOK_11 汽车电子设备分享(工作经验)

汽车电子设备分享 摘要 本文主要列出汽车电子应用的一些实验设备和生产设备&#xff0c;部分会给予一定推荐。目录 摘要一、通用工具&#xff1a;二、测量与测试仪器2.1测量仪器2.2无线通讯测量仪器2.3元器件测试仪2.4安规测试仪2.5电源供应器2.6电磁兼容测试设备2.7可靠性环境…

10.1k高星 GitHub 库:告别JSON错误:Outlines如何提升大模型的结构化输出

在人工智能和大语言模型(LLM)的应用中,如何高效、可靠地从模型输出中提取结构化数据,成为了一个至关重要的课题。本篇文章将介绍 GitHub 高星开源库 Outlines,并分析它如何帮助开发者解决大模型在生成结构化数据时面临的挑战。我们将探讨大模型的非结构化输出给 AI 应用带…