首页 > 其他分享 >【数据结构】线性表-单链表

【数据结构】线性表-单链表

时间:2024-03-31 22:37:33浏览次数:15  
标签:结点 单链 线性表 创建 链表 遍历 数据结构 节点 指针

编程语言:C++

前言:

  • 节点:节点是链表的一个基本单元,包含两部分——数据域和指针域,数据域用于存储数据,指针域存储下一个节点的地址,形成链结。
  • 什么是单链表:n个节点链结成一个链表,即为线性表(a1,a2,a3……)的链式存储结构,每个节点只包含一个指针域的链表叫做单链表。
  • 链表组成:头节点、头指针、节点。头结点顾名思义就是第一个节点,并且头结点的数据域一般为空,有时用来存储链表的节点数等信息,在链表中,头结点不是必需要素。头指针就是指向头结点的指针,头指针一般冠以链表的名字,并且头指针是链表的必需要素。
  • 空链表:没有任何有效数据的节点的链表。例:
  1. 单链表的创建
    创建单链表之前先要创建节点:

然后开始创建链表:
我们将创建链表的功能包装成一个函数,参数如下:
第一个参数是我们在函数外创建的一个头指针(也即一张空链表(包含头结点)),第二个参数是我们希望链表所包含的节点个数

在此基础上,我们有两种创建链表的方式:头插法、尾插法。

头插法:
原理如下:将每次创建的新节点插入头节点和上一个创建的节点之间。

步骤:

  • 声明一个指针p(用来生成新节点),和一个计数器变量i
  • 初始化一张空链表(也就是创建一个头指针),让头结点指针指向NULL
  • 循环:
    ①生成一个新节点赋给p
    ②给节点赋值(例子中生成一个随机数存入p->data)
    ③将节点插入头结点和上一节点之间

代码实现:

尾插法:
原理如下:每次创建的新节点插在上一个节点后面(链表尾部)。

步骤:

  • 声明一个指针p(用来生成新节点),声明一个尾指针r(方便往链表尾部插入新节点),一个计数器变量i
  • 初始化一张链表(也就是创建一个头指针),让头结点的指针指向NULL
  • 让尾指针r指向头结点
  • 循环:
    ①生成一个新节点赋给p
    ②给节点赋值
    ③将节点插入链表尾部
    ④保持尾节点的指针指向NULL(方便作为查找等操作的判断标志)

代码实现:

  1. 链表数据的读取
    读取指定节点存取的数据,必需从头结点开始遍历链表,直到找到指定节点然后读取数据。
    步骤:
    ①创建一个指针p(用来遍历链表),和一个计数器i(p当前指向的节点)
    ②让p指向第一个节点开始遍历链表,同时i自增
    ③如果找到了指定节点,则读取节点数据,并反馈信息(以1为例)
    ④如果没找节点,则反馈信息(以返回0为例)
    代码实现:

  2. 单链表数据的插入
    遍历链表到达指定位置后将数据插入即可。
    步骤:
    ①创建指针p(遍历链表),创建指针s(插入的节点),创建计数器变量i
    ②遍历链表,到达指定位置将s插入
    代码实现:

  3. 单链表数据的删除
    用一个指针遍历到达指定节点处,然后进行删除操作(改变节点指针指向,绕过待删除节点即可),并索回所删除的数据。
    步骤:
    ①创建一个指针p遍历链表,创建一个指针辅助删除,一个计数器变量i
    ②遍历至指定位置进行删除操作
    代码实现:

    补充:其实完全可以不需要创建指针q,“q = p->next;p->next = q->next;”两步可用“p->next = p->next->next”替代,效果相同。

  • 涉及到改变链表数据的操作时,应当使用引用传递
  • 对于链表的各种操作并非一成不变,应当根据实际情况灵活变换

标签:结点,单链,线性表,创建,链表,遍历,数据结构,节点,指针
From: https://www.cnblogs.com/HDhd/p/18106846

相关文章

  • 数据结构(六)——图的遍历
    6.3图的遍历6.3.1图的广度优先遍历⼴度优先遍历(Breadth-First-Search,BFS)要点:1.找到与⼀个顶点相邻的所有顶点2.标记哪些顶点被访问过3.需要⼀个辅助队FirstNeighbor(G,x):求图G中顶点x的第⼀个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。Next......
  • 数据结构 - 线性表 - 顺序表
    前言最近刚刚开始复习408数据结构,就想着把每个章节的代码部分汇总记录一下,写成一组文章,便于日后的复习和参考。本系列整体的框架和课后习题参考了王道的复习指导。在本系列的每篇文章中,我会先把该章节所对应数据结构的基础代码放上来,然后附上参考资料习题对应的题目代码。线性......
  • 数据结构_包装类&泛型
    目录一、包装类1.1基本数据类型和对应的包装类1.2装箱和拆箱1.3拓展 二、泛型2.1引出泛型2.2泛型的语法及使用2.3泛型是如何编译的2.3.1擦除机制2.4泛型的上界2.5泛型方法总结一、包装类在Java中,由于基本类型不是继承自Object类,为了在泛型代码中......
  • 数据结构-C语言描述(队列的链表实现)
    概述在日常生活中,先进先出似乎更加符合我们的日常认知。 排队的人群中,队首的人总是先离开,而队尾的人总是后离开。1.队列的基本原理和操作我们知道队列也是一种线性表,而今天我们就用非顺序储存结构(链表)来实现它。首先我们先明确队列的基本操作原理:因为同时涉及到队首和队......
  • 【数据结构与算法篇】动态顺序表及相关OJ算法题
    【数据结构与算法篇】动态顺序表及相关OJ算法题......
  • 数据结构之结构体进阶——pair
    前言:当结构体中只有两个元素时,去定义结构体时太过于繁琐了,在C++中有特定的函数可以简化这种结构体的定义。 pair的定义:有两个元素的结构体,其中为first,second元素,其中first,second的类型可以自己定义。 pair的创建:文字解释:官方给予的定义:template<classT1,class......
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录广度优先+双分裂蛇广度优先+双分裂蛇双分裂蛇:是求二维表中从起点到终点的经典思路(也是......
  • java数据结构与算法刷题-----LeetCode95. 不同的二叉搜索树 II
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录分治回溯+记忆化搜索分治回溯+记忆化搜索卡特兰数,例如对于n个进栈元素,有多少种出栈顺序,......
  • Python 潮流周刊第 44 期(摘要)+ 赠书 5 本《明解Python算法与数据结构》
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2024-03-30-weekly特别提醒:本期赠书5......
  • 数据结构 —— 线性表的链式存储(链表)(C++)
    目录单链表(有头结点)定义初始化判空销毁清空求表长取值查找插入删除创建头部创建尾部创建本文相关知识:以链式存储结构来实现线性表(C++)如有错误请指正~~谢谢~后面更新循环链表和双向链表单链表(有头结点)以带头结点的单链表为例,操作更加简便!定义首先,为了增强程序的可读性,做出以......