当前位置: 首页 > news >正文

数据结构与算法基础(青岛大学-王卓)(2)

第二弹火爆来袭中

这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了龙虾季节了,哎,口水直流了~~)


beautiful的分割线


文章目录

  • 第二弹火爆来袭中
  • 这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了龙虾季节了,哎,口水直流了~~)
        • ...
        • 线性表的链式表示
          • 定义
          • 链表种类
          • 链表的表示
          • 链表的特点
          • 单链表
            • 表示方法
            • 单链表的初始化
            • 判断链表是否为空
            • 单链表的销毁(头结点也不存在了)
            • 清空单链表(头指针和头结点还在)
            • 求单链表的表长
            • 取单链表中第i个元素的内容
            • 单链表中的按值查找
            • 单链表的插入操作
            • 单链表的删除操作
            • 单链表的查找、插入、删除时间效率
            • 单链表的建立
        • ...
  • TO BE CONTINUED...

线性表的链式表示

定义

用一组物理位置任意的存储单元来存放线性表的数据元素,存储单元对连续性没要求,可零散分布,链表的每个节点由 数据+指针 组成

eg: 26个英文字母小写存储

在这里插入图片描述

链表种类

单链表,双链表,循环链表

在这里插入图片描述

链表的表示

在这里插入图片描述

  • 头指针:是指向链表中第一个结点的指针

  • 首元结点:是指链表中存储第一个数据元素a1的结点

  • 头结点:是在链表的首元结点之前附设的一个结点;

    • 链表存储的时候可以选择带和不带头节点

    • 好处:

      • 便于首元结点的处理(链表的第一个数据也能有往前的指针,处理起来和后面的正常元素就一样了)
      • 便于空表和非空表的统一处理,如下(第二种方案)

      在这里插入图片描述

    • 头结点的数据域可以为空,也可以放线性表长度等附加信息,但此节点不能计入链表长度值。

链表的特点
  • 存储上位置任意,不需要相邻
  • 访问元素时只能通过头指针进入链表,并扫描剩下每个节点直到找到目标,找到第一个节点和最后一个节点的时间不等
    • 顺序表–> 随机存取
    • 链表–> 顺序存取(找第i个元素时必须从第一个元素一直到i-1个元素再到元素i)
单链表
表示方法

单链表由表头唯一确定,可以用头指针的名字来命名,头指针为L则把链表称为表L.

存储结构

在这里插入图片描述

typedef struct Lnode{ //声明结点的类型和指向结点的指针类型ElemType data; //结点的数据域struct Lnode *next; //结点的指针域(嵌套了)
}Lnode,*LinkList; //LinkList为指向结构体Lnode的指针类型LinkList L; //定义链表L
Lnode *p; //定义节点指针p (可以用linkList p 但是不推荐)

例子:存储学生的学号,姓名,成绩的单链表

// 通常定义法
typedef Struct {char num[8]; //数据域char name[8]; //数据域int score; //数据域
} ElemType;typedef struct Lnode{ElemType data; //数据域struct Lnode *next; //指针域
}Lnode, *LinkList

Linklist L;

在这里插入图片描述

单链表的初始化
Status InitList_L(LinkList &L){L=new LNode; // C++ or C语言 L=(LinkList) malloc (sizeof (LNode))L->next=NULL;return OK;
}

在这里插入图片描述

判断链表是否为空
int ListEmpty(LinkList L){ //空表返回1,否则返回0if(L->next) //非空return 0;elsereturn 1;
}
单链表的销毁(头结点也不存在了)
Status DestroyList_L(LinkList &L){Lnode *p;while(L){p=L;L=L->next;delete p; // C++ 用法 or C用法: free p;}return OK;
}
清空单链表(头指针和头结点还在)

依次从首元结点开始释放所有节点,最后将头结点的指针域设为空

在这里插入图片描述

Status EmptyList_L(LinkList &L){Lnode *p,*q;p=L->next;while (p){q=p->next;delete p;p=q;}L->next=NULL;return OK;
}
求单链表的表长
int List_Length(LinkList L){Lnode *p;p=L->next; //p指向第一个节点(首元结点)i=0;while (p){  //遍历单链表,统计节点数i++;p=p->next}return OK;
}
取单链表中第i个元素的内容

思路:从头指针触发,顺着链域next逐个往下搜索,直到搜索到第i个节点为止,因此链表不是随机存取结构,需判断找不到的情况和i的正确取值情况。

Status GetElem_L(LinkList L, int i, ElemType &e){p=L->next;j=1; //初始化,p指向首元结点,j来累计遍历过的位置while (!p && j<i){ //向后扫描直到p指向第i个元素或者p为空时p=p->next;++j; //注意这里是前加加,返回的是自增后的j, j++ 后加加是返回自增前的j}if (!p || j > i) return ERROR; //p指向空节点或者i各元素不存在时,返回ERRORe=p->data;return OK;
}//GetElem_L
单链表中的按值查找
  • 返回该数据所在位置(改数据地址)

    Lnode *LocateElem_L(LinkList L, ElemType e){
    //在单链表中查找元素为e的数据元素,找到后返回e的地址,未找到返回NULLp=L->next;while (p && p->data!=e){p=p->next;}return p;
    }
    
  • 返回该数据所在的位置序号(第几个元素)

    int LocateElem_L(LinkList L, ElemType e){
    // 使用计数器i返回查找到的位置p=L->next;j=1;while (p && p->data!=e){p=p->next;j++;}if (p) return j; //p非空情况下的i才有意义else return 0;
    }
    
单链表的插入操作

在第i个节点前插入值为e的新节点 - 找前趋

在这里插入图片描述

//单链表的插入操作,在第i个位置插入元素数据域为e的元素
Status ListInset_L(LinkList &L, int i, ElemType e){p=L;j=0 //初始化p指向头结点,计数器为0while (p && j<i-1) {p=p->next; ++j;} //寻找i-1节点if (!p || j>i-1) return ERROR; //当p为空时,p已经指向了表长+1的节点位置,此时插入位置变为表长+2,这种情况不允许,所以这里排除掉了插入位置大于表长+1位置和i小于1的不合理情况。s=new Lnode;s->data=e; // 创建即将插入的新节点ss->next=p->next; // s指向原来的i节点p->next=s; //i-1节点指向新节点sreturn OK;
}//ListInset_L
单链表的删除操作

删除第i各元素 - 找前趋

在这里插入图片描述

Status List_Delete_L(LinkList &L, int i, ElemType &e){p=L;j=0; Lnode *q; //初始化,p指向头结点,计数器清零while(p->next && j<i-1) {p=p->next; ++j;} //寻找i-1元素,注意此处判定改为了p->next, 当p->next为NULL时,说明i-1个元素已经是表的最后一个元素,那么要删除的i元素就是表长+1的元素,而它是不存在的if(!p->next || j>i-1) return ERROR; // 排除不合理的i元素q=p->next; e=q->data; //将待删除元素信息做保留p->next=q->next; // i-1元素指向i+1元素delete q; //删除指针return OK;
}//ListDelete_L
单链表的查找、插入、删除时间效率
  • 查找 - 时间效率为O(n)

  • 插入/删除:

    • 单个操作并不会移动元素,只是动指针,时间效率为O(1)

    • 查找并操作时,时间效率为O(n)

单链表的建立
  • 头插法 - 元素倒序依次插入链表头结点后面

    • 从一个空表开始,重复读入数据

    • 生成新节点,将读入数据放入新节点的数据域中

    • 从最后一个节点开始,依次将各节点插入到链表的前端

    • 算法时间复杂度O(n)

      在这里插入图片描述

      在这里插入图片描述

     //头插法创建单链表Void CreateList_H(LinkList &L, int n){L=new Lnode; L->next=NULL; //建立一个带头结点的单链表for (i=n;i>0;--i){ //循环倒序插入所有元素p=new Lnode; //生成(C)新节点p=(Lnode*)malloc(sizeof(Lnode));cin>>p->data; //输入(C)元素值scanf(&p->data)p->next=L->next;L->next=p;}}//CreateList_H
    
  • 尾插法 - 新元素正序依次插入末尾

    • 从一个空链表L开始,新节点依次插入链表尾部,尾指针r指向链表尾结点

    • 初始时,r/L都指向头结点。每读取一个数据元素则申请一个新节点并插入尾结点后,r指向新的尾结点。

    • 算法时间复杂度O(n)

      在这里插入图片描述

     //尾插法创建单链表Void CreateList_R(LinkList &L, int n){L=new Lnode; L->next=NULL; //创建空单链表r=L; // 尾指针初始化等于头结点for (i=0;i<n;++i){ //依次正序添加节点p=new Lnode; cin>>p->data;p->next=NULL; //新节点的指针域置空作为新的尾结点 r->next=p; //新节点链接前一个节点r=p; //尾指针移动到新尾结点}}//CreateList_R
    

TO BE CONTINUED…

相关文章:

数据结构与算法基础(青岛大学-王卓)(2)

第二弹火爆来袭中 这波是单链表的内容整理&#xff0c;废话不多说&#xff0c;上小龙虾呀(又到了龙虾季节了&#xff0c;哎&#xff0c;口水直流了~~) beautiful的分割线 文章目录 第二弹火爆来袭中这波是单链表的内容整理&#xff0c;废话不多说&#xff0c;上小龙虾呀(又到了…...

水产亚硝酸盐偏高解决办法,饮用水亚硝酸盐超标

使用常规的离子交换树脂处理含硫酸盐水中的硝酸盐是困难的。因为树脂几乎交换了水中的所有的硫酸盐后&#xff0c;才与水中的硝酸盐交换。也就是说&#xff0c;硫酸盐的存在会降低树脂对硝酸盐的去除能力。采用Tulsimer A-62MP除硝酸盐树脂优先交换硝酸盐&#xff0c;对硝酸盐的…...

linux 设备树详解

设备树 描述设备树的文件叫做 DTS(Device Tree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…...

STM32 学习笔记_7 定时器中断:输出比较

输出比较 电机相关比较重要。 OC Output Compare&#xff08;IC 是输入捕获&#xff0c;CC代指这两个单元&#xff09;&#xff0c;用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有&#xff0c;共用一个cnt计数器&#xff0c;高级计数…...

HTML购物车示例(勾选、删除、添加和结算功能)

以下是一个简单的HTML购物车示例&#xff0c;包含勾选、删除、添加和结算功能。结算功能使用PHP实现&#xff0c;可以获取选中商品的ID。 以下是一个简单的HTML购物车示例&#xff0c;包含勾选、删除、添加和结算功能。结算功能使用PHP实现&#xff0c;可以获取选中商品的ID以下…...

MySQL原理(十):主从架构

前言 上一篇介绍了 MySQL 的表分区和分库分表&#xff0c;这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种&#xff1a; 一主多从架构&#xff1a;适用于读大于写的场景&#xff0c;采用多个从库来分担数据库系统的读压力。多主架构&#xff1a;适用于…...

一文了解Moonbeam智能合约

智能合约&#xff1a;区块链交易的基石 20世纪90年代&#xff0c;Nick Szabo首次提出智能合约的概念&#xff0c;这是一个建立在自动化、加密安全世界之上的数字化市场。在这种数字化市场中&#xff0c;交易和业务可以在无需信任的情况下进行&#xff0c;无需中间人。 以太坊…...

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程

【加解密篇】利用HashCat解密RAR压缩包加密文件 在取证知识里挖呀挖呀挖—【蘇小沐】 文章目录 【加解密篇】利用HashCat解密RAR压缩包加密文件1.实验环境2.RAR加密压缩包 &#xff08;一&#xff09;john软件1.使用CMD命令&#xff1a; run\rar2john.exe &#xff08;二&…...

React面试题汇总1

1.React的严格模式如何使用&#xff0c;有什么用处&#xff1f; React中StrictMode严格模式_react.strictmode_前端精髓的博客-CSDN博客当我们使用 npx create-react-app my-app 创建一个项目的时候。项目中有一段如下所示的代码&#xff1a;ReactDOM.render( <React.Stric…...

Golang每日一练(leetDay0066) 有效电话号码、转置文件

目录 193. 有效电话号码 Valid Phone Numbers &#x1f31f; 194. 转置文件 Transpose File &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 193. 有效电话号…...

前端 之 FormData对象浅谈

一、简介 ​ 通常情况下&#xff0c;前端在使用post请求提交数据的时候&#xff0c;请求都是采用application/json 或 application/x-www-form-urlencoded编码类型&#xff0c;分别是借助JSON字符串来传递参数或者keyvalue格式字符串&#xff08;多参数通过&进行连接&…...

【分布式锁】Redisson分布式锁的使用(推荐使用)

文章目录 前言一、常见分布式锁方案对比二、分布式锁需满足四个条件三、什么是Redisson?官网和官方文档Redisson使用 四、Redisson 分布式重入锁用法Redisson 支持单点模式、主从模式、哨兵模式、集群模式自己先思考下,如果要手写一个分布式锁组件&#xff0c;怎么做&#xff…...

创建XML的三种方式(二)

文章目录 1 使用XmlDocument创建XML文档2 使用XmlTextWriter写XML文档3 使用LINQ to XML 的XDocument类4 小结 本文介绍了在winform中使用C#开发语言来创建XML文档的三种方式&#xff0c;并介绍了各自的优缺点。 方法1是使用 XmlDocument创建XML文档&#xff0c;方法2是使用 …...

十分钟教你搭建类似ChatGPT的安卓应用程序

大家好&#xff0c;我是易安&#xff01; Chat GPT 是当今著名的人工智能工具&#xff0c;就像聊天机器人一样。Chat GPT会回答发送给它的所有查询。今天&#xff0c;我将通过集成 OpenAI API (ChatGPT)构建一个简单的类似 ChatGPT 的 android 应用程序&#xff0c;我们可以在其…...

问题 E: 起止位置(C++)(二分查找)

目录 1.题目描述 2.AC 1.题目描述 问题 E: 起止位置 时间限制: 1.000 Sec 内存限制: 128 MB提交 状态 题目描述 有n位同学按照年龄从小到大排好队。 王老师想要查询&#xff0c;年龄为x的同学&#xff0c;在队伍中首次出现的位置和最后一次出现的位置&#xff1b;如果队…...

【sop】基于灵敏度分析的有源配电网智能软开关优化配置[升级1](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

LeetCode周赛复盘(第345场周赛)

文章目录 1、找出转圈游戏输家1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、相邻值的按位异或2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、 矩阵中移动的最大次数3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、 统计完全连通分量的数量4.1 题目链接…...

Call for Papers丨第三届GLB@KDD‘23 Workshop

鉴于介绍新数据集和Benchmark研究往往需要不同于常规论文的评审标准&#xff0c;计算机视觉和自然语言处理领域&#xff0c;以及最近的NeurIPS会议&#xff0c;都有专门致力于建立新Benchmark数据集和任务的Conference Track。然而在图机器学习领域&#xff0c;我们还没有类似的…...

【多线程】单例模式

目录 饿汉模式 懒汉模式-单线程版 懒汉模式-多线程版 懒汉模式-多线程版(改进) 单例是一种设计模式。 啥是设计模式 ? 设计模式好比象棋中的 " 棋谱 ". 红方当头炮 , 黑方马来跳 . 针对红方的一些走法 , 黑方应招的时候有一些固定的套路. 按照套路来走局势…...

7搜索管理

7搜索管理 7.1 准备环境 7.1.1 创建映射 创建xc_course索引库。 创建如下映射 post&#xff1a;http://localhost:9200/xc_course/doc/_mapping 参考 “资料”–》搜索测试-初始化数据.txt { "properties": { "description": { "type": &…...

DCT-Net新手入门:从镜像部署到生成第一个卡通头像的全流程

DCT-Net新手入门&#xff1a;从镜像部署到生成第一个卡通头像的全流程 1. 准备工作&#xff1a;认识DCT-Net卡通化工具 你有没有想过把自己的照片变成卡通头像&#xff1f;DCT-Net是一个专门用于人像卡通化的AI模型&#xff0c;它能将普通照片转换成风格独特的卡通图像。这个…...

Qt+OpenCV+海康SDK实战:多线程回调架构下的实时视频流解码与Mat转换全流程解析

1. 项目背景与核心挑战 在智能安防和视频监控领域&#xff0c;实时视频流处理一直是技术难点。传统方案往往面临三个关键问题&#xff1a;视频流延迟高、解码效率低下、跨平台兼容性差。这正是我们选择QtOpenCV海康SDK技术栈的原因——Qt提供跨平台GUI支持&#xff0c;OpenCV负…...

如何高效定制Steam界面:实用美化插件开发指南

如何高效定制Steam界面&#xff1a;实用美化插件开发指南 【免费下载链接】millennium-steam-patcher Apply themes/customize Steam after the 2023-04-27 Chromium UI update https://discord.gg/MXMWEQKgJF 项目地址: https://gitcode.com/gh_mirrors/mi/millennium-steam…...

MixText+BERT还能这么玩?手把手复现FPMT论文中的‘概率伪混合’黑科技

解密FPMT论文中的概率伪混合&#xff1a;BERT隐藏层的动态插值艺术 在自然语言处理领域&#xff0c;数据增强一直是提升模型泛化能力的关键技术。传统MixText方法通过线性插值在输入层混合样本&#xff0c;但这种"一刀切"的方式忽视了不同样本对模型训练的差异化价值…...

别光看论文!手把手带你复现CVPR 2025扩散模型加速新星:TinyFusion与DiG的代码实战

别光看论文&#xff01;手把手带你复现CVPR 2025扩散模型加速新星&#xff1a;TinyFusion与DiG的代码实战 如果你已经厌倦了在arXiv上收藏一堆永远打不开第二次的论文链接&#xff0c;或是被那些充满数学符号却缺少可运行代码的"理论创新"搞得头大&#xff0c;那么这…...

C# WebSocket实战:5分钟搞定实时聊天应用(附完整源码)

C# WebSocket实战&#xff1a;5分钟构建高可靠实时聊天系统 实时通信已成为现代应用的核心需求之一。想象一下&#xff0c;当用户发送消息时&#xff0c;对方能立即看到&#xff1b;当股票价格波动时&#xff0c;交易界面实时更新&#xff1b;当多人协作编辑文档时&#xff0c;…...

拉丝机在紧固件生产中的作用与工艺流程_6月FES上海紧固件展

2026第十六届上海紧固件专业展将于6月24日至26日在国家会展中心&#xff08;上海&#xff09;举行。本届展会由上海上搜展览与华人螺丝网联合打造&#xff0c;并获得行业权威机构支持&#xff0c;整体展出规模约70,000平方米&#xff0c;预计汇聚1,400余家参展企业和25,000名专…...

MedGemma-X实战教程:用status_gradio.sh实时监控GPU利用率与内存泄漏

MedGemma-X实战教程&#xff1a;用status_gradio.sh实时监控GPU利用率与内存泄漏 1. 为什么你需要实时监控MedGemma-X的GPU状态 MedGemma-X不是一台“开箱即用就永远稳定”的黑盒子。它是一套在GPU上高速运转的多模态影像认知系统——当它正在分析一张胸部X光片、生成结构化报…...

从RS-485到MQTT:手把手教你为BMS Modbus设备搭建物联网网关(Node-RED实战)

从RS-485到MQTT&#xff1a;手把手教你为BMS Modbus设备搭建物联网网关&#xff08;Node-RED实战&#xff09; 当工业现场的BMS设备还在使用Modbus-RTU协议时&#xff0c;如何让这些"信息孤岛"融入现代物联网架构&#xff1f;这个问题困扰着许多能源管理系统工程师。…...

终极视频硬字幕提取指南:本地OCR识别87种语言的完整解决方案

终极视频硬字幕提取指南&#xff1a;本地OCR识别87种语言的完整解决方案 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字…...