【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能

这篇具有很好参考价值的文章主要介绍了【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容,今天给大家带来的是有关链表的基本知识和各种接口功能的实现
好了,废话不多说,开始今天的学习吧!

一.链表的基础知识

1.链表的概念与基本结构

  • 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
  • 链表链表,表如其名,链表的结构就如同被连接起来了,只不过在中间连接链表的“绳索”是指针。
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
  • 从基本结构图中我们可以看出:
    1.链式结构在逻辑上是连续的,但与顺序表不同,在物理上链表是不一定连续的
    2.现实中,链表的节点一般都是从堆上申请出来的。
    3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。

2.链表的分类

  • 在实际中链表的结构非常多样,下面就简单的介绍几种
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

  • 虽然链表有多种结构,但是最常用的还是这两种
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
  • 1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
  • 2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我也会带大家逐一实现代码。

二.无头单链表的实现

  • 由于我们是初阶数据结构,且这是有关链表的第一篇博客,我们就先从最简单的无头单链表开始实现。
  • 首先我们先把需要的几个功能的接口列出来然后咱们来一个一个介绍。

说明:以下包括后面的所有代码的函数名称等都是我根据该函数的功能编的,也就是说这些函数名等不唯一,你也可以起别的名字,不影响链表的使用,但就像给孩子取名一样,我们都不希望我们的孩子的名字叫狗蛋,二狗子什么的,实际上,在函数的命名中你瞎起名字就和这些差不多,因此我建议无论是现在还是以后的函数的命名最好都按照功能来命名,这样既增加了代码的可读性,也让人一看便知各个函数的功能。

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDataType;
typedef struct SListNode
{
    SLTDataType Data;
    struct SListNode * next;

}SLTNode;
//打印链表
void SLTPrint(SLTNode* phead);
//初始化链表
SLTNode* BuySListNode(SLTDataType x);
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);

void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);
// 找某个数
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);

// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);

// 在pos以后插入x
void SLTInsertAfter(SLTNode* pos, SLTDataType x);

// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);

// 删除pos的后一个位置
void SLTEraseAfter(SLTNode* pos);
//修改pos位置的值
void SLTModify(SLTNode**pphead, SLTNode* pos, SLTDataType x);
// 单链表的销毁
void SListDestroy(SLTNode** pphead);
  • 注意:对接口的声明都包含在头文件中
  • 先讲一下这里面需要注意的几个地方:
  • 1.第一处的 typedef 实际是为了方便我们的使用,因为我们也不知道我们的链表是用来存储什么类型的数据的,因此我们这里就定义一个SLDataType,下面的代码中统一把数据类型用它来代替,这样一来,我们以后想要改变存储的数据类型,只需要改动这里即可,比如我们现在想要存储double类型的数据
typedef double SLDataType;
  • 2.关于我们的链表的结构体
typedef struct SListNode
{
    SLTDataType Data;
    struct SListNode * next;

}SLTNode;
  • 我们说了,我们的链表的连接是通过指针来实现的,因此我们的结构体中第一个成员是该节点存储的值,第二个成员则是一个该结构体的指针,指向的是下一个节点的地址。

1.初始化链表 BuySListNode

  • 当我们想使用我们的链表时,首先就像变量一样需要先把它初始化一下
//初始化链表
SLTNode* BuySListNode(SLTDataType x)
{
    SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
    if (newnode == NULL)
    {
        perror("malloc failed:");
        exit(-1);
    }
    newnode->Data = x;
    newnode->next = NULL;
    return newnode;

}
  • 我们首先通过malloc为我们链表的一个节点开辟了空间,然后通过perror判断了我们的malloc是否成功,如果成功,我们就把该链表的值置为我们输入的x,由于此时只有它一个节点,因此next置空,这样我们的一个节点就初始化好了。

2.打印链表 SLTPrint

  • 当我们初始化成功后,我们就想把我们的链表打印一下,看看我们的链表是否成功初始化了,因此我们继续来写打印链表的函数
//打印链表
void SLTPrint(SLTNode* phead)
{
    SLTNode* cur = phead;
    while (cur)
    {
        printf("%d->", cur->Data);
        cur = cur->next;
    }
    printf("NULL\n");
}
  • 我们定义了一个结构体指针cur指向传入的链表的表头,当cur不为空时,我们就打印一下此时该节点中的Data,并通过next找到下一个节点
  • 由于我们链表的最后一个元素是NULL,因此我们最后把链表中所有节点都打印完后,在最后再补上一个NULL。

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

  • 效果如上图

3.头插 SLTPushFront与头删 SLTPopFront

  • 头插与头删顾名思义,就是在链表表头插入节点或者删除链表表头的节点

头插

//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
    SLTNode* newnode = BuySListNode(x);
    newnode->next = *pphead;
    *pphead = newnode;
}
  • 头插的逻辑图是这样的
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

头删

//头删
void SLTPopFront(SLTNode** pphead)
{
    //空
    assert(*pphead);
    //非空;
    SLTNode* newhead = (*pphead)->next;//保存一下下一个节点的地址
    free(*pphead);
    *pphead = newhead;
}
  • 头删的逻辑图
  • 首先先判断*pphead是否为空,如果为空,说明这个链表压根不存在
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

4.尾插SLTPushBack和尾删 SLTPopBack

  • 与前面同理,尾插和尾删是作用于链表的最后的

尾插

//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
    SLTNode* newnode = BuySListNode(x);
    SLTNode* tail = *pphead;
    //链表中没有节点时
    if (*pphead == NULL)
    {
        *pphead = newnode;
    }
    else
    {
        //不为空时
        while (tail->next)
        {
            tail = tail->next;
        }
        tail->next = newnode;

    }
}
  • 我们知道链表的最后一个节点的next存放的地址为空,我们来通过逻辑图分析一下
  • 首先还是特殊情况,当我们的链表中没有节点时,那我们就把头指针直接指向需要插入的节点就行。
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

尾删

//尾删
void SLTPopBack(SLTNode** pphead)
{
    //为空
    assert(*pphead);
    //只有一个节点
    if ((*pphead)->next == NULL)
    {
        free(*pphead);
        *pphead = NULL;
    }
    //不为空且有多个节点
    else
    {
        SLTNode* tail = *pphead;
        while (tail->next->next)
        {
            tail = tail->next;
        }
        free(tail->next);
        tail->next = NULL;


    }
}
  • 还是先来分析特殊情况,先通过assert断言来判断一下该链表是否为空,其次,如果这个链表只有一个节点时,我们指向把该节点free释放掉再置空即可,不需要其他操作。
  • 一般情况的逻辑图
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++
    【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++

总结

  • 由于篇幅有限,今天的内容到这里就结束了,之后我们会把剩下没讲的接口讲完然后再带大家做几道oj题让大家更加熟悉链表的使用。相信如果你能一直跟着坚持下去那么你链表这一块的初阶知识就一定没什么问题啦!切记要自己上手敲敲代码哦!

  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能,初阶数据结构,数据结构,链表,c语言,c++文章来源地址https://www.toymoban.com/news/detail-622746.html

到了这里,关于【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Activiti7(图文并茂)

    Activiti 是由 jBPM (BPM,Business Process Management 即业务流程管理) 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解 决方案。 Activiti 作为一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计

    2024年02月06日
    浏览(37)
  • secureCRT安装和使用教程【图文并茂】

    简介 一般而言,嵌入式开发板使用串口来监控后台。可以使用串口线连接开发板和电脑,对于没有串口的笔记本电脑来说,一般还需要一根USB转串口线。 串口线 串口软件多种多样,比如secureCRT、Xshell、超级终端、miniCom、putty等,它们的功能大同小异,因此只需安装用的顺手

    2024年02月03日
    浏览(71)
  • RabbitMQ入门篇【图文并茂,超级详细】

    接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 🥳🥳Welcome 的Huihui\\\'s Code World ! !🥳🥳 前言 1.什么是MQ 2.理解MQ 3.生活案例分析与理解 4.MQ的使用场景 (1)解耦 传统模式 中间件模式 (2)削峰 传统模式 中间件模式 (3)异步  传统模式 中间件模式 5.常见的MQ 一. Rab

    2024年01月20日
    浏览(31)
  • 发送图文并茂的html格式的邮件

    本文介绍如何生成和发送包含图表和表格的邮件,涉及echarts图表转换为图片、图片内嵌到html邮件内容中、html邮件内容生成、邮件发送方法等 因为html格式的邮件不支持echarts,也不支持js执行,所以图表需要转换为图片内嵌在邮件内容中 因为平台首页相关统计都是使用echarts渲

    2024年02月11日
    浏览(29)
  • 归并排序Java版(图文并茂思路分析)

    工作原理是将一个大问题分解成小问题,再将小问题分解成更小的。(乍一看就觉得是像一个递归)就像下图这样。然后不断的将其一份为二,分解成更小的排序。 我们设一个函数叫MergeSort(arr,l,r)意思就是将arr数组下标为[ l ,r ]之间的数进行排序。 那么就开始不断的

    2024年02月06日
    浏览(30)
  • Java 线程池详解,图文并茂,还有谁不会?!

    来源:blog.csdn.net/mu_wind/article/details/113806680 我们知道,线程的创建和销毁都需要映射到操作系统,因此其代价是比较高昂的。出于避免频繁创建、销毁线程以及方便线程管理的需要,线程池应运而生。 降低资源消耗 :线程池通常会维护一些线程(数量为 corePoolSize),这些线

    2024年02月06日
    浏览(33)
  • Flutter 图文并茂:打造交互丰富的应用界面

    Flutter作为一种现代的UI工具包,为开发者提供了丰富的工具和小部件,轻松构建漂亮、响应迅速的应用界面。本篇博客将带你踏入Flutter的世界,学习如何巧妙运用图片、按钮、图标,以及行与列进行布局,打造令人惊艳的用户交互体验。 无论你是Flutter初学者还是有一定经验

    2024年02月03日
    浏览(27)
  • NodeMCU ESP8266开发流程详解(图文并茂)

    NodeMCU ESP8266基于Arduino IDE的开发相对来说还是比较容易上手的,我们基本需要以下几个东西; 一台安装好Arduino IDE的PC,并且已经部署环境(安装好开发板的串口驱动); NodeMCU ESP8266 开发板; USB线(根据实际开发板的情况,本文需要Micro-USB的线); 具体如下图所示; 本文默

    2024年02月06日
    浏览(38)
  • 什么是感知机——图文并茂,由浅入深

    生活中常常伴随着各种各样的逻辑判断,比如看到远方天空中飘来乌云,打开手机看到天气预报说1小时后40%的概率下雨,此时时候我们常常会做出等会下雨,出门带伞的判断。 上述思考过程可以抽象为一个”与“的”神经逻辑“。当”看到乌云“和”天气预报40%下雨“同时

    2023年04月20日
    浏览(28)
  • Canvas鼠标滚轮缩放以及画布拖动(图文并茂版)

    本文会带大家认识Canvas中常用的坐标变换方法 translate 和 scale,并结合这两个方法,实现鼠标滚轮缩放以及画布拖动功能。 Canvas 绘图的缩放以及画布拖动主要通过 CanvasRenderingContext2D 提供的 translate 和 scale 两个方法实现的,先来认识下这两个方法。 translate 方法 语法: trans

    2023年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包