返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++如何实现单链表
  • 726
分享到

C++如何实现单链表

2023-06-29 18:06:15 726人浏览 独家记忆
摘要

小编给大家分享一下c++如何实现单链表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单链表的实现(从入门到熟练)概念和结构概念:链表是一种物理存储结构上非连续、非

小编给大家分享一下c++如何实现单链表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

单链表的实现(从入门到熟练)

概念和结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构

数据元素的逻辑顺序是通过链表中的指针链 接次序实现的

图示:

C++如何实现单链表

注意:

链表结构在逻辑上为连续的,但是物理上(内存中)不一定连续

链表节点都是在堆上申请出来的,申请空间按一定策略分配

结构种类

链表具有多种结构:单向\双向,带头\不带头,循环\非循环

实际上最常用的是:无头单向非循环链表,带头双向循环链表

链表的实现

注意:这里实现的是无头单向非循环链表

增删查改接口
// 动态申请一个节点SListnode* BuySListNode(SLTDateType x);// 单链表打印void SListPrint(SListNode* plist);// 单链表尾插void SListPushBack(SListNode** pplist, SLTDateType x);// 单链表的头插void SListPushFront(SListNode** pplist, SLTDateType x);// 单链表的尾删void SListPopBack(SListNode** pplist);// 单链表头删void SListPopFront(SListNode** pplist);// 单链表查找SListNode* SListFind(SListNode* plist, SLTDateType x);// 单链表在pos位置之后插入xvoid SListInsertAfter(SListNode* pos, SLTDateType x);// 单链表删除pos位置之后的值void SListEraseAfter(SListNode* pos);
节点结构体创建
typedef int SLTDateType;typedef struct SListNode{ SLTDateType data; struct SListNode* next; }SListNode;
节点开辟

对于链表来说,每需要空间就需要进行开辟,这里我们将之封装成一个函数,便于后续调用直接使用(开辟的同时进行赋值)

参考代码:

//链表节点开辟SLTNode* BuySListNode(SLTDateType x){//动态分配一个节点SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){//分配失败则打印错误信息并结束进程perror("newnode fail:");exit(-1);}//成功则进行赋值newnode->data = x;newnode->next = NULL;//返回节点地址,以便后续操作return newnode;}
数据打印

注意:

对于不带头的链表来说,打印数据不需要修改链表首节点地址(故只要传链表指针)

用循环遍历链表,每打印数据,需要指向下一个节点

依靠尾节点的址域为NULL来结束循环

代码:

//链表数据打印void SListPrint(SLTNode* phead)//一级指针接收一级指针(打印不需改变指针本身内容){//创建一个寻址指针SLTNode* cur = phead;while (cur!=NULL)//后续还有节点{//打印数据并指向下一个节点printf("%d->", cur->data);cur = cur->next;}//最后打印空指针printf("NULL\n");return;}
链表尾插数据
  • 要尾插数据则需要遍历找到链表的尾节点

  • 对于不带头链表,尾插数据也可能是插在链表首元素的地址(当链表为空),需要修改链表指针的内容(故需要传入链表指针的地址)

  • 插入数据要开辟节点

代码:

//链表尾插数据void SListPushBack(SLTNode** pphead, SLTDateType x)//二级指针接收一级指针(尾插存在需改变链表指针本身内容){//避免传入错误(直接报错便于找到错误位置)assert(pphead);//接收新节点的地址SLTNode* newnode=BuySListNode(x);//头节点为空if (*pphead == NULL){*pphead = newnode;}else{//找尾节点SLTNode* tail = *pphead;//创建寻址节点//两个及以上节点的情况while (tail->next != NULL){//指向下一个节点tail = tail->next;}//找到了tail->next = newnode;}return;}

注意代码中的assert的作用:

  • 正确传入链表指针的地址是不会为空的

  • 但是对于非正常传入链表指针(不是链表指针的地址)且此时链表指针为空则会发生报错(assert报错会告诉错误位置),告诉程序员应该传入链表指针的地址

头删

注意:

  • 删除前需要保存当前节点的址域(即保存下个节点的空间地址,以防丢失)

  • 前删数据即删除当前链表首节点,即需修改链表指针的内容(故需传入链表指针的地址)

  • 删除后修改链表指针内容,指向新的首节点

  • 如果链表为空时无法删除(保存下个节点地址会造成非法访问)

代码:

//链表前删数据void SListPopFront(SLTNode** pphead){//避免传入错误(直接报错便于找到错误位置)assert(pphead);//链表为空的情况if (*pphead == NULL){return;}//创建指针保存第二个节点地址SLTNode* next = (*pphead)->next;//释放当前头结点空间free(*pphead);//更新头结点数据*pphead = next;return;}
链表数据查找

注意:

  • 查找时用循环遍历链表

  • 对于查找数据不用修改链表指针的内容,故只需传入链表指针就行了

  • 查找到时则返回节点地址,否则返回NULL

代码:

//链表数据查找SLTNode* SListFind(SLTNode* phead, SLTDateType x){//创建寻址指针SLTNode* cur = phead;while (cur!=NULL){if (cur->data == x)//找到数据符合节点{return cur;//返回节点地址(好处:以便后续再寻找或修改)}else{//找下一个节点cur = cur->next;}}//未找到数据符合节点return NULL;}
链表pos位置前插数据

注意:

  • 想要pos位置前插数据,不仅需要找到pos位置,还需要记录pos的前一个节点位置

  • 传入的pos为NULL则报错

  • 进行修改前节点的址域成新节点,并让新节点的址域修改成pos,这才是一个成功的pos位置前插数据

  • 循环遍历链表查找pos位置,没有找到pos位置则什么也不干

代码:

//链表pos位置往前插入(较难)(还有在pos位置之后插入,简单点)void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x){//避免传入错误(直接报错便于找到错误位置)assert(pphead);assert(pos);SLTNode* newnode = BuySListNode(x);//首结点符合的情况if (*pphead == pos){newnode->next = *pphead;*pphead = newnode;}else{//创建寻址指针SLTNode* cur = *pphead;while (cur !=NULL){if (cur->next!= pos){cur = cur->next;//找到下一节点}else // 找到对应空间{cur->next = newnode;newnode->next = pos;return;//结束寻找(否则会一直插入,造成死循环)}}}//未找到则什么也不干return;}
链表pos位置后插数据

注意:

  • 后插则不用关注是否为首节点

  • 也不用找到遍历找到前节点的位置

  • 后插则先将新节点址域改成pos后节点地址再将pos的址域改成新节点地址

ps:一定要注意修改链接节点址域的先后,避免地址的丢失

代码:

//链表pos位置往后插入void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x){SLTNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;return;}
链表pos位置数据删除

注意:

  • 考虑删除首节点的情况,可能修改链表指针的内容,故需要传入链表指针的地址

  • 对于删除节点,需要先保存pos位置下一个节点地址,将pos位置释放,再将pos位置前节点的址域改成pos位置后节点的地址,这才是成功的删除pos位置节点

  • 循环找pos位置,没找到则什么也不干

参考代码:

//链表pos位置删除void SListErase(SLTNode** pphead, SLTNode* pos){//避免传入错误(直接报错便于找到错误位置)assert(pphead);assert(pos);//头结点符合的情况if (*pphead == pos){*pphead = (*pphead)->next;free(pos);}else{//创建寻址指针SLTNode* cur = *pphead;while (cur != NULL){if (cur->next != pos){cur = cur->next;//找到下一节点}else // 找到对应空间{SLTNode* next = cur->next->next;free(cur->next);cur->next = next;return;//结束寻找}}}//未找到则什么也不干return;}
链表节点释放

注意:

  • 对于动态开辟的内存空间,在使用后一定要记得的进行释放(避免造成内存泄漏)

  • 因为链表节点是一个个开辟的,同样的释放也需要一个个进行释放

  • 循环遍历释放当前节点前需保存后一个节点的地址,避免地址丢失无法释放

  • 释放完后,还需将链表指针给置空(避免使用野指针)

参考代码:

//链表节点释放void SListDestory(SLTNode** pphead){//避免传入错误(直接报错便于找到错误位置)assert(pphead);//遍历释放SLTNode* cur = *pphead;while (cur){//保存下一个地址SLTNode* next = cur->next;free(cur);cur = next;}//置空*pphead = NULL;return;}

链表与顺序表区别

链表的优缺点

优点

  • 按需申请空间(空间使用合理)

  • 插入效率高(不用像顺序表样挪动数据)

缺点

  • 不支持随机访问(无法用下标直接访问)

顺序表的优缺点

优点

  • 支持随机访问 (有些算法需要结构支持随机访问:二分查找,快排等)

缺点

  • 扩容空间有消耗(空间碎片化以及空间浪费)

  • 插入数据需要挪动数据有消耗

以上是“C++如何实现单链表”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C++如何实现单链表

本文链接: https://lsjlt.com/news/326042.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++如何实现单链表
    小编给大家分享一下C++如何实现单链表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单链表的实现(从入门到熟练)概念和结构概念:链表是一种物理存储结构上非连续、非...
    99+
    2023-06-29
  • C++详解如何实现单链表
    目录单链表单链表的基本操作1.初始化2.取值3.查找4.插入5.删除示例代码开发环境运行结果单链表 链表内存空间不一定连续,其扩展性较好。多余的不多说了。该文主要记录单链表的实现,该...
    99+
    2024-04-02
  • C++和python如何实现单链表
    这篇文章给大家分享的是有关C++和python如何实现单链表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、链表的基本概念链表是数据元素的线性集合(Linear Collection),物理存储不连续。那么,这...
    99+
    2023-06-29
  • C语言中单链表如何实现
    这篇文章主要介绍“C语言中单链表如何实现”,在日常操作中,相信很多人在C语言中单链表如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中单链表如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • C语言如何实现单链表操作
    本篇内容介绍了“C语言如何实现单链表操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 链表的概念及结构概念:链表是一种物理存储结构上非连...
    99+
    2023-06-29
  • php如何实现单链表
    本文将为大家详细介绍“php如何实现单链表”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php如何实现单链表”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获新知识吧。php实现...
    99+
    2023-06-06
  • Golang如何实现单链表
    今天小编给大家分享一下Golang如何实现单链表的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 定义节点// ...
    99+
    2023-07-05
  • C++怎么实现单链表
    本文小编为大家详细介绍“C++怎么实现单链表”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现单链表”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单链表链表内存空间不一定连续,其扩展性较好。多余的不多...
    99+
    2023-07-02
  • C++数据结构之单链表如何实现
    这篇文章主要介绍了C++数据结构之单链表如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++数据结构之单链表如何实现文章都会有所收获,下面我们一起来看看吧。一、单链表的定义线性表的链式存储又称为单链表,...
    99+
    2023-06-30
  • 一文弄懂C语言如何实现单链表
    目录一、单链表与顺序表的区别:一、顺序表:二、链表二、关于链表中的一些函数接口的作用及实现1、头文件里的结构体和函数声明等等2、创建接口空间3.尾插尾删4、头插头删 5、单...
    99+
    2024-04-02
  • python如何实现单向链表及单向链表的反转
    链表的定义 链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息 单向链表的实现 class ListNode: def __init_...
    99+
    2024-04-02
  • c语言链表如何实现
    这篇“c语言链表如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c语言链表如何实现”文章吧。在计算机领域离不开算法和数...
    99+
    2023-06-19
  • C语言如何实现头插法建立单链表
    目录怎么将结点一个个插入在某个结点前面呢?然后再在头结点的后面插入新的结点首先要明确一点,利用头插法建立出来的单链表的输出都是逆序的(就是和你的输入顺序反着来的)然后就是要明确生成的...
    99+
    2024-04-02
  • python 实现线性链表(单链表)
    初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码。 #!/usr/bin/python # -*- coding:utf-8 -*- # Author: Hui # Date: 2017-10-13...
    99+
    2023-01-31
    链表 线性 python
  • C++如何实现二叉树链表
    目录C++二叉树链表C++二叉树转链表C++二叉树链表 Node.h #ifndef NODE_H #define NODE_H #include <iostream> ...
    99+
    2024-04-02
  • 如何使用rust实现简单的单链表
    目录前言1.链表节点的定义2.链表的定义3.实现从链表头部插入节点的prepend方法4.为链表实现Display trait定制链表的打印显示5.为链表实现翻转链表功能的rever...
    99+
    2024-04-02
  • python单向循环链表如何实现
    本篇内容主要讲解“python单向循环链表如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python单向循环链表如何实现”吧!单向循环链表将所有的链接在一起,每一个节点分为数据存储区和链...
    99+
    2023-07-06
  • python实现单链表
    #encoding:utf-8 import sys class Lnode():     def __init__(self,elem,next=None):         self.elem = elem    #节点的值   ...
    99+
    2023-01-31
    链表 python
  • C++实现LeetCode(141.单链表中的环)
    [LeetCode] 141. Linked List Cycle 单链表中的环 Given a linked list, determine if it has a cycle i...
    99+
    2024-04-02
  • c语言单链表如何创建
    创建单链表的基本思路如下:1. 定义一个结构体用来表示链表中的节点,结构体中包含一个数据域用来存储节点的值,还包含一个指针域用来指向...
    99+
    2023-08-25
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作