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

news2025/1/15 22:39:32

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发

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

链表

  • 一.无头链表的实现
    • 1.查找某个节点 SLTFind以及修改某个节点的数 SLTModify
      • 查找某个节点是否存在
      • 修改某个节点的数
    • 2.在pos之前插入值 SLTInsert与在pos之后插入值 SLTInsertAfter
      • 在pos之前插入值
      • 在pos后插入x
    • 3.删除pos位置的值 SLTErase以及删除pos下一位的值 SLTEraseAfter
      • 删除pos位置的值
      • 删除pos后一位的值
    • 4.单链表的销毁
  • 总结

一.无头链表的实现

  • 我们上回链表的接口功能实现到了尾插和尾删,我们下面接着上回的内容继续我们链表的学习。
#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.查找某个节点 SLTFind以及修改某个节点的数 SLTModify

查找某个节点是否存在

//找某个节点是否存在
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{
    SLTNode* cur = phead;
    while (cur)
    {
        if (cur->Data == x)
            return cur;
        cur = cur->next;
    }
    printf("该节点不存在\n");
    return NULL;
}
  • 对于查找来说,我们只需要遍历一下链表依次比较一下每个节点存放的Data是否与我要找的x相等即可,如果到最后都不相等,说明链表中没有该节点

修改某个节点的数

//修改某个节点的值
void SLTModify(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
    pos->Data = x;
}

  • 这个与上面的查找函数联动即可,我先找到这个节点是否存在,如果能找到,我就把该节点的Data改为我想要的x就行。
  • 示例如下:
void TestSList2()
{
    int n = 0;
    int x = 0;
    printf("请输入需要定义的链表的长度:\n");
    scanf("%d", &n);
    printf("请输入需要放入链表中的元素,中间用空格隔开\n");
    SLTNode* plist = NULL;

    int val = 0;
    for (size_t i = 0; i < n; i++)
    {
        scanf("%d", &val);

        SLTPushBack(&plist, val);


    }
    SLTPrint(plist);
    //SLTFind(plist, 5);
    printf("请输入要修改的值\n");
    scanf("%d", &x);
    SLTNode* pos = SLTFind(plist, x);
    if (pos)
    {
        int m;
        printf("请输入要把该节点修改成什么值:\n");
        scanf("%d", &m);
        SLTModify(&plist, pos, m);
    }
    SLTPrint(plist);
}

在这里插入图片描述

2.在pos之前插入值 SLTInsert与在pos之后插入值 SLTInsertAfter

在pos之前插入值

// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
    SLTNode* cur = *pphead;
    SLTNode* newnode = BuySListNode(x);
    //如果没有节点时就得头插
    assert(pphead);
    assert(pos);
    if (pos == *pphead)
    {
        SLTPushFront(pphead, x);
    }
    else {
        while (cur->next)
        {
            if (cur->next->Data == pos->Data)
            {
                cur->next = newnode;
                newnode->next = pos;
            }
            cur = cur->next;

        }
    }
}
  • 特殊情况的分析:
  • 在pos之前插入我们得考虑这些地方:1,pos是否合法? 2.pphead是否为空
  • 当我们判断完上面两个后,我们现在就要考虑pos的特殊插入了,如果我们pos就在链表头部时,此时我们的pos之前插入就相当于我们的头插,如果不是,我们来通过逻辑图分析一下一般情况
    在这里插入图片描述
    在这里插入图片描述

在pos后插入x

// 在pos以后插入x
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
    SLTNode* cur = BuySListNode(x);
    cur->next = pos->next;
    pos->next = cur;

}
  • 这部分就比较简单啦,我们通过与之前的SLTFind找到pos的位置,把它next里下一个节点的地址给我们要插入的cur,再让pos的next指向cur就行了。

3.删除pos位置的值 SLTErase以及删除pos下一位的值 SLTEraseAfter

删除pos位置的值

// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
    SLTNode* cur = *pphead;
    assert(pos);
    assert(pphead);
    if (pos == *pphead)
    {
        SLTPopFront(pphead);
    }
    
    else
    {
        while (cur)
        {
            if (cur->next == pos)
            {
                cur->next = pos->next;
                free(pos);
            }
            cur = cur->next;
        }

    }
        
}
  • 对于断言的分析同上这里不赘述,我们这里是删除,当pos在表头时,删除这个节点,就是我们的头删,当一般情况时,逻辑分析图如下:
    在这里插入图片描述

在这里插入图片描述

删除pos后一位的值

// 删除pos的后一个位置
void SLTEraseAfter(SLTNode* pos)
{
    assert(pos);
    //检查是否是尾节点
    assert(pos->next);
    pos->next = pos->next->next;
    free(pos->next);
    pos->next = NULL;
}
  • 这个我们既然知道pos了,想删除pos的下一个直接把pos的next指向下一个节点的next即可,最后再free(pos->next),然后置空。

4.单链表的销毁

  • 当我们的链表用完后,由于我们的单链表是动态开辟的,所以也需要free释放一下然后置空。
// 单链表的销毁
void SListDestroy(SLTNode** pphead)
{
    assert(pphead);
    SLTNode* cur = *pphead;
    while (cur)
    {
        SLTNode* next = cur->next;
        free(cur);
        cur = next;
    }
    *pphead = NULL;
}
  • 通过遍历的方式把每个节点都给free释放,最后把头指针置空,链表销毁。

总结

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

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

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

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

在这里插入图片描述

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

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

相关文章

Gitignore忽略文件

默认情况下&#xff0c;Git会监视我们项目中的所有内容&#xff0c;但是有些内容比如mode_modules中的内容&#xff0c;我们不希望他被Git所管理。 我们可以在我们项目目录中添加一个 .gitignore 文件来设置那些需要git忽略的文件。

Burpxss自动化测试工具validator配置和使用教程

一、配置教程 下载Phantomjs&#xff1a; http://phantomjs.org/download.html 下载xss.js https://github.com/nVisium/xssValidator 将xss.js和phantomjs.exe放在一起 利用phantomjs运行xss.js C:\xss>phantomjs.exe xss.js Bapp store里搜索xss validator,然后安装它 安…

基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 这里给大家提供一种…

node.js系列-常见问题处理方案(持续更新)

问题1&#xff1a;nodejs 如何使用 atob、btoa 解决方案&#xff08;base64与uint8array转换&#xff09;&#xff0c;btoa和atob在nodejs中应该怎么写&#xff1f; 浏览器中我们可以这样使用&#xff1a; btoa(123456) MTIzNDU2 atob(MTIzNDU2) 123456node.js中实现方案 con…

国内GitHub加速访问工具-Fetch GitHub Hosts

一、工具介绍 Fetch GitHub Hosts是一款开源跨平台的国内GitHub加速访问工具&#xff0c;主要为解决研究及学习人员访问 Github 过慢或其他问题而提供的 Github Hosts 同步工具。 项目原理&#xff1a;是通过部署此项目本身的服务器来获取 github.com 的 hosts&#xff0c;而…

LeetCode //C - 289. Game of Life

289. Game of Life According to Wikipedia’s article: “The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970.” The board is made up of an m x n grid of cells, where each cell…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

Gogs Git windos服务搭建指南

Gogs Git服务器搭建指南 背景&#xff1a; 近期在Linux 麒麟 v10 系统上开发&#xff1b;为了团队协同编程&#xff1b;选用了Git服务器&#xff1b;之前在windos开始时候使用的visualSVN server; visualSVN server从4.x.x.x开始收费&#xff1b;限制15个开发者用户&#xff…

带头循环双向链表详解

目录 一、什么是带头循环双向链表&#xff1f; 1.特点&#xff1a; 2.优点&#xff1a; 二、实现接口 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口实现 2.1函数创建新节点 2.2打印链表内容 2.3尾插新节点 2.4头插新节点 2.5头删节点 2.6尾删…

Vue3_04_ref 函数和 reactive 函数

ref 函数 声明变量时&#xff0c;赋值的值要写在 ref() 函数中修改变量时&#xff0c;变量名.value xxx在模板中使用时可以省略掉 .value&#xff0c;直接使用变量名即可 <template><h1>一个人的信息</h1><h2>姓名&#xff1a;{{name}}</h2><…

pjsip、pjsua2+bcg729 windows下编译java版本

文章目录 简要说明流程步骤 简要说明 基本参考的这里 https://docs.pjsip.org/en/latest/get-started/windows/build_instructions.html#building-the-projects 我这里主要是为了生成pjsua2.dll 用于在java下调用。 其中 libbcg729.dll 是通过vcpkg来进行安装。 pjsip使用vs2…

【Autoresizing案例03-通过代码设置Autoresizing Objective-C语言】

一、通过代码实现Autoresizing 1.好,那么,接下来,我们就给大家看一下,怎么来通过代码实现Autoresizing, 好,那么,接下来,我们为什么要说这个通过代码,实现Autoresizing, 那么,注意,我们能通过我们的storyboard来操作,就不要通过代码来实现, 以后的趋势,就是苹…

使用Git在GitHub上部署静态页面

在GitHub中&#xff0c;我们可以将自己的静态页面部署到GitHub中&#xff0c;它会给我们提供一个地址使得我们的页面变成一个真正的网站&#xff0c;可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…

Vulnhub: BlueMoon: 2021靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.174 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.174 80端口目录爆破&#xff0c;发现文件&#xff1a;hidden_text gobuster dir -u http://192.168.111.174 -w /usr/sha…

二重积分1

目录 二重积分 二重积分的性质 ​编辑 中值定理 二重积分的计算 方法1&#xff1a;利用直角坐标计算 方法2&#xff1a;利用极坐标进行计算 适用于极坐标的二重积分的特征 对称性和奇偶性的应用 题目 例题1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#x…

【Spring框架】Spring AOP

目录 什么是AOP&#xff1f;AOP组成Spring AOP 实现步骤Spring AOP实现原理JDK Proxy VS CGLIB 什么是AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理。⽐如…

C++11的range-based for loop(基于范围的循环)

2023年8月3日&#xff0c;周四上午 目录 语法举例说明 语法 for(能存放容器元素的变量:容器){//函数体 } 容器可以是数组、CSTL容器等 这个变量会自动遍历容器里面的每个元素 举例说明 #include<vector> #include<iostream>int main(){/*--------------------…

innovus: 让ndr使用自定义via def

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 让ndr 使用指定via def可以用add_ndr -via命令&#xff0c;如果现有的via list无法满足要求&#xff0c;可以用 add_via_definition -via_rule -row_col去创建。

跨境电商代运营模式,Live Market打造跨境电商出海SaaS服务平台

近年来&#xff0c;我国跨境电商发展取得可喜进展。商务部数据显示&#xff0c;跨境电商货物进出口规模占外贸比重由5年前的不足1%上升到目前的5%左右。私域流量业态在电商领域兴起&#xff0c;品牌企业在线上建立自主经营的手机应用软件直接触达用户。跨境电商的发展模式转向平…