数据结构对链表的初步认识(一)

已经两天没有更新了,今天就写一篇数据结构的链表吧,巩固自己也传授知识,不知道各位是否感兴趣看看这一篇有关联表的文章。

目录

链表的概念与结构

 单向链表的实现

链表各个功能函数


首先我在一周前发布了一篇有关顺序表的文章,其中我们通过简单的介绍和代码实践,已经基本了解顺序表了,那么即使我们把顺序表弄成动态的顺序表,但其实我们运用顺序表还是有以下问题:

1. 如果空间不够,我们进行增容。但增容回付出一定的性能消耗,其次可能存在一定的空间浪费,因为我们每次增容都是2倍的增容我们可能并用不完这两倍的空间。

2.头部和中部左右两部分的插入效率太低,因为我饿们需要将数据一个一个的往后移,所以效率不高。

 

那么我们要怎么解决这个问题呢?

1.空间上  ,按照需求给空间,比如我要101个空间就给我101个空间而不是两倍。

2.不要求物理空间上的连续,这样在头部和中部时我们就不需要挪动数据,那么这种解决方法就是用链表实现。

 

OK,我们下面就展开展开链表的知识了。


链表的概念与结构

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

其逻辑结构(这里说的逻辑结构是我们想象出来便于理解的结构):

上方逻辑结构可以是n个数据和指针,这样我们就完成了,非物理空间上的连续的表。

链表有许多结构我们今天就讲一种简单的结构——————单向链表。


 单向链表的实现
 

我们继续创建一个结构体,里面是数据和指针。

typedef int SLTDataType;
struct SListNode
{SLTDataType data;struct SListNode* next;
};
typedef struct SListNode SLTNode;

代码中将结构体命名为SLTNode是为了方便写代码。 

typedef int SLTDataType  为了易于改变数据类型时,只需将int 改成其他类型即可改变 ,整个链表的数据类型。

struct SListNode* next   这里面储存一个结构体指针用来链接下一个结构体。

既然结构体已经完成了,那么我们现在就简单用函数链接一个链表了。


链表各个功能函数

 

链表必须要找一个头,即链表的首个结构体,那么我们就将这个头命名为 plist,传给其他函数完成其功能。

现在我们就实现第一个函数,开辟空间的函数。

SLTNode* BuySListNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));newnode->data = x;newnode->next = NULL;return newnode;
}

这个函数主要用于链表的增加,在各个部位进行插入数据都需要这个函数开辟空间。 


头插函数

如何头插呢?这是我们需要思考的。

void SListPushFront(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;*pphead = newnode;
}

链表头插即开辟一块新的空间,将这块空间作为头(*pphead = newnode;),而这块空间的next则储存着原来的头结构体(newnode->next = *pphead;) 。

注意:这里要改变pist本身则我们就要使用指针进行传址,改变其地址。


 头删函数

这个函数也相较简单,我们也是将第一个节点删除,然后将第二个节点设为头节点,而第二个节点就是原来头节点里储存的 next了,我们必须先储存第二节点的地址然后再进行销毁。

void SListPopFront(SLTNode** pphead)
{SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}


尾插函数

尾插函数,我们只需先创建一个新空间newnode,然后将原来的尾的结构体中的 next 改为现在newnode 即可。但需要注意当链表还一个节点都没有的时候,原来是没有尾的,这又是一种情况,我们只需将*pphead变为newnode,即可。由此得出下面代码。

void SListPushBack(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);if (*pphead == NULL){*pphead = newnode;}else{// 找尾节点的指针SLTNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}// 尾节点,链接新节点tail->next = newnode;}
}

 


 尾删函数

尾删时我们需要考虑三种情况 

 1、空
 2、一个节点
 3、一个以上的节点

空的时候我们不需要任何操作,直接return即可。

一个节点时我们需要用free函数进行销毁空间,然后将该*phead 赋一个NULL。

一个节点i以上我们要考虑的又有些不同,因为当我们将尾节点删除时我们还需将倒数第二个节点赋为NULL不然程序可能会崩掉。我们知道找最后一个尾节点很容易但是我们要找倒数第二个节点很难 ,这里我们就需要借助第三指针变量,一前一慢进行往后遍历,最后即可得到这两个节点了。

void SListPopBack(SLTNode** pphead)
{// 1、空// 2、一个节点// 3、一个以上的节点if (*pphead == NULL){return;}else if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* prev = NULL;SLTNode* tail = *pphead;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);prev->next = NULL;}
}

 


打印函数

以NULL为链表结束标志,即打印结束。 

void SListPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;}printf("NULL\n");
}

 下面给大家展示一下这些函数:

void Test()
{SLTNode* plist = NULL;SListPushFront(&plist, 8);SListPushFront(&plist, 88);SListPushBack(&plist, 29);// 88 8 29SListPrint(plist);SListPopBack(&plist);SListPushFront(&plist, 5);SListPushBack(&plist, 89);// 5 88 8 89SListPrint(plist);SListPopFront(&plist);SListPrint(plist);//88 8 89}int main()
{Test();return 0;
}


 文章到这就结束了。

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

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

相关文章

RCS系统之:基础算法

设计仓库机器人的控制管理系统涉及到路径规划、任务分配、库存管理、通信系统等方面。以下是一个基本的仓库机器人控制管理系统方案的概述: 路径规划:设计一个路径规划系统,用于确定机器人在仓库内的最佳行驶路径,以最大程度地提…

MySQL学习记录——십일 索引

文章目录 1、理解索引2、聚簇、非聚簇索引3、操作1、主键索引2、唯一键索引3、普通索引4、注意事项 4、全文索引 1、理解索引 MySQL服务器是在内存中的,所有数据库的CURD操作都是在内存中进行,索引也是如此。索引是用来提高性能的,它通过组织…

Java 基于微信小程序的私家车位共享系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

helm部署gitlab-runner问题解决

关于.gitlab-ci.yml中build镜像时,docker守护进程未启动错误 问题截图 解决方法 conf.toml添加 [[runners.kubernetes.volumes.host_path]]name "docker"mount_path "/var/run/docker.sock"read_only falsehost_path "/var/run/dock…

【C++ STL】你真的了解string吗?浅谈string的底层实现

文章目录 底层结构概述扩容机制浅拷贝与深拷贝插入和删除的效率浅谈VS和g的优化总结 底层结构概述 string可以帮助我们很好地管理字符串,但是你真的了解她吗?事实上,string的设计是非常复杂的,拥有上百个接口,但最常用…

【简写MyBatis】01-简单映射器

前言 新开一个坑,为了学习一下MyBatis的源码,写代码是次要的,主要为了吸收一下其中的思想和手法。 目的 关联对象接口和映射类的问题,把 DAO 接口使用代理类,包装映射操作。 知识点 动态代理简单工厂模式Invocati…

HMI界面:感官与体验俱佳的智能家居界面分享

Hello,我是大千UI工场,本期分享HMI人机交互界面在智能家居领域的案例,关注大千,学习N多UI干货,有设计需求,可以联络。 设计感官和体验俱佳智能家居的UI界面时,可以考虑以下几个方面:…

Slider滑动输入条(antd-design组件库)简单使用

1.Slider滑动输入条 滑动型输入器,展示当前值和可选范围。 2.何时使用 当用户需要在数值区间/自定义区间内进行选择时,可为连续或离散值。 组件代码来自: 滑动输入条 Slider - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-de…

OpenCV-40 绘制直方图

一、使用matplotlib画直方图 可以利用matplotlib把OpenCV统计得到的直方图绘制出来 示例代码如下: import cv2 import matplotlib.pyplot as pltlena cv2.imread("beautiful women.png") # 变为黑白图片 gray cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY…

XUbuntu22.04之apt与snap如何重装软件(二百一十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

SpringBoot实现OneDrive文件上传

SpringBoot实现OneDrive文件上传 源码 OneDriveUpload: SpringBoot实现OneDrive文件上传 获取accessToken步骤 参考文档:针对 OneDrive API 的 Microsoft 帐户授权 - OneDrive dev center | Microsoft Learn 1.访问Azure创建应用Microsoft Azure,使…

《汇编语言》- 读书笔记 - 实验9 根据材料编程

《汇编语言》- 读书笔记 - 实验9 根据材料编程 需求所需的相关知识属性字节每一位的含义 分析字符位置属性 解答思路代码 效果 需求 在屏幕中间分别显示 绿色、绿底红色、白底蓝色 的字符串 welcome to masm!。 所需的相关知识 80x25 彩色字符模式显示缓冲区(以下简称为显示…

关于DVWA靶场Could not connect to the database service的几种解决办法

总的来说这个问题都是 config 配置文件没有修改正确 一般修改数据库的用户名和密码与 phpstudy 一致并且添加了 key 就能初始化成功的 但是我还遇到过另一种情况,修改了上面的东西依旧无法连接到数据库 Could not connect to the database service. Please check …

如果马斯克投资OpenAI,而不是收购推特会如何?

从去年年底开始,AIGC就开始快速流行,生成式人工智能技术的不断演变,以OpenAI受到微软的追投开始,再以ChatGPT的发布快速在互联网市场蔓延为标志性事件,进而开始引领了一场新兴人工智能的快速发展之路。 去年&#xff…

Javaweb之SpringBootWeb案例之AOP通知类型的详细解析

3.1 通知类型 在入门程序当中,我们已经使用了一种功能最为强大的通知类型:Around环绕通知。 Around("execution(* com.itheima.service.*.*(..))") public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始…

第13讲我创建的投票列表实现

新建我创建的投票页面 {"path": "pages/createVoteList/createVoteList","style": {"navigationBarTitleText": "我创建的投票"}}个人中心页面,加下 点击 “我创建的投票”跳转列表页面 goVoteList:function(){u…

阿里云服务器租用价格2024年新版活动报价和租用收费标准

2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年61元,折合5元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器165元一年,2核4G服务器30元3…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_3

《剑指Offer》笔记&题解&思路&技巧&优化_Part_3 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题1. LCR 138. 有效数字——表示数值的字符串2. LCR 139. 训练计划…

MATLAB导出图程序

本文将以代码的形式快速介绍MATLAB导出图到Paper 1 从simulation导出数 2 与simulation同源文件夹下创建导图m文件 代码如下: % 实验后的数据处理用 M-文件 % clear all % 清空工作空间 % close all      % 关闭所有图形窗口 % load adp.mat …

算法中关于数学的题目练习

算法中关于数学的题目练习 1、买不到的数目题目信息思路题解 2、蚂蚁感冒题目信息思路题解 3、饮料换购题目信息思路题解 1、买不到的数目 题目信息 思路 数学结论(证明略): p、q为正整数且互质,不能由p、q凑出来的最大的数为(p…