当前位置: 首页 > 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": &…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...