当前位置: 首页 > news >正文

基础数据结构:单链表

今天懒洋洋学习了关于基础数据结构有关单链表的相关操作,懒洋洋来这温习一下。

一:单链表的定义

链表定义:用链式存储的线性表统称为链表,即逻辑结构上连续,物理结构上不连续。

链表分类:单链表、双链表、循环链表、静态链表

二:单链表的实现

1:定义结构体

typedef int SLQDataType;//利用typedef将int==SLQDataType
struct SListNode
{SLQDataType data;//定义节点的数据域struct SListNode * next;//定义节点的指针域
};
//重命名结构体
typedef struct SListNode SLNode;

2:初始化单链表

SLNode * phead = NULL;//即直接将头指针置为空。

3:后插法插入元素

划重点:由于我们在定义的变量即phead为一级指针,此时我们要对单链表里面的元素进行改变,即对单链表做出更改,我们要传入一级指针的地址,再利用二级指针进行接受。

    SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);

后插法插入元素代码实现:

(在插入元素的时候,要进行分类,当单链表里面没有元素的时候,我们将为要插入的元素利用malloc库对新的元素进行分配空间,再直接将定义的newNode赋值给*pphead)

//BuySListNode函数实现
SLNode* BuySListNode(SLQDataType x)
{//申请空间SLNode* newNode = (SLNode*)malloc(sizeof(SLNode));if (newNode == NULL){printf("申请节点失败\n");return;}newNode->data = x;newNode->next = NULL;return newNode;
}
void SListPushBack(SLNode**pphead, SLQDataType x)
{if (*pphead == NULL){*pphead = BuySListNode(x);}else{//定义一个结构体指针,指向头结点的指针,判断tail->next是否为NULL,要是为NULL的话//将新的结点的地址即赋值给tail->next.再将newNode->next==NULLSLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = BuySListNode(x);}
}

4:后删法删除元素

1:当单链表里面没有元素的时候,直接结束函数;

2:当单链表里面只有一个结点的时候,需要判断if(*pphead->next==NULL),再释放掉空间;

3:当有一个结点以上时,利用tail->next=NULL,找到末尾的节点,再利用一个指针(2)指向tail的前一个结点,再将前一个结点的next=NULL,释放掉tail的空间)

void SListPopBack(SLNode** pphead)
{//空if (*pphead == NULL){return;}//一个结点else if ((*pphead)->next == NULL){free(*pphead);}//一个以上结点else{//用两个指针进行标记,一个标记下一个是否为NULL//另一个指针标记前一个指针的前一个位置SLNode* tail = *pphead;SLNode* pre = NULL;while (tail->next != NULL){pre = tail;tail = tail->next;}free(tail);tail = NULL;pre->next = NULL;}
}

5:头插法插入元素

我们创建新的结点,将newNode的next指向头结点,再将newNode赋值给*phead;

 void SListPushFront(SLNode**pphead, SLQDataType x)
{SLNode* newNode = BuySListNode(x);newNode->next = *pphead;*pphead = newNode;
}

6:头删法删除元素

1:当单链表里面没有元素的时候,直接结束函数;

2:当单链表里面只有一个结点的时候,需要判断if(*pphead->next==NULL),再释放掉空间;

3:当有一个结点以上时,创建临时的指针保存头指针所指向的下个结点的地址即next=(*phead)->next,释放掉头指针的空间和地址,再将创建的临时的指针变成头指针,即(*phead)=next;

void SListPopFront(SLNode** pphead)
{if (*pphead == NULL){return;}else if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{//先找到下一个结点,用指针保存起来,再释放掉前面SLNode* next = (*pphead)->next;free(*pphead);*pphead = next;}
}

7:查找单链表元素

思路:循环遍历

SLNode* SListFind(SLNode* phead, SLQDataType x)
{{SLNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL;}
}

8:随机位置插入和删除

void SListInsertAfter(SLNode* ps, SLQDataType x)
{BuySListNode(x)->next = ps->next;ps->next = BuySListNode(x);
}
void SListEraseAfter(SLNode* ps)
{SLNode* next = ps->next;ps->next = next->next;free(ps);
}

9:打印单链表的各个元素

void PrintSList(SLNode* phead)
{SLNode* cur = phead;while (cur != NULL){printf("%d-> ", cur->data);cur = cur->next;}printf("NULL");
}

10:主函数及部分功能实现

#include "SList.h"
void test()
{//将头指针置为空SLNode * phead = NULL;//后插法插入元素SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);//后删法删元素SListPopBack(&phead);//头插法增加元素SListPushFront(&phead, 5);//头删法删除元素SListPopFront(&phead);PrintSList(phead);
}int main()
{test();
}

今天懒洋洋的学习之路就到这了,感谢羊村的各位捧场!!!

相关文章:

基础数据结构:单链表

今天懒洋洋学习了关于基础数据结构有关单链表的相关操作,懒洋洋来这温习一下。一:单链表的定义链表定义:用链式存储的线性表统称为链表,即逻辑结构上连续,物理结构上不连续。链表分类:单链表、双链表、循环链表、静态链…...

基于51单片机的智能计算器Protues仿真设计

目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 ​3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展&am…...

Pandas数据分析实战练习

Pandas数据分析实战练习 文章目录 Pandas数据分析实战练习一、读取Excel文件中的数据1、读取工号、姓名、时段、交易额这四列数据,使用默认索引,输出前10行数据2、读取第一个worksheet中所有列,跳过第1、3、5行,指定下标为1的列中数据为DataFrame的行索引标签二、筛选符合特…...

C++ 继承下(二篇文章学习继承所有知识点)

5.继承与友元友元关系不能继承&#xff0c;也就是说基类友元不能访问子类私有和保护成员 //验证友元不能继承 class B {friend void Print(); public:B(int b): _b(b){cout << "B()" << endl;}protected:int _b; };class D : public B { public:D(int b,…...

【C++】C++11新特性——类的改进|lambda表达式

文章目录一、类的改进1.1 默认生成1.2 移动构造函数1.3 移动赋值重载函数1.4 成员变量缺省值1.5 强制生成默认函数的关键字default1.6 禁止生成默认函数的关键字delete1.6.1 C98防拷贝1.6.1 C11防拷贝二、lambda表达式2.1 对比2.2 lambda表达式语法2.3 捕捉列表2.4 函数对象与l…...

C语言进阶(37) | 程序环境和预处理

目录 1.程序的翻译环境和执行环境 2.详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段: 2.3 运行环境 3.预处理详解 3.1预定符号 3.2 #define 3.3 #undef 3.4 命令行定义 3.5 条件编译 3.6 文件包含 了解重点&#xff1a; 程序的翻译环境程序的执行环境详解: C语言程…...

Golang每日一练(leetDay0005)

目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…...

occt_modeling_data(一)——拓扑

下面是我基于opencascade英文文档中关于occt_modeling_data中Topology部分进行的翻译&#xff0c;英文好的还是建议直接看文档&#xff0c;部分我不肯定的地方我会附上英文原句。如发现有错误欢迎评论区留言。 OCCT Topolog允许用户访问和操纵物体的数据&#xff0c;且不需要处…...

【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)

目录 写在前面&#xff1a; 题目&#xff1a;93. 递归实现组合型枚举 - AcWing题库 读题&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 数据范围&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &…...

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用

文章目录前言一、准确性提升1.创造力2.视觉输入3.更长的上下文二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的时…...

HashMap的实际开发使用

目 录 前言 一、HashMap是什么&#xff1f; 二、使用步骤 1.解析一下它实现的原理 ​编辑 2.实际开发使用 总结 前言 本章&#xff0c;只是大概记录一下hashMap的简单使用方法&#xff0c;以及理清一下hashMap的put方法的原理&#xff0c;以及get方法的原理。 一、Has…...

OpenCV入门(十三)快速学会OpenCV 12 图像梯度

OpenCV入门&#xff08;十三&#xff09;快速学会OpenCV 12 图像梯度1.Sobel算子1.1 计算x1.2 计算y1.3 计算xy2.Scharr算子2.1 计算x2.2 计算y2.3 计算xy3.Laplacian算子4.总结图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯…...

软考:常见小题目计算题

01采购合同的类型采购合同主要包括总价类合同、成本补偿类合同、工料合同三大类合同。1、总价类合同此类合同为既定产品、服务或成果的采购设定一个总价。这种合同应在已明确定义需求&#xff0c;且不会出现重大范围变更的情况下使用。包括&#xff1a;&#xff08;1&#xff0…...

【Linux】进程的程序替换

文章目录1. 程序替换1.创建子进程的目的是什么&#xff1f;2.了解程序是如何进行替换的3. 程序替换的基本原理当创建进程的时候&#xff0c;先有进程数据结构&#xff0c;还是先加载代码和数据&#xff1f;程序替换是整体替换&#xff0c;不是局部替换execl 返回值4. 替换函数1…...

【C++】模板(上)

文章目录1、泛型编程2、函数模板函数模板的实例化模板参数的匹配原则3、 类模板类模板的实例化1、泛型编程 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left …...

express框架利用formidable上传图片

express框架&#xff0c;在上传图片功能方面&#xff0c;用formidable里面的incomingform功能&#xff0c;很方便。很多功能都已经封装好了&#xff0c;非常好用&#xff0c;简单&#xff0c;不需要写更深层次的代码了。确实不错。 下面是我自己跟着黑马教程的博客系统的部分&…...

测试背锅侠?入职软件测试后大d佬给我丢了这个bug分类分析,至今受益匪浅......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 刚成为入职&#xf…...

STM32 OTA应用开发——通过内置DFU实现USB升级(方式1)

STM32 OTA应用开发——通过内置DFU实现USB升级&#xff08;方式1&#xff09; 目录STM32 OTA应用开发——通过内置DFU实现USB升级&#xff08;方式1&#xff09;前言1 硬件介绍2 环境搭建2.1 Keil uVsion2.2 zadig2.3 STM32CubeProgrammer2.4 安装USB驱动3 OTA升级结束语前言 …...

基于MFC的JavaScript进行网页数据交互

目录 前言 一、创建html对话框工程 二、使用步骤 1.引入JavaScript接口代码 2.重写相关接口 3.在html网页中添加C/C调用的接口 4.在MFC工程中添加调用接口 5.设置确认按键触发调用 6.运行结果 总结 前言 如何快速的进行MFC开发,这里我介绍一种JavaScript与C/C交互的…...

AUTOSAR-Fee

Fee模块 全称Flash EEPROM Emulation Module,属于ECU抽象层 Fee模块本身是脱离硬件的,但是Fee模块可能会引用的Fls模块定制API,所以只能算半抽象. FEE模块应从设备特定的寻址方案和分段中抽象出来,并为上层提供虚拟寻址方案和分段(virtual addressing scheme and segment…...

Linux基本命令——操作演示

Linux基本命令——操作演示Linux的目录结构Linux命令入门目录切换相关命令&#xff08;cd/pwd&#xff09;相对路径、绝对路径和特殊路径符创建目录命令&#xff08;mkdir&#xff09;文件操作命令part1 (touch、cat、more)文件操作命令part2 (cp、mv、rm&#xff09;查找命令 …...

【Linux】目录和文件的权限

Linux中的权限有什么作用Linux权限管理文件访问者的分类文件类型和访问权限&#xff08;事物属性&#xff09;**文件权限值的表示方法**文件访问权限的相关设置方法chmodchownchgrpumaskumask使用 sudo分配权限目录的权限Linux中的权限有什么作用 Linux下有两种用户&#xff1…...

Unity 优化之Player Setting

Quality SettingPixel Light Count 使用前向渲染时最大像素光源数。也是性能关键。数量越大消耗越多。Texture Quality&#xff1a;贴图质量&#xff0c;可以选择Half Res&#xff0c;这样速度会更快&#xff0c;但是贴图质量会轻微下降。Anisotropic Textures 纹理各向异形Ant…...

Qt——通过一个简单的程序例程熟悉使用Qt Creator软件进行项目搭建的基本流程(新建项目、项目的文件组成、修改ui文件、编译运行与调试)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...

Linux 如何使用 git | 新建仓库 | git 三板斧

文章目录 专栏导读 一、如何安装 git 二、注册码云账号 三、新建仓库 配置仓库信息 四、克隆远端仓库到本地 五、git 三板斧 1. 三板斧第一招&#xff1a;git add 2. 三板斧第二招&#xff1a;git commit 解决首次 git commit 失败的问题 配置机器信息 3. 三…...

3.springcloud微服务架构搭建 之 《springboot自动装配ribbon》

1.springcloud微服务架构搭建 之 《springboot自动装配Redis》 2.springcloud微服务架构搭建 之 《springboot集成nacos注册中心》 ribbon工作原理自己网上百度&#xff0c;说的都很详细 目录 1.项目引入openfeign和ribbon配置 2.新建lilock-ribbon-spring-boot-starter 3…...

【一】进程到底是个啥?

1. 什么是进程 进程&#xff08;process&#xff09;&#xff1a;一个运行起来的程序&#xff0c;就是进程&#xff01;&#xff0c;我们可以在任务管理中看到进程。 进程是操作系统进行资源分配的基本单位 2. 进程的管理 所谓的进程管理&#xff0c;其实就是分为两步&…...

[蓝桥杯] 双指针、BFS和DFS与图论问题

文章目录 一、日志统计 1、1 题目描述 1、2 题解关键思路与解答 二、献给阿尔吉侬的花束 2、1 题目描述 2、2 题解关键思路与解答 三、红与黑 3、1 题目描述 3、2 题解关键思路与解答 3、2、1 dfs题解代码 3、2、2 bfs题解答案 四、交换瓶子 4、1 题目描述 4、2 题解关键思路与…...

编译原理陈火旺版第四章课后题答案

下面答案仅供参考&#xff01; 1.考虑下面文法G1: (1) 消去 Q 的左递归。然后&#xff0c;对每个非终结符&#xff0c;写岀不带回溯的递归子程序。 (2) 经改写后的文法是否是LL(1)的&#xff1f;给出它的预测分析表。 2.对下面的文法G: P→(E)lalblΛ (1)计算这个文法的每个非…...

【LeetCode】剑指 Offer(25)

目录 题目&#xff1a;剑指 Offer 49. 丑数 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 49. 丑数 - 力扣&…...

id导入不了wordpress/接广告的网站

1.Tomcat的结构概述Tomcat服务器是由一系列可配置的组件构成&#xff0c;其核心组件是Catalina Servlet容器&#xff0c;它是所有其他Tomcat组件的顶层容器。Tomcat的组件可以在<CATALINA_HOME>/conf/server.xml文件中进行配置,每个Tomcat的组件在server.xml文件中对应一…...

萝岗免费网站建设/如何开发一款app软件

转载来自&#xff1a;http://blog.csdn.net/xiaowei_cqu/article/details/7586847 前一天把系统整个重写了一遍&#xff0c;脉络清晰了很多&#xff0c;也终于解决了以前很多崩溃&#xff0c;异常退出的问题。这里小小总结一下自己遇到的麻烦。 1、内存泄露 内存泄露是说没有释…...

用ps做网站方法/网络服务费计入什么科目

施工总平面布置图是拟建项目施工场地的总布置图。它按照施工方案和施工进度的要求&#xff0c;对施工现场的道路交通、材料仓库、加工场地、主要机械设备、临时房屋、临时水电管线等做出合理的规划布置&#xff0c;从而正确处理全工地施工期间所需各项设施和永久建筑、拟建工程…...

中学网站建设工作实施方案/深圳百度seo哪家好

在本文你可以学到&#xff1a; 1、 怎样利用已知漏洞 2、 远程包含漏洞入侵整个过程 一、 菜鸟的感慨&#xff1a; 唉&#xff01;为什么我们就是不能自己找到别人没有找到的漏洞呢&#xff1f;别人找到漏洞了&#xff0c;写文章就写一大片的理论知识&#xff0c;让我…...

建设银行网站网址/百度seo关键词排名查询工具

文章目录一、核心组件1.1 SecurityContextHolder类1.1.1 概念1.1.2 存储策略1.1.3 源码1.2 SecurityContext接口1.3 Authentication接口1.4 GrantedAuthority接口1.5 UserDetails接口1.6 UserDetailsService接口1.7 AuthenticationManager接口1.8 DaoAuthenticationProvider二、…...

人与马做网站/服装店营销策划方案

配套FPGA开发板&#xff08;含该设计的工程代码&#xff09;&#xff1a;https://item.taobao.com/item.htm?spma1z10.1-c.w4004-4676525296.4.6e8950ed57YPhv&id17848039135 基于FPGA的智力抢答器设计 功能说明 说明 4路抢答器&#xff0c;选手&#xff0c;主持人可以进行…...