数据结构算法学习记录——线性表之单链表(上)-初始单链表及其头插函数(顺序表缺陷、单链表优点、链表打印)

news2025/7/17 6:23:10

单链表的概念

单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的。
每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置)。
元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
以“结点的序列”表示的线性表称作线性链表(单链表),单链表是链式存取的结构。

复习一下之前学过的顺序表:

顺序表的缺陷
1.当空间不够时需要增容,而增容需要付出代价,浪费一些空间。
2.为了避免频繁增容,一般地,增容时都增至原本容量的2倍;这样就会可能存在一部分空间没有被使用的情况。
3.顺序表的数据是从开始的位置连续存储的,当需要从头部或者中间插入或删除数据时,就需要挪动数据,效率不高。

顺序表的优势
1.支持随机访问。
(有些算法需要结构支持随机访问,比如:二分查找、优化的快速排序等等)

而链表呢

链表的优势
1.按需申请空间,不用了就释放空间(更合理地使用空间)。
2.在头部或中间插入或删除数据时,不需要挪动数据,效率较高。

链表的缺陷
1.每一个数据,都要存一个指针去链接后面的数据结点。
2.不支持随机访问。

单链表的结构

逻辑结构

想象出来的、便于理解的

物理结构

内存中实际如何存储的

代码呈现

//单链表的基本结构
#define SLTDataType int
typedef struct SListNode
{
    SLTDataType data;
    struct SListNode * next;
}SLTNode;

单链表的打印

//单链表的打印
void SListPrint(SLTNode* phead)
{  //创建一个临时结点,将phead赋给cur
  SLTNode* cur = phead;
  
  //判断cur是否等于空
   while(cur != NULL)
   {
     //打印链表数据
     printf("%d->",cur->data);
     
     //找下一块的数据,就要找下一个结点
     //而下一个结点存放于cur中,通过cur找到下一个结点
     //一直循环,直到next指针指向NULL时,链表打印完成
     cur = cur->next;
   }
}

单链表的尾插函数

要实现单链表尾插,首先判断传入的链表是否为空,如果为空,则直接给其赋值。

如果不为空,则需要找到最后一个结点,即尾结点。尾结点的特征是:next指针指向NULL。

通过这一特征找到尾结点,再将新结点赋给尾结点。同时新结点的next指针指向NULL。

//单链表尾插函数
void SListPushBack(SLTNode ** pphead,SLTDataType x)
{  //创建一个新结点
   SLTNode * newnode = (SLTNode *)malloc(sizeof(SLTNode));
   newnode->data = x;
   newnode->next = NULL;
  //当传入的链表为空时,要先给其赋值,才能进行后面的操作
  //二级指针pphead存储着一级指针变量phead的地址,解引用一次得到phead的地址
   if(*pphead == NULL)
   {
       *pphead = newnode; //将新结点赋给头结点
   }
   else
   {
       //要进行尾插,就要先找到尾结点
       //尾结点的特征:next指针为空指针
       //建立一个新结点,命名为尾结点
       SLTNode * tail = *pphead;
       while(tail->next != NULL)//遍历找到尾结点
       {
           tail = tail->next;
       }
       tail->next = newnode;
   }
}

end


学习自:比特徐靖杭——数据结构与算法课程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu安装Docker

一、安装条件1.操作系统要求需要以下 Ubuntu 版本之一的 64 位版本:Ubuntu Kinetic 22.10Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LTS)Ubuntu Bionic 18.04 (LTS)二、安装1.要是之前安装过,可以进行卸载然后再安装,旧版本的 Docker 的名…

_Linux (传输层一版本)

文章目录0. 传输层作用1. 再谈端口号1-1 端口号范围划分1-2 认识知名端口号(Well-Know Port Number)1-3 两个问题1-4 netstat1-5 pidof2. UDP协议2-1 UDP协议端格式1. UDP协议如何分离(封装)?2. UDP协议如何交付(应用层- - 客户&a…

什么蓝牙耳机佩戴舒适?2023长时间佩戴最舒适的蓝牙耳机

现如今,很多蓝牙耳机的产品都在不断地更新,市面上的耳机也是越来越普及,可以说是成为我们日常生活中不可或缺的一类电子设备,下面介绍一些佩戴舒适性好的蓝牙耳机。 一、南卡小音舱蓝牙耳机 音质推荐指数:★★★★★…

[ 网络 ] 应用层协议——HTTPS协议原理

目录 1.HTTPS是什么 2.加密技术 2.1什么是加密 2.2为什么要加密 2.3加密处理防止被窃听 3.常见的加密方式 对称加密 非对称加密 4.数据摘要&&数据指纹 5.数字签名 6.HTTPS的工作过程探究 方案1——只是用对称加密 方案2——只进行非对称加密 方案3——双方…

JavaEE——简单介绍Thread类以及线程的基本操作

文章目录一、Thread 类中的常见构造方法二、Thread 的一些常见属性三、线程的启动——start()isAlive() 方法的解释四、线程中断五、线程等待-join()了解六、简单解释线程休眠一、Thread 类中的常见构造方法 我们已知,Thread 类是Java中多线程中的一个关键类&#…

MATLAB的快速入门

第一部分:基础知识常用命令:clc %清除命令行窗口 clear %清空工作区数据 cd %显示或改变工作目录 clf %清除图形窗口 help %打开帮助文档 save %保存内存变量到指定文件 hold %保持图形 close %关闭当前图窗 quit %退出变量&#x…

sentry权限控制

sentry权限控制 文章目录sentry权限控制前言1. 安装2. hive内得配置4. hdfs配置5. Hue 授权6. 连接hive配置权限7. 验证前言 Apache Sentry是一个可以对Hadoop集群中的数据及元数据进行细粒度管理的权限管理系统。Sentry目前可以与ApacheHive,HiveMetastore / HCat…

前端基础(十四)_Math对象

Math对象 1.Math对象 对象.方法名 (1)Math.floor() 向下取整 去掉小数部分 等同于parseInt Math.floor(1.222) //1(2)Math.ceil() 向上取整 去掉小数部分 向上进一 Math.ceil(1.222) //2(3)Math.round() 四舍五入 4.5 5 针对小数点后面第一位数字 Math.round(1.272) //1 Ma…

嵌入式安防监控项目——exynos4412主框架搭建

目录 一、模块化编程思维 二、安防监控项目主框架搭建 一、模块化编程思维 其实我们以前学习32使用keil的时候就是再用模块化的思维。每个硬件都单独有一个实现功能的C文件和声明函数,进行宏定义以及引用需要使用头文件的h文件。 比如简单的加减乘除取余操作我们…

Spark Standalone 部署

Spark Standalone 部署解压缩文件修改配置文件启动集群Web UI 界面提交应用提交参数说明配置历史服务配置日志存储路径添加日志配置重启重新执行任务查看历史服务配置高可用(HA)集群规划停止集群启动 Zookeeper启动集群关闭集群关闭历史服务解压缩文件 …

Go语言使用Playwright自动化测试、录屏、执行js

Go版本的Playwright支持Chromium、Firefox和WebKit的Web自动化测试,兼容Windows、Linux和MacOS,默认支持headless无头模式,安装方便、绿色高效、兼容性强、运行速度快。 支持的主要功能有: 跨多个页面、域名和iframe的场景&#x…

什么led灯性价比高?家用led灯选哪种最好

人造灯具经过多年的发展,现在最为成熟的工艺就是led灯了,不仅有荧光灯高效节能、省电高亮的特点,而且光线可控性非常高,对于调光、提高光线柔和度等方面非常方便,保护眼睛更有效。 那么什么led灯性价比高呢&#xff0c…

JavaScript 高级5 :ES6

JavaScript 高级5 :ES6 Date: January 19, 2023 Sum:ES6新增语法、ES6内置对象扩展(Array、String扩展方法、set数据结构) 目标 能够说出使用let关键字声明变量的特点 能够使用解构赋值从数组中提取值 能够说出箭头函数拥有的…

基于SpringBoot的学生会管理系统 源码

StudentUnionManagementSystem 基于SpringBoot的学生会管理系统 源码 链接 目录StudentUnionManagementSystem介绍软件架构使用说明1.页面登录2.首页3.成员信息管理4.角色信息管理5.权限管理6.活动管理7.文件管理8.活动展示介绍 学生会管理系统 SpringBoot Mybatis-plus shir…

CentOS 7 怎样设置自动连接网络

作为 Linux 中的重要一员,CentOS 7 始终把安全放在第一位,开机以后并不会自动启动网络。而且,相比 Windows 下只需点击几下鼠标便能搞定配置,在 CentOS 7 中要想设置开机自动连接网络,简直可以说是需要具有“专业级水准…

手动实现 数组和链表

数组和链表示意图 目的 不用java标准库 自己时间 一个 arraylist 和 linked list 区别 数组 数组 支持 随机访问 可以立即访问 根据 第一个元素的位置, 推算出 第三个地方的位置 如下图所示,假设我们知道 头的位置是X 数组是 int类型 每个位置就是 …

Qt音视频开发21-mpv内核万能属性机制

一、前言 搞过vlc内核后又顺带搞了搞mpv内核,mpv相比vlc,在文件数量、sdk开发便捷性方面绝对占优势的,单文件(可能是静态编译),不像vlc带了一堆插件,通过各种属性来set和get值,后面…

第十四届蓝桥杯三月真题刷题训练——第 5 天

目录 题目1:数的分解 题目描述 运行限制 代码: 题目2:猜生日 题目描述 运行限制 代码: 题目3:成绩分析 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码: 题目4:最大和…

Vue3做出B站【bilibili】 Vue3+TypeScript【快速入门一篇文章精通系列(一)前端项目案例】

本项目分为二部分 1、后台管理系统(用户管理,角色管理,视频管理等) 2、客户端(登录注册、发布视频) Vue3做出B站【bilibili】 Vue3TypeScript【快速入门一篇文章精通系列(一)前端项目…

vue3 拖拽 穿梭框

文章目录期望结果当前技术栈实现方法安装 sortablejs导入 sortablejs视图 通过 id 绑定 sortablejs 数据通过 data-xxx 自定义属性 挂载ts中 通过id获取dom 实现拖拽 getNewArr函数通过自定义属性对数据做处理以下是全部代码官网链接下面是文档UsageOptionsgroup optionsort op…