带你玩转单向链表(学习必备)

news2025/1/11 2:34:09

本文概要

本篇文章主要介绍数据结构中单向链表各种操作,适合有C语言基础的同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧!

🌟🌟🌟个人简介🌟🌟🌟

☀️大家好!我是新人博主朦胧的雨梦,希望大家多多关照和支持😝😝😝
🌖大家一起努力,共同成长,相信我们都会遇到更好的自己👊👊👊
🌗期待我的文章能给各位带来知识的收获和解决问题的灵感🤩🤩🤩
🌟大家的三连是我不断更新的动力😘😘😘

文章要点速览

  • 本文概要
  • 🌟🌟🌟个人简介🌟🌟🌟
  • 学习目标🏆
  • ✨一.单向链表
    • 🌲1.单向链表的定义
  • ✨二.单向链表的创建
  • ✨三.单向链表的各种操作
    • 1.增加元素
    • 2.查找元素
      • 1.根据下标查找元素
      • 2.根据数据查找元素
    • 3.修改元素数据
      • 根据下标修改元素数据
    • 4.删除元素
  • ✨四.结语
  • 💫往期好文推荐

学习目标🏆

  1.了解单向链表的结构特点

  2.掌握单向链表的创建

  3.掌握单向链表的各种操作

✨一.单向链表

🌲1.单向链表的定义

  单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。乍一看的意思就像是乍一看,每个字都认识,连在一起就成这样了:
在这里插入图片描述

其实,很简单,我用一张图来解释单向链表的结构:
在这里插入图片描述
是不是一下就清楚什么是单向链表了,关于头指针head和终端结点

  • 单链表中每个结点的存储地址是存放在其前趋结点Pnext域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。

  • 终端结点无后继,故终端结点的指针域为空,即NULL

✨二.单向链表的创建

1.首先,我们需要定义一个结构体来装着元素和指向下一个元素节点的指针

#include<stdio.h>
//定义结构体
struct Mystruct 
{
    int data;
    struct Mystruct *pnext;
 
};

2.接下来,我们创建一个无空头的链表,首先定义头尾指针(方便对链表进行
操作)

#include<stdio.h>
//定义结构体
struct Mystruct 
{
    int data;
    struct Mystruct *pnext;
 
};

int main(void)
{
	//定义头尾指针
	struct Mystruct *phead = NULL;
	struct Mystruct *pend= NULL;

	return 0;
}

3.以尾添加(尾插)为例,因为需要改变指针的指向,必须传递二级指针,现在写出我们的第一个链表

void end_add(struct Mystruct **phead,struct Mystruct **pend,int add_data)

{    //参数合法性检测
    if (NULL == phead || NULL == pend)
        return;

    //申请新节点
    struct Mystruct* new_pdode = (struct Mystruct*)malloc(sizeof(struct Mystruct));

    //检测是否申请成功
    if (NULL == new_pdode)
    {
        printf("空间申请失败");
        return;
    }

    //新节点赋值
    new_pdode->data = add_data;
    new_pdode->pnext = NULL;

    //连接
    //无节点的情况
    if (NULL == *phead && NULL == *pend)

    {
        *phead = new_pdode;

    }
    //有节点情况
    else
    {
        (*pend)->pnext = new_pdode;

    }
    *pend = new_pdode;


}

✨三.单向链表的各种操作

1.增加元素

上面讲了尾插,所以就该讲头插了:

void head_add(struct Mystruct** phead, struct Mystruct** pend, int adddata)
{
    //参数合法性检测
    if (NULL == phead || NULL == pend)
        return;

    //创造新节点
    struct Mystruct* new_pdode = (struct Mystruct*)malloc(sizeof(struct Mystruct));

    //合法性检测
    if (NULL == new_pdode)
    {
        printf("空间申请失败");
        return;
    }

    //新节点赋值
    new_pdode->data = adddata;
    new_pdode->pnext = NULL;

    //连接
    //无节点的情况
    if (NULL == *phead && NULL == *pend)

    {
        *pend = new_pdode;

    }
    //有节点的情况
    else
    {
        new_pdode->pnext = *phead;

    }
    *phead = new_pdode;

}

2.查找元素

1.根据下标查找元素

struct Mystruct* index_find(struct Mystruct* phead, int index)
{

    //参数合法性检测
    if (NULL == phead || index < 0)
        return NULL;

    //记录头指针
    struct Mystruct* p = phead;

    for (int i = 0; i < index; i++)
    {
        p = p->pnext;
    }
    return p;
}

2.根据数据查找元素

void data_find(struct Mystruct* phead, int designated_data)
{
	//参数合法性检测
    if (NULL == phead)
        return;
        
    //记录头指针    
    struct Mystruct* ptemp = phead;
    while (ptemp != NULL)
    {
        if (ptemp->data == designated_data)
        {
            printf("找到了");
            break;

        }
        ptemp = ptemp->pnext;
    }
    return;
}

3.修改元素数据

根据下标修改元素数据

void index_change(struct Mystruct *phead,int index, int change_data)
{
	//参数合法性检测
    if (index < 0)
        return;
    //调用下标查找函数
    struct Mystruct* p = index_find(phead, index);
  	//更改数据
    p->data = change_data;


}

4.删除元素

void freelist(struct Mystruct* phead)
{
	//记录头指针
	struct Mystruct* pt = phead;
	//开始删除
    while (pt != NULL)
    {
        struct Mystruct* p = pt;
        pt = pt->pnext;
        free(p);
    }
}

✨四.结语

单向链表的操作非常重要,对于新手来说。可能需要重复捋几遍思路,一旦掌握就会觉得非常简单,相信大家通过这篇文章已经可以掌握了单向链表的操作,今天就分享到这里,谢谢大家的观看,有什么想法记得评论区告诉我!拜拜~✨ ✨ ✨

💫往期好文推荐

  TOP🥇.AI工具究竟是帮手还是对手?❤️❤️❤️🏆🏆🏆❤️❤️❤️

  TOP🥈.Python爬虫 | 利用python爬虫获取想要搜索的数据(某du)❤️❤️❤️🏆🏆🏆❤️❤️❤️

  TOP🥉.ChatGPT | 一文详解ChatGPT(学习必备)❤️❤️❤️🏆🏆🏆❤️❤️❤️
在这里插入图片描述

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

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

相关文章

Redis入门到实战(实战篇)

Redis基础篇 实战篇Redis 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使…

携程:一个被严重低估了的在线旅游平台?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 携程和旅游行业面临的不利因素依然存在 在疫情期间&#xff0c;由于全球范围内的旅行受到了限制&#xff0c;所以整个旅游行业都受到了巨大打击。休闲旅游和商务旅行也陷入了停顿&#xff0c;此后一直在缓慢恢复。 而当疫情…

Java8流式操作——最终操作

什么是最终操作&#xff1f; 当我们通过最终方法对流对象进行操作&#xff0c;说明stream流操作也完成&#xff0c;最后我们将对象汇总成一个结果&#xff08;总数、对象、集合……&#xff09; 方法 collect&#xff1a;将Stream中的元素汇总&#xff08;转化&#xff09;成…

探索三维世界【2】:Three.js 的 Texture 纹理

缤纷三维世界大揭秘&#xff1a;探索 Three.js 的 Texture 纹理 1、Texture纹理2、TextureLoader 纹理加载器2.1、创建纹理加载器2.2、纹理属性设置2.3、设置纹理渲染2.4、打光 3、完整代码与展示 1、Texture纹理 Texture 是 three.js 中的“纹理”概念。纹理是指将一张图像映…

ESP8266基于Lua开发使用U8g2模块驱动 i2c ssd1306 OLED显示

ESP8266基于Lua开发使用U8g2模块驱动 i2c ssd1306 OLED显示 &#x1f4cd;相关篇《ESP8266基于Lua开发点灯示例》 &#x1f4d6;U8g2对应的API接口函数&#xff1a;https://nodemcu.readthedocs.io/en/release/modules/u8g2/ &#x1f4fa;驱动显示效果&#xff1a; &#…

Winform从入门到精通(38)——StatusStrip(史上最全)更新中

一、属性 1、Name 获取StatusStrip控件对象 2、AllowDrop 允许用户拖拽数据到控件上 3、AllowItemReorder 当用于按下alt键时,是否允许对项进行排列,如下图: 4、AllowMerge 5、Anchor 6、AutoSize 7、BackColor 设置StatusStrip的背景色 8、BackgroundImage 设置背…

解决wordpress 没有“add new“按钮

文章目录 问题描述解决方案两个参数的详细解释DISALLOW_FILE_EDITDISALLOW_FILE_MODS 问题描述 新安装的wordpress发现没有“add new“按钮&#xff0c;很奇怪。 解决方案 修改wp-config.php文件&#xff0c;增加如下两行即可修复问题&#xff1a; define(‘DISALLOW_FILE_E…

【实战详解】如何快速搭建接口自动化测试框架?:Python + Requests

摘要&#xff1a; 本篇文章将介绍如何基于Python和Requests库快速搭建一个简单而高效的接口自动化测试框架。您将会了解到设计测试用例、准备测试数据、编写自动化脚本等步骤&#xff0c;以及如何使用断言来检查测试结果&#xff0c;并最终构建一个可重用、易扩展的自动化测试…

【前端每日一问002】jquery中each与data方法的用法与概念

在 jQuery 中&#xff0c;.each() 方法和 .data() 方法都是常用的工具。这两个方法的用法和概念如下&#xff1a; &#x1f319;一、.each() 方法&#xff1a; .each() 方法是 jQuery 对象的方法&#xff0c;用于遍历匹配元素集合中的所有元素&#xff0c;并对每个元素执行一个…

【LeetCode】1000题挑战(225/1000)

1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 目录 1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 第一题&#xff1a;202. 快乐数 - 力扣&#xff08;Leetcode&#xff09; 题目接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过过过过啦…

基于W1R3S的渗透测试

您被雇来对W1R3S做渗透测试&#xff0c;他们要求您获得root权限并找到标志(位于/root目录中)。 目标&#xff1a;得到root权限&找到flag.txt 目录 1、信息收集 &#xff08;1&#xff09;定位靶机IP &#xff08;2&#xff09;端口扫描 &#xff08;3&#xff09;脚本…

【HTMLCSSJS】写实验发现的一些注意点

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f6a5;innerHtml和innerText的区别 &#x1f3f…

28-Servlet API

1.HttpServlet 我们写 Servlet 代码的时候&#xff0c;⾸先第⼀步就是先创建类&#xff0c;继承⾃ HttpServlet&#xff0c;并重写其中的某些⽅法。 1.1.核心方法 实际开发的时候主要重写 doXXX ⽅法&#xff0c;很少会重写 init / destory / service。 这些⽅法的调⽤时机&…

c++基础-运算符

目录 1关系运算符 2运算符优先级 3关系表达式的书写 代码实例&#xff1a; 下面是面试中可能遇到的问题&#xff1a; 1关系运算符 C中有6个关系运算符&#xff0c;用于比较两个值的大小关系&#xff0c;它们分别是&#xff1a; 运算符描述等于!不等于<小于>大于<…

2 异或位运算大厂必刷题

文章目录 如何不用额外变量交换两个数一个数组中有一种数出现了奇数次&#xff0c;其他数都出现了偶数次&#xff0c;怎么找到并打印这种数怎么把一个int类型的数&#xff0c;提取出最右侧的1来怎么把一个int类型的数,获取位数为1的数量一个数组中有两种数出现了奇数次&#xf…

开发问题记录20230502

4 Docker普通用户无权限 普通用户执行docker命令提示信息&#xff1a; docker images docker ps -adocker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/c…

Java 的简要介绍及开发环境的搭建(超级详细)

图片来源于互联网 目录 | CONTENT Java 简介 一、什么是 Java 二、认识 Java 版本 三、选择哪个版本比较好 搭建 Java 开发环境 一、下载 Java 软件开发工具包 JDK 二、配置环境变量 自动配置 手动配置 三、下载合适的 IDE IntelliJ IDEA Visual Studio Code Eclip…

Flutter 组件使用:使用 Stack 替代 GlobalKey 的定位 tip-widget 实现

场景 有时候需要在指定位置进行 tip-widget 的弹出与展示&#xff0c;常见的方式是通过给指定位置上的指定 widget 添加 GlobalKey 来实现&#xff1b; 但是&#xff0c;使用这种方式的话&#xff0c;【一】大多数时候都需要进行全局定位转换&#xff08;localToGlobal&#…

c++ 11标准模板(STL) std::vector (三)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

Winform从入门到精通(36)——ColorDialog(史上最全)

文章目录 前言一、属性1、AllowFullOpen2、AnyColor3、Color4、FullOpen5、ShowHelp6、SolidColorOnly7、Tag二、事件1、HelpRequest前言 当我们需要设置某个控件的颜色时,并且需要弹出一个可以选择颜色的对话框时,这时候就需要使用ColorDialog 一、属性 1、AllowFullOpen…