实现链表表的基本操作
00 分钟
2023-10-20
2023-10-20
type
status
date
slug
summary
tags
category
icon
password
需要实现一个链表,首先要定义链表中的每个节点的模板,这里使用struct关键字来定义。 定义一个节点,他有数据域指针域 ,其中ElemType 为元素类型,为了定义元素类型方便且每次更改类型都不用大规模修改代码,我这里使用typedef关键字给int取别名为ElemType
其中Status枚举是后面代码需要返回状态值要用的。
  • 初始化
    • 定义好节点后,就可以开始创建初始化代码了,首先要考虑的是:
      1. 链表需要有一个头节点
      1. 头节点数据域可以没有数据
      1. 头节点的指针域需要指向第一个节点,因为是初始化,还没有第一个节点,所以指针域为NULL
      下面是代码:
  • 插入
    • 初始化链表以后,就需要插入元素,第一个也好最后一个也罢,都能用计算的方式判断。
      插入的步骤是:
      1. 接受参数是:链表(采用引用方式,因为要修改链表),要插入的位置,需要插入的元素
      1. 先定义一个指针变量(p)用来扫描链表
      1. 定义一个整型变量(j)用来记录扫描到第几个节点
      1. 开始循环每次扫描都判断是否到达了插入位置;且指针变量(p)不能为空,因为是空则说明已经扫面到链表末尾。循环内部让p向后移动,j计数加一。
      1. 判断是否达到最后一个,或者传入的位置是否有误(这里可以理解为经过上面的计算,传入的i是否大于链表的长度或者小于链表的长度)
      1. 上方代码均正常执行,先定义新节点,交换节点指针域。
  • 删除
    • 需要删除某个元素,我们同样通过循环找到需要删除的节点,然后交换指针域,使用delete关键字销毁节点。
  • 查找某个位置的元素
    • 与插入中寻找指定位置相似,我们通过循环找到指定位置,在判断是否超出链表边界,没有超出的话接直接返回节点数据元素。代码如下(因为不需要修改链表,参数不使用引用方式):
  • 定位某个元素的位置
    • 通过循环查找到值等于我们需要元素位置返回即可。
  • 销毁
    • 只需要循环将链表中包括头节点的所有节点全部销毁即可
  • 清空
    • 除了头节点,其他的节点全部销毁,并把头节点的指针域改为空
  • 判空
    • 判断头节点的指针域有没有指向其他节点即可
  • 求长度
    • 使用循环找到指针域为空的节点,并用变量计数即可得到长度
  • 遍历输出线性表
    • 循环到指针域为空的节点停止即可

提高题

  1. 将一个头结点指针为a单链表分解成两个单链表A和B,其头结点指针分别为a和b,使得A链表中含有原链表号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
    1. 分析题目,我们把奇数位的数据保留在原链表,而偶数位的操作有点像删除元素的操作,但是我们删除以后,不需要将节点销毁,而是将节点添加到B链表。
      总的来说,这道题就是一道删除与插入结合的操作。
  1. 将链接存储线性表逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,以此类推。
    1. 我们只需要链表中的第一个节点作为第二个节点的后驱,第二个节点作为第三个节点的后驱以此类推。
      也就是第一个节点的地址给第二个节点的地址域,第二个的地址给第三个节点的地址域,以此类推,到最后一个时,我们需要让头节点的地址域连接到他。

挑战题

一艘满载货物的轮船在海上航行,突然轮船被海盗包围,海盗们挟持了轮船,并把所有船员拉到甲板上,一共64人。海盗船长告诉他们:现在我们要挟持你们的船,让你们的老板把赎金给我们,才能放你们和货物回去。现在我们先表诚意:释放一般船员回去。你们围成一圈,有第一个人数起,依次报数,数到第11人,便可以离开,直到剩下一半,也就是32人为止。 如果你是其中一个船员,你知道站在哪些位置能够安全离开吗?
  1. 思路1,使用循环链表,将其数据域设置为0,离开表示为1,循环时是1就跳过,并不加数数的顺序只需要循环到剩下一半时停止,最后统计是1的位置,就可以得出安全位置
  1. 思路2:查找规律,使用下标指针,隔十个删除一个,也就是将数组隔十个标记一个为1,下次循环到1将不计数,也就是true,当下标指针满64时,只需要余上64即可从头开始,这也类似循环链表的循环,只不过使用了取余来跳回0号索引。
上一篇
HarmonyOS开发 ArkTS 适用的 .gitignore 文件
下一篇
线性结构

评论
Loading...