单向链表(c/c++)

2023-10-31

链表是一种常见的数据结构,其中运用到了结构体指针,链表可以实现动态存储分配,换而言之,链表是一个功能强大的数组,可以在某个节点定义多种数据类型,可以实现任意的添加,删除,插入节点等。(废话结束

前置知识:

地址,结构体,malloc函数与循环选择结构。


那我们先来学习一下malloc函数:

/*
格式为
(数据类型*)malloc(申请内存大小)
malloc函数可以通过传入要申请的内存大小在总堆里申请内存
之后会回归一个地址,在其前面的(数据类型*)是将这个地址定义
为要求数据类型。
*/

int* ptr=(int*)malloc(sizeof(int));
/*
sizeof是一个传入数据类型,返回其所占内存的函数
那么sizeof(int),就是一个int类型的数所占的内存
之后将申请到的内存转换为int类型存储
*/

int* ptd=(int*)malloc(5*sizeof(int));
//申请的内存大小为5*sizeof(int)也就是五个int类型的数字

之后我们来看通过结构体定义的链表节点

typedef struct Node{
    int data;//存储数据
    Node* next;//存储下个结点地址
}Node;//将结点名定义为Node

typedef Node* List;//相当于Node List[]
//一个结点数组就是一个链表

将多个结点通过next相连就变成了一个链表。


链表操作

        链表操作一般分为六部分:建立链表,插入结点,删除结点,查找结点,更新结点,遍历链表。我们将这六步写为六个函数依次实现。

建立链表:

        创建一个空链表,初始化头节点,并将头节点的指针置为NULL(在这里提一下,链表是没有规定长度的,我们一般在遍历到结点->next==NULL时认为链表结束)

void BuildList(List& L){
    node=(Node*)malloc(sizeof(Node));//申请一个结点内存
    //申请内存
    if(!node){//node==NULL时
        cout<<"申请失败\n";
        return;
    }
    node->next=NULL;
}

调用函数后,链表结构如下:(一个结点,data为空,看作头节点)

插入结点:

        插入结点分为两种方式:头插法和尾插法,我们通过动图来演示一下

        尾插法:

        头插法:

可以比较清楚的看出两者的差异,尾插法是将新建结点插入到链表末尾,头插法是将新建结点插入到链表头节点后面。下面分别是两种方法的代码实现:

void Postinsert(List& L){//尾插法
	Node* node=(Node*)malloc(sizeof(Node));
	//申请一个结点内存
	
	L->next=node;
	//尾结点更新为node 
	
	node->next=NULL;
	//尾结点下一位为NULL 
}
void Preinsert(List& L){//头插法
	Node node=(Node*)malloc(sizeof(Node));
	//申请一个结点内存
	
	node->next=L->next;
	//node结点下一位应为原来头节点下一位 
	
	L->next=node;
	//将node放入头节点的next位 
}

删除结点:

        找到要删除的节点,并将其删除,之后将删除节点的两侧相连。

        动图演示如下:

代码实现如下:

void DeleteNode(List& L,int t){//删除第t个结点
    Node* node=L->next;
    //定义结点指针
    Node* pre=L;
    //定义结点前一位指针
    
    while(--t){
    //while循环遍历第t个结点
        if(node==NULL){//当结点不存在时
            cout<<"此结点不存在\n";
            break;
        }
        pre=node;
        node=node->next;
        //更新pre,node指针
    }
    free(node);//释放内存   
}

查找结点:

        查找到 data为t 结点位于链表的第几位,并return位置

        动图演示如下:

        

代码实现如下:

int SearchNode(List& L,int T){//查找data为T的结点
    int cnt=1;//记录位数
    Node* node=L->next;
    while(node!=NULL){
        if(node->data==T)
            return cnt;
        //找到时return位数
        
        node=node->next;
        cnt++;//更新node指针与位数
    }
    cout<<"未找到结点\n";
    return -1;
}

更新结点:

        找到要更新的节点位置,并将其data更新。

        动图演示如下:

        

void UpdateNode(List& L,int a,int b){//将第a个结点data更新为b
    Node* node=L->next;
    //定义结点指针
    
    int cnt=1;
    //cnt用于计数
    
    while(node!=NULL){
        //while循环遍历找到第a个结点
        
        if(cnt==a){//找到结点时
            node->data=b;//update
            break;       //停止循环
        }
    
        cnt++;
        node=node->next;
        //更新cnt和结点指针
    }
    if(node==NULL)//结点不存在时
        cout<<"该结点不存在\n";
}

遍历链表:

        遍历整个链表,输出每个结点的值

        动图演示如下:

代码实现如下:

void ErgodicList(List& L){//遍历输出
    Node* node=L->next;
    cout<<"链表遍历结果如下:\n";
    while(node!=NULL){
        cout<<node->next<<" ";
        node=node->next;
    }
    cout<<"\n";
}

结束


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单向链表(c/c++) 的相关文章

  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的

随机推荐

  • idea右键建包无package(无class等之类的同样适用)

    Intelidea创建好项目之后 右键新建Java class的时候发现没有改选项 只有以下几个选项 把src目录设为源码目录 首先打开Project Structure 如果有test测试文件夹就选中然后点Test按钮 最后点击OK完成
  • Taro和uniapp的区别?

    最近这段时间 因为工作需要 学习认识了taro 因为以前也用过uniapp 因此也对这两款跨端开发框架做了一些对比 总结如下 1 体积不同 Taro使用esbuild打包 虽然打包速度提升 但是打包后体积还是大 uniapp使用vite打包
  • MongoDB(Roboit3T)中导出集合数据

    C MongoDB bin mongoexport d MES LOCAL c Employee o C Employee json 这里导出的是MES LOCAL数据库下的 Employee文档 一 先从数据库中导出文档 平板中的数据 导
  • awk与shell之间的变量传递方法

    http renyongjie668 blog 163 com blog static 16005312011829102025222 在linux下awk是个好东东 处理一些文本文件会非常方便 而在Linux下嘛 经常会和shell打交道
  • GB2312编码规则与代码实现

    GB2312编码范围 A1A1 FEFE 其中汉字编码范围 B0A1 F7FE 汉字编码 第一字节0xB0 0xF7 对应区号 16 87 第二个字节0xA1 0xFE 对应位号 01 94 GB2312编码是第一个汉字编码国家标准 是由中
  • BaseAdapter几个重载方法介绍isEnabled,getViewTypeCount ,getItemViewType

    http blog csdn net nullreference article details 7912588 public boolean isEnabled int position 如果列表的一项item是separator 充当分
  • Redisson Map踩坑姿势

    使用Java的Redisson客户端时 踩了一些坑 分享再次 供大家参考 因此引发的一次故障及排查过程参见 记一次线上 内存泄露 故障 RMapCache的坑 RMapCache的坑要从Redisson中Map结构的元素淘汰机制说起 详见
  • (python)牛客网(华为机试一)——入门

    本博客为博主解题的部分记录 由于均为自己写的 所以答案并非最优解 有很多地方可以优化 其他题解合集 python 牛客网 华为机试二 简单 python 牛客网 华为机试三 中等 python 牛客网 华为机试四 较难 题目 HJ17 取近
  • c++模板与泛型编程

    函数模板 template
  • git clone弹出登录验证框 登录无效 -Windows环境

    git篇 git clone弹出登录验证框 登录无效 Windows环境 在这里插入图片描述 使用git clone下载代码的时候 弹出github登录界面 确认账户密码正确的情况下 依旧重复弹出 原因是Github 禁用了TLS v1 0
  • 他98年的,我玩不过他...

    现在的小年轻真的卷得过分了 前段时间我们公司来了个98年的 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个人
  • LeetCode 之 剑指 Offer 24. 反转链表(Java)

    文章目录 LeetCode 之 剑指 Offer 24 反转链表 Java 一 题目 二 解题思路 三 代码 LeetCode 之 剑指 Offer 24 反转链表 Java 一 题目 剑指 Offer 24 反转链表 定义一个函数 输入一
  • 大数据处理框架MapReduce

    大数据处理框架MapReduce是一种用于处理大规模数据集的编程模型和计算框架 它能够将大规模数据集分解为多个小的数据块 并在分布式计算环境中进行并行处理 MapReduce采用了一种简单而有效的数据处理模式 由两个主要的阶段组成 Map阶
  • Sublime Text 3 装了Anaconda 写Python代码出现框框的解决办法

    Sublime Text 3代码提示插件Anaconda下载 http damnwidget github io anaconda carousel features 安装后写代码出现白框 光标移到白框行 下方状态栏里可以看到错误信息 可见
  • 80.带权的无向图

    带权的无向图 include
  • 如何用GPT轻松搞定一篇毕业论文。

    大家好 我是五竹 心血来潮整理了一份手册 ChatGPT学习指南 并且将为小白们持续更新和GPT相关的资源和教程 专注于打造一部最好的GPT入门指南 欢迎大家转发 收藏 点赞支持 谨防失联 下面 我将如何使用GPT写论文的步骤分享给大家 1
  • 怎么把半角引号替换成全角_巧妙批量互换全角与半角双引号

    工作中时常会遇到使用英文标点符号的文章 如图 2 38所示 为了规范文件编排 通常需要将所有的英文标点符号转换为中文标点符号 即达到如图 2 39所示的效果 使用查找和替换功能可以快速完成这一工作 下面以替换半角双引号为例进行介绍 图2 3
  • 3D游戏设计——UI系统

    HW9 1 血条 Health Bar 的预制设计 具体要求如下 分别使用 IMGUI 和 UGUI 实现 使用 UGUI 血条是游戏对象的一个子元素 任何时候需要面对主摄像机 分析两种实现的优缺点 给出预制的使用方法 IMGUI 使用一个
  • Python如何使用Any和All?代码示例和解析

    Any和All是python中提供的两个内置插件 用于连续的And Or Any 如果任何一项为True 则返回true 如果为空或全部为假 则返回False 可以将任何内容视为对提供的可迭代对象进行的一系列OR操作 它将执行短路 即一旦知
  • 单向链表(c/c++)

    链表是一种常见的数据结构 其中运用到了结构体指针 链表可以实现动态存储分配 换而言之 链表是一个功能强大的数组 可以在某个节点定义多种数据类型 可以实现任意的添加 删除 插入节点等 废话结束 前置知识 地址 结构体 malloc函数与循环选