数据结构_链表基本操作代码

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

和顺序表差不多,用结构体定义一个节点,包括存储的数据和下一个节点的地址。

这里我们写几个接口:尾插,头插,尾删,头删,查找元素,指定位置插入,指定位置删除,销毁。

SList.h

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SList_Datatype;typedef struct SList_Node
{SList_Datatype Data;struct SList_Node* Next;
}STL_Node;void SLTPrint(STL_Node* phead);//尾插
void SLTPushBack(STL_Node** pphead, SList_Datatype x);
//头插
void SLTPushFront(STL_Node** pphead, SList_Datatype x);
//尾删
void SLTPopBack(STL_Node** pphead);
//头删
void SLTPopFront(STL_Node** pphead);//查找
STL_Node* SLTFind(STL_Node* phead, SList_Datatype x);//在指定位置之前插入数据
void SLTInsert(STL_Node** pphead, STL_Node* pos, SList_Datatype x);
//在指定位置之后插入数据
void SLTInsertAfter(STL_Node* pos, SList_Datatype x);//删除pos节点
void SLTErase(STL_Node** pphead, STL_Node* pos);
//删除pos之后的节点
void SLTEraseAfter(STL_Node* pos);//销毁链表
void SListDesTroy(STL_Node** pphead);

SList.c

打印:

(不改变实参)传一级指针,新建立一个头节点pur,用while循环每次循环打印pur里面的数据,并将pur->next赋给pur。以pur != NULL为循环终止条件。

新建节点:

创建一个newnode指针指向一个新开辟的节点,将数据x放进data,将next置空。

尾插:

(要改变实参)传一个二级指针,用新建节点函数新建一个newnode。这里分情况:

(1)如果*pphead为空,即这个链表没有节点就直接将newnode赋给pphead。

(2)这里要先找尾,定义一个ptail指针首先指向*pphead,之后用whlie循环进行找尾。将ptail->next指向newnode。

头插:

头插比较简单(因为不需要找尾),传一个二级指针,新建一个节点将newnode的next指向*pphead,将*pphead指向newnode。就完成了头节点的替换。

尾删:

传二级指针,尾删和尾插差不多的,只是在找尾的时候需要两个指针,最后分别指向尾节点和尾节点的前一个节点。这里就不多叙述了。

头删:

传二级指针,新建一个指针指向第二个节点,将第一个节点释放掉后,将*pphead指向先前备份好的第二个节点。

查找元素:

传一级指针,新建一个指针指向phead循环遍历链表里面的数据,得到结果返回相应节点的指针,否则返回空指针。

在指定位置前/后插入数据:

因为前插比较复杂,这里只讲前插。

传二级指针,先新建一个节点将数据放进去,分两种情况

(1)pos为头指针:这里直接调用头插的函数。

(2)pos不为头指针:新建指针prev,这里还是用while循环找pos前一个节点的指针,循环结束条件为prev->next != pos 、之后将prev的next指向新节点,新节点的next指向pos;

删除pos节点/删除pos之后的节点(第二个我觉得没必要):

这里讲第一个,传二级指针,分两种情况

(1)pos == *pphead:直接调用头插。

(2)pos != *pphead:新建指针prev用while循环找尾节点的前一个节点(不多讲)将prev的next指向pos的next,此时pos就不在链表里面了,只需要将它的空间释放掉,将指针置空就ok了。

销毁链表:

传二级指针,用while在循环里面将当前*pphead指向的空间释放,再将*pphead指向,下一个节点,结束条件为*pphead != NULL,循环结束后记得将*pphead置空(这是个好习惯

下面参考代码附上:

#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"void SLTPrint(STL_Node* phead)
{STL_Node* pur = phead;while (pur){printf("%d->", pur->Data);pur = pur->Next;}printf("NULL\n");
}STL_Node* SLTBuyNode(SList_Datatype x)
{STL_Node* newnode = (STL_Node*)malloc(sizeof(STL_Node));if (newnode == NULL){perror("malloc is fail!");exit(1);}newnode->Data = x;newnode->Next = NULL;return newnode;
}void SLTPushBack(STL_Node** pphead, SList_Datatype x)
{assert(pphead);STL_Node* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else{STL_Node* ptail = *pphead;while (ptail->Next){ptail = ptail->Next;}ptail->Next = newnode;}
}void SLTPushFront(STL_Node** pphead, SList_Datatype x)
{assert(pphead);STL_Node* newnode = SLTBuyNode(x);newnode->Next = *pphead;*pphead = newnode;
}void SLTPopBack(STL_Node** pphead)
{assert(pphead&&*pphead);if ((*pphead)->Next == NULL){free(pphead);pphead = NULL;}STL_Node* prve = *pphead;STL_Node* ptail = *pphead;while (ptail->Next){prve = ptail;ptail = ptail->Next;}free(ptail);ptail = NULL;prve->Next = NULL;
}void SLTPopFront(STL_Node** pphead)
{assert(pphead&&*pphead);STL_Node* tmp = (*pphead)->Next;free(*pphead);*pphead = tmp;
}STL_Node* SLTFind(STL_Node* phead, SList_Datatype x)
{STL_Node* pur = phead;while (pur){if (pur->Data == x){return pur;}pur = pur->Next;}return NULL;
}
//在指定位置之前插入数据
void SLTInsert(STL_Node** pphead, STL_Node* pos, SList_Datatype x)
{assert(pphead&&*pphead);assert(pos);STL_Node* newnode = SLTBuyNode(x);if (*pphead == pos){SLTPushFront(pphead,x);free(newnode);newnode = NULL;}else{STL_Node* prve = *pphead;while (prve->Next != pos){prve = prve->Next;}prve->Next = newnode;newnode->Next = pos;}
}
//在指定位置之后插入数据
void SLTInsertAfter(STL_Node* pos, SList_Datatype x)
{assert(pos);STL_Node* newnode = SLTBuyNode(x);newnode->Next = pos->Next;pos->Next = newnode;
}
//删除pos节点
void SLTErase(STL_Node** pphead, STL_Node* pos)
{assert(pphead&&*pphead);assert(pos);if (pos == *pphead)SLTPopFront(pphead);else{STL_Node* prev = *pphead;while (prev->Next != pos){prev = prev->Next;}prev->Next = pos->Next;free(pos);pos = NULL;}
}
//删除pos之后的节点
void SLTEraseAfter(STL_Node* pos)
{assert(pos&&pos->Next);STL_Node* del = pos->Next;pos->Next = del->Next;free(del);del = NULL;
}
//销毁链表
void SListDesTroy(STL_Node** pphead)
{assert(pphead && *pphead);while (*pphead){STL_Node* next = (*pphead)->Next;free(*pphead);*pphead = next;}*pphead = NULL;
}

本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!

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

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

相关文章

如何部署上线项目

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 多环境多环境分类前端多环境实战请求地址启动方式项目配置 后端多环境实战 项目部署原始部署前端…

【项目】棋海争锋

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 项目介绍 WebSocket介绍 使用 项目创建 数据库设计 用户模块 登录接口 注册接口 获取用户信息接口 匹配模块 …

cartographer代码学习-概率栅格地图(ActiveSubmaps2D与Submaps2D)

概率栅格地图是二维激光SLAM的特点&#xff0c;能够将环境通过地图的形式表达出来。 ActiveSubmaps2D作为概率栅格地图中的重要成分&#xff0c;这个对象主要在LocalTrajectoryBuilder2D这里被使用 第一次调用&#xff1a; active_submaps_(options.submaps_options())传入一…

P1598 垂直柱状图

链接 ​​​​​​题目链接&#xff1a;P1598 垂直柱状图 题目 题目描述 写一个程序从输入文件中去读取四行大写字母&#xff08;全都是大写的&#xff0c;每行不超过 $100$ 个字符&#xff09;&#xff0c;然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出…

为什么要学习SpringBoot呢?

学习SpringBoot的原因众多&#xff0c;以下是其中的一些主要理由&#xff1a; 简化Spring应用开发&#xff1a;SpringBoot极大地简化了Spring应用的开发过程。它提供了许多默认的配置&#xff0c;使开发者能够更快速地构建和运行Spring应用&#xff0c;而无需花费大量时间在繁…

【Bing】开启代理后使用 Bing 搜索引擎总是: 没有与此相关的结果

【Bing】开启代理后使用 Bing 搜索引擎总是: 没有与此相关的结果 1 问题描述2 解决方法2.1 修改代理规则2.1.1 Clash Verge2.1.2 Clash Verge Rev2.1.3 V2RayN 1 问题描述 当我开了代理访问 Bing 时&#xff0c;经常会出现下面的页面: 2 解决方法 我所知的有三种方法: 手动关…

关于JVM-三色标记算法剖析

相关系列 深入理解JVM垃圾收集器-CSDN博客 深入理解JVM垃圾收集算法-CSDN博客 深入理解jvm执行引擎-CSDN博客 jvm优化原则-CSDN博客 jvm流程图-CSDN博客 三色标记产生的原因&#xff1f; 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引…

使用Matplotlib绘制打断图Broken Axis

使用Matplotlib绘制打断坐标轴Broken Axis 对于一批存在离群点的或者两极分化的数据&#xff0c;为了突出其值域差异&#xff0c;时常需要用到打断坐标轴效果。 使用Matplotlib绘制的效果如下&#xff1a; 对于同样的数据&#xff0c;使用brokenaxes库的绘制效果如下&#x…

Ubuntu20.04安装和编译运行lidar_align来联合标定lidar与imu的外参

硬件&#xff1a;树霉派4b 1、下载并安装lidar_align mkdir -p lidar_align/src cd lidar_align/src git clone https://github.com/ethz-asl/lidar_align.git 将 lidar_align/src/lidar_align/NLOPTConfig.cmake 文件移动到 lidar_align/src/ 下(与lidar_align同级) NLOP…

ShardingSphere-ShardingSphere读写分离和数据脱敏

文章目录 一、读写分离1.1 读写分离1.2 读写分离应用方案1.3 分表+读写分离1.4 分库分表+读写分离二、ShardingSphere-JDBC读写分离2.1 创建SpringBoot并添加依赖2.2 创建实体类2.3 创建mapper2.4 配置读写分离2.5 测试测试插入数据测试读测试事务一致性测试负载均衡一、读写分…

免费泛域名SSL证书申请

二级域名使用较多时&#xff0c;一个个申请证书有点麻烦。泛域名证书一次性解决。 申请SSL免费证书 生成SSL最佳配置 https://ssl-config.mozilla.org/ Install curl https://get.acme.sh | sh -s emailzengsmosong.cc alias acme.sh~/.acme.sh/acme.sh# 证书机构二选一&am…

C语言每日一题(66)三数之和

题目链接 力扣15.三数之和 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答…

KMP算法的实现示例(伪代码)

KMP算法&#xff0c;即Knuth-Morris-Pratt算法&#xff0c;是一个线性时间复杂度的字符串匹配算法。它能在O(nm)的时间复杂度内完成一个长度为n的文本串S和一个长度为m的模式串T的匹配工作&#xff0c;其中n和m分别代表文本串和模式串的长度。相比于朴素字符串匹配算法&#xf…

vue3+echarts:echarts地图打点显示的样式

colorStops是打点的颜色和呼吸灯、label为show是打点是否显示数据、rich里cnNum是自定义的过滤模板用来改写显示数据的样式 series: [{type: "effectScatter",coordinateSystem: "geo",rippleEffect: {brushType: "stroke",},showEffectOn: &quo…

【H3C】开启web管理页面H3C S5120V2 Series

配置步骤 1.创建对应vlan并放行通过 2.添加vlanfi的ip地址 3.开启http和https的服务 4.创建用户&#xff0c;配置密码&#xff0c;配置服务类型&#xff0c;赋予权限 假设终端连接在交换机的g1/0/1口 假设终端的ip地址为(Ubuntu)&#xff1a;192.168.200.11 /24 假设交换机vlan…

video替换webRtc视频流

经过测试&#xff0c;本地mp4可播放的视频可替换成功&#xff1b;在线的视频会报错跨域&#xff1b;https安全要求; 核心api video.captureStream()html <video id"yyhTestVideo" src"./tmp.mp4" width"1280" height"720" autopl…

【Java 刷题记录】双指针

双指针 1. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: n…

关于Ansible模块 ④

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》与《关于Ansible的模块 ③》之后&#xff0c;继续学习ansible常用模块之…

P3654 First Step (ファーストステップ) Python深搜

First Step (ファーストステップ) 题目背景 知らないことばかりなにもかもが&#xff08;どうしたらいいの&#xff1f;&#xff09; 一切的一切 尽是充满了未知数&#xff08;该如何是好&#xff09; それでも期待で足が軽いよ&#xff08;ジャンプだ&#xff01;&#xff09…

已解决:windows 下无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本

目录 1&#xff0c;问题描述2&#xff0c;问题解决 1&#xff0c;问题描述 当通过 npm 全局安装依赖后&#xff08;比如 ts 对应的 tsc 命令&#xff0c;还有 pnpm&#xff09;&#xff0c;想直接使用安装的命令&#xff0c;就会报错&#xff1a; 2&#xff0c;问题解决 以管…