单链表基础知识点

 单链表的读取

对于单链表实现获取第i个元素的数据的操作 GetElem,在算法上,相对要麻烦一些。
获得链表第i个数据的算法思路:

  1. 声明一个结点p指向链表第一个结点,初始化j从1开始;
  2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
  3. 若到链表末尾p为空,则说明第i个元素不存在;
  4. 否则查找成功,返回结点p的数据。

 代码实现如下:

//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值
Status GetElem(LinkList L, int i, ElemType* e)
{int j;LinkList p;//声明一结点pp = L->next;//让p指向链表L的第一个结点j = 1;//j为计时器while (p && j < i) {//p不为空或者计时器j还没有等于i时,循环继续p = p->next;//让p指向下一个结点++j;}if (!p || j > i) {return ERROR;//第i个元素不存在*e = p->x;//取第i个元素的数据return OK;}
}

Status是一个整型,返回OK代表1,ERROR代表0。

单链表的插入与删除

单链表的插入

只需要让 s->next 和 p->next  的指针做改变就好了。

s->next=p->next;
p->next=s;

也就是说让p的后继结点改成 s 的 后继结点,再把结点 s 变成 p 的后继结点。 

 

 这两句的顺序不可以交换,如果先 p->next=s;再s->next=p->next;因为此时第一句会使得将 p->next 给覆盖成s的地址了。那么s->next=p->next,其实就等于s->next=s,这样真正的拥有 ai+1数据元素的结点就没了上级。这样的插入操作就是失败的。

对于单链表的表头和表尾的特殊情况,操作是相同的。

 

单链表第i个数据插入结点的算法思路:
  1. 声明一结点p指向链表第一个结点,初始化j从1开始;
  2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
  3. 若到链表末尾p为空,则说明第i个元素不存在;
  4. 否则查找成功,在系统中生成一个空结点s;
  5. 将数据元素e赋值给 s->x;
  6. 单链表的插入标准语句s->next=p->next; p->next=s;
  7. 返回成功。
代码实现:
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:在 L 中第i个位置插入新的数据元素e,L的长度加1;
Status ListDelete(LinkList* L, int i, ElemType* e)
{int j;LinkList p, s;p = *L;j = 1;while (p && j < i) {//寻找第i个结点p = p->next;++j;}if (!p || j > i) return ERROR;//第i个元素不存在s = (LinkList)malloc(sizeof(Node));//生成新结点s->x = e;s->next = p->next;//将p的后继结点赋值给s的后继p->next = s;//将s赋值给p的后继return OK;
}

 

在这段代码中,使用了malloc标准函数,它的作用就是生成一个新的结点,其类型与Node是一样的,其实质就是在内存中寻找了一小块空地,准备用来存放e数据s结点。

单链表的删除

设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可。

q=p->next;
p->next=q->next;
 单链表第i个数据删除结点的算法思路:
  1. 声明一结点p指向链表第一个结点,初始化j从1开始;
  2. 当j<i 时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
  3. 若到链表末尾p为空,则说明第i个元素不存在;
  4. 否则查找成功,将欲删除的结点 p->next 赋值给 q;
  5. 单链表的删除标准语句 p->next=q->next;
  6. 将q结点中的数据赋值给e,作为返回;
  7. 释放q结点;
  8. 返回成功。
代码实现:
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1;
Status ListDelete(LinkList* L, int i, ElemType* e)
{int j;LinkList p, q;p = *L;j = 1;while (p->next && j < i) {//遍历寻找第i个元素p = p->next;++j;}if (!(p->next) || j > i) return ERROR;//第i个元素不存在q = p->next;p->next = q->next;//将q 的后继赋值给p的后继*e = q->x;//将q结点中的数据给efree(q);//让系统回收此结点,释放内存return OK;
}

 这段代码,使用了free函数,它的作用就是让系统回收一个Node结点,释放内存。

小总结:

单链表插入和删除算法其实都是由两部分组成:第一部分就是遍历查找第i个元素;第二部分就是插入和删除元素。

对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决】idea中文乱码问题,中文展示为问号“??“

idea中文乱码问题&#xff0c;中文展示为问号"??" 问题分析解决 问题 中文乱码问题&#xff0c;YAML中配置中文&#xff0c;输出时展示成问号“??” 分析 此问题一般为文件默认配置不支持UTF-8导致 解决 配置UTF-8&#xff1a; File -> Settings -> E…

云原生之基石-Docker Compose

1. 前言 在上一篇文章中介绍了基本的Docker工具&#xff0c;我们对单个应用程序进行单机单进程部署&#xff0c;制作Dockerfile文件&#xff0c;执行docker build来生成docker镜像&#xff0c; 执行docker run来运行一个容器&#xff0c;自己指定需要的参数如-v&#xff0c;但是…

Linux:docker在线仓库(docker hub 阿里云)基础操作

把镜像放到公网仓库&#xff0c;这样可以方便大家一起使用&#xff0c;当需要时直接在网上拉取镜像&#xff0c;并且你可以随时管理自己的镜像——删除添加或者修改。 1.docker hub仓库 2.阿里云加速 3.阿里云仓库 由于docker hub是国外的网站&#xff0c;国内的对数据的把控…

C语言—基础数据类型(含进制转换)

进制转换不多&#xff0c;但我觉得适合小白(我爱夸自己嘿嘿) 练习 1. 确认基础类型所占用的内存空间(提示&#xff1a;使用sizeof 运算符)&#xff1a; 在这里我说一下&#xff0c;long 类型通常占用 4 字节。在 64 位系统上&#xff0c;long 类型通常也可为 8 字节。 格式…

DS Wannabe之5-AM Project: DS 30day int prep day14

Q1. What is Autoencoder? 自编码器是什么&#xff1f; 自编码器是一种特殊类型的神经网络&#xff0c;它通过无监督学习尝试复现其输入数据。它通常包含两部分&#xff1a;编码器和解码器。编码器压缩输入数据成为一个低维度的中间表示&#xff0c;解码器则从这个中间表示重…

代码随想录刷题笔记 DAY 24 | 回溯算法理论基础 | 组合问题 No. 77

文章目录 Day 2401. 回溯算法理论基础1.1 什么是回溯法&#xff1f;1.2 为什么要使用回溯法&#xff1f;1.3 如何理解回溯法&#xff1f; 02. 组合问题&#xff08;No. 77&#xff09;2.1 题目2.2 笔记2.3 代码 Day 24 01. 回溯算法理论基础 1.1 什么是回溯法&#xff1f; &…

【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

解决MAC连上wifi或热点却不能上网问题

解决MAC连上wifi或热点却不能上网问题 #新换的mac昨天还能连上wifi&#xff0c;今天就不好使了。 找到连接的wifi点击详细信息&#xff0c;选择TCP/IP 中的配置IPV4 选择关闭

从零开始:Windows下的Miniconda安装教程

&#x1f680;从零开始&#xff1a;Windows下的Miniconda安装教程&#x1f680; &#x1f333;一、引言&#x1f333; 【&#x1f680;全新启程&#x1f680;】✨踏入Python数据科学的大门&#xff0c;&#x1f525;Miniconda&#x1f525;将成为您不可或缺的得力助手&#xf…

Spring Boot 笔记 007 创建接口_登录

1.1 登录接口需求 1.2 JWT令牌 1.2.1 JWT原理 1.2.2 引入JWT坐标 1.2.3 单元测试 1.2.3.1 引入springboot单元测试坐标 1.2.3.2 在单元测试文件夹中创建测试类 1.2.3.3 运行测试类中的生成和解析方法 package com.geji;import com.auth0.jwt.JWT; import com.auth0.jwt.JWTV…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

python-自动化篇-办公-批量新建文件夹并保存日志信息

文章目录 说明代码效果 说明 因为业务需要&#xff0c;每天都需要按当天的日期创建很多新文件夹。把这种重复又繁重的操作交给Python来做&#xff0c;一直是我的目标。先说下要求&#xff1a; 默认在桌面新建文件夹。文件夹命名方式&#xff0c;“月.日-1”&#xff0c;比如7…