数据结构之线性表(3)

数据结构之线性表(3)

上文我们了解了线性表的静动态存储的相关操作,此篇我们对线性表中链表的相关操作探讨。
在进行链表的相关操作时,我们先来理解单链表是什么?

1.链表的概念及结构

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
在这里插入图片描述

//单链表的结点定义
struct SeqListNode
{datatype data;struct SeqListNode * next;
};
typedef struct SeqListNode SLNode;

在这里插入图片描述

单链表的基本操作:

1.头插

//头插
void SLNpushfront(SLNode** pphead,datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tmp = (SLNode*)malloc(sizeof(SLNode));tmp->data = x;tmp->next = *pphead;*pphead = tmp;}
}

2.尾插

//尾插
void SLNpushback(SLNode** pphead, datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));tail->next = newnode;newnode->data = x;newnode->next = NULL;}
}

3.头删

//头删
void SLNpopfront(SLNode** pphead)
{//1.链表中0个结点,无法删除if (*pphead == NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点if ((*pphead)->next == NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* tmp = (*pphead)->next;free(*pphead);(*pphead) = NULL;*pphead = tmp;
}

4.尾删

//尾删
void SLNpopback(SLNode** pphead)
{//1.链表中0个结点if (*pphead ==NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点,就类似于只有一个结点的头删if ((*pphead)->next ==NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* prev = NULL;SLNode* tail = (*pphead);while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;
}

5.打印

//打印
void SLNprintf(SLNode* pphead)
{while (pphead){printf("%d ", pphead->data);pphead = pphead->next;}
}

6.查找

//查找
SLNode* SLNfind(SLNode* phead, datatype x)
{SLNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

7.指定位置插入

//指定位置插入
void SLNinsert(SLNode** pphead, SLNode* pos, datatype x)
{if (pos == *pphead){SLNpushfront(pphead, x);//若pos==*pphead,就等同于头插}else{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}
}

7.指定位置删除

void SLNdeleate(SLNode** pphead, SLNode* pos)
{if (pos == *pphead){SLNpopfront(pphead);//若pos==*pphead,就等同于头删}else{SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
//单链表结点的定义
struct SeqListNode
{datatype data;struct SLNode* next;
};
typedef struct SeqListNode SLNode;
//头插
void SLNpushfront(SLNode** pphead,datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tmp = (SLNode*)malloc(sizeof(SLNode));tmp->data = x;tmp->next = *pphead;*pphead = tmp;}
}
//尾插
void SLNpushback(SLNode** pphead, datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));tail->next = newnode;newnode->data = x;newnode->next = NULL;}
}
//头删
void SLNpopfront(SLNode** pphead)
{//1.0个结点,无法删除if (*pphead == NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点if ((*pphead)->next == NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* tmp = (*pphead)->next;free(*pphead);(*pphead) = NULL;*pphead = tmp;
}
//尾删
void SLNpopback(SLNode** pphead)
{//1.链表中0个结点if (*pphead ==NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点,就类似于只有一个结点的头删if ((*pphead)->next ==NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* prev = NULL;SLNode* tail = (*pphead);while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;
}
//打印
void SLNprintf(SLNode* pphead)
{while (pphead){printf("%d ", pphead->data);pphead = pphead->next;}
}
//指定位置插入
void SLNinsert(SLNode** pphead, SLNode* pos, datatype x)
{if (pos == *pphead){SLNpushfront(pphead, x);}else{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}
}
//指定位置删除
void SLNdeleate(SLNode** pphead, SLNode* pos)
{if (pos == *pphead){SLNpopfront(pphead);}else{SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}
//查找
SLNode* SLNfind(SLNode* phead, datatype x)
{SLNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
int main()
{SLNode* plist = NULL;SLNpushfront(&plist, 1);SLNpushfront(&plist, 2);SLNpushfront(&plist, 3);SLNpushback(&plist, 4);SLNpushback(&plist, 5);SLNpushback(&plist, 6);SLNpushback(&plist, 7);SLNpopfront(&plist);SLNpopback(&plist);SLNprintf(plist);return 0;
}

以上就是单链表中最简单的一种结构的相关操作啦,谢谢大家支持。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++命名空间

命名空间(namespace)的目的&#xff1a;对标识符的名称进行本地化&#xff0c;以避免命名冲突或者名字污染 #include<stdio.h> #include<stdlib.h>int rand 0; int main() { //C语言没有办法解决类似这种的命名冲突&#xff0c;而C提出了namespace来解决printf(&…

【日常记录】【vue】vite-plugin-inspect 插件的使用

文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…

6.17作业

升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 //发送端头文件…

AI + 3D:用单个图像和文本提示创建可交互的3D世界

你是否曾经梦想过只需一张照片和一些简单的文字描述,就能立即进入一个生动的3D虚拟世界?今天,我们将介绍一个革命性的技术,它就像是一台神奇的3D场景制造机,能够根据你的想象快速构建出令人惊叹的虚拟空间。 一、技术概览 这项技术不仅仅是一个简单的图像到3D的转换工具…

计算机组成原理(四)Cache存储器

文章目录 Cache存储器的基本原理cache命中率、平均访问时间、效率地址映射全相联映射直接映射组相联映射 查找算法cache 存储器替换策略cache 存储器-写操作策略习题 Cache存储器的基本原理 Cache是一种高速缓冲寄存器&#xff0c;是为了解决CPU和主存之间速度不匹配而采用的一…

Stable Diffusion基础:ControlNet之细节替换

本文继续给大家分享 Stable Diffusion 的基础能力&#xff1a;ControlNet之细节替换&#xff0c;故事的主角是 Tile。 Tile 的原意是瓦片、瓷砖。作为 ControlNet&#xff0c;它会对参考图进行分块&#xff0c;并识别出区块内的对象。如果提示词和区块内的对象匹配&#xff0c…

高考志愿填报:选择好专业还是好学校?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 高考志愿填报&#xff1a;选择好专业还是好学校&#xff1f; 每年高考结束后&#xff0c;考生和家长面临的一个…

【深度学习】AI换脸,EasyPhoto: Your Personal AI Photo Generator【一】

论文&#xff1a;https://arxiv.org/abs/2310.04672 文章目录 摘要IntroductionTraining Process3 推理过程3.1 面部预处理3.3 第二扩散阶段3.4 多用户ID 4 任意ID5 实验6 结论 下篇文章进行实战。 摘要 稳定扩散Web UI&#xff08;Stable Diffusion Web UI&#xff0c;简称…

LabVIEW进行图像拼接的实现方法与优化

在工业检测和科研应用中&#xff0c;对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具&#xff0c;能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…

30.保存游戏配置到文件

上一个内容&#xff1a;29.添加录入注入信息界面 以 29.添加录入注入信息界面 它的代码为基础进行修改 效果图&#xff1a; 首先在我们辅助程序所在目录下创建一个ini文件 文件内容 然后首先编写一个获取辅助程序路径的代码 TCHAR FileModule[0x100]{};GetModuleFileName(NUL…

ByteTrack

1. 论文中伪代码表示的流程图 2. 简要版 此图源自&#xff1a; ByteTrack多目标跟踪原理&#xff0c;白老师人工智能学堂 3. 详细版 根据ByteTrack-CPP-ncnn代码的数据流画的较为详细的流程图&#xff1a; 4. ByteTrack-CPP-ncnn的UML类图 Reference ByteTrack多目标跟踪原…

事务性邮件与营销邮件有什么区别

在数字化时代&#xff0c;电子邮件已成为商务沟通不可或缺的工具。然而&#xff0c;并非所有的邮件都旨在销售产品或服务。事务性邮件和营销邮件&#xff0c;虽然都通过电子邮件这一渠道传播&#xff0c;但它们的目的、风格和结构却大相径庭。U-Mail将深入探讨这两种邮件的区别…

cve_2014_3120-Elasticsearch-rce-vulfocus靶场

1.背景 来源&#xff1a;ElasticSearch&#xff08;CVE-2014-3120&#xff09;命令执行漏洞复现_mvel 漏洞-CSDN博客 参考&#xff1a;https://www.cnblogs.com/huangxiaosan/p/14398307.html 老版本ElasticSearch支持传入动态脚本&#xff08;MVEL&#xff09;来执行一些复…

React入门教程:构建你的第一个React应用

在当今快速发展的Web开发领域&#xff0c;前端技术日新月异&#xff0c;而React作为一款强大的JavaScript库&#xff0c;已经成为众多开发者的首选。React以其组件化、高效的性能和灵活的数据处理机制闻名于世&#xff0c;被广泛用于构建动态且复杂的用户界面。在本教程中&…

新人最全Charles安装配置来了

1. windows proxy 这个按钮根据需要&#xff0c;进行打开或者关闭。该按钮勾选状态下则表示可以抓取到电脑端的请求 2. Proxy-setiing 检查enable transparent HTTP 按钮是否勾选 这个按钮必须勾选 3. SSL proxy setting 80&#xff1a;HTTP协议的端口号 8080&#xff1…

SFNC —— 标准特征命名约定(一)

系列文章目录 SFNC —— 标准特征命名约定&#xff08;一&#xff09; 文章目录 系列文章目录1、介绍1.1 约定&#xff08;Conventions&#xff09;功能名称和接口&#xff08;Feature Name and Interface&#xff09;功能类别&#xff08;Feature Category&#xff09;功能级别…

NAND闪存市场彻底复苏

在全球内存市场逐渐走出阴霾、迎来复苏曙光之际&#xff0c;日本存储巨头铠侠&#xff08;Kioxia&#xff09;凭借敏锐的市场洞察力和及时的战略调整&#xff0c;成功实现了从生产紧缩到全面复苏的华丽转身。这一转变不仅彰显了企业在逆境中的生存智慧&#xff0c;也为全球半导…

SpringBootWeb 篇-入门了解 Apache POI 使用方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Apache POI 概述 2.0 使用 Apache POI 读写 Excel 文件 2.1 写入 Excel 文件 2.2 写入 Excel 文件代码演示 2.3 读取 Excel 文件 2.4 读取 Excel 文件代码演示 1.…

[蓝桥杯真题]买二赠一

蓝桥杯真题;买二赠一&#xff0c;要求赠的一价格不能超过买的两者之间最小价格的二分之一 看到这个题的时候我信心满满的一顿操作猛如虎&#xff0c;全部写出来的时候内心想着&#xff0c;稳了&#xff01;这次绝对稳了&#xff01;然而。。。答案错误。。。 我只能去看了一下…

苹果的后来者居上策略:靠隐私保护打脸微软

01.苹果与微软相比更注重用户隐私 我一直是Windows的忠实用户&#xff0c;但微软疯狂地将人工智能融入一切&#xff0c;让我开始觉得应该咬咬牙换成Mac。 自小我几乎只用Windows电脑&#xff0c;所以我对MacOS一直不太适应。虽然Windows 11有其缺点&#xff0c;但总的来说&am…