第二、三章 线性表、栈、队列和数组

news2024/10/7 8:29:46

一、数据结构定义

线性表

  1. 顺序存储(顺序表就是将线性表中的元素按照某种逻辑顺序,依次存储到从指定位置开始的一块连续的存储空间,重点是连续的存储空间。与数组非常接近)
    • 静态分配(数组的大小和空间固定,再加入新的数据会产生溢出)
      #define MaxSize 50 //线性表的最大长度
      typedef struct{
      	ElemType data[MaxSize];
      	int length;
      } SqList
      
    • 动态分配(动态分配不是链式存储,是顺序存储结构,依然是随机存取方式,只是分配的空间大小可以在运行时动态决定)
      typedef struct{
      	ElemType *data;
      	int length;  // 顺序表当前存放的元素个数,即表长
      	int size; // 顺序表预分配的存储容量,即最多可以存放的元素个数。当分配的空间存满数据后,可在内存的另一处申请一个更大的空间,将原顺序表全部拷贝到刚申请的空间,并修改size值,最后将指针指向该空间首地址
      } SqList; 
      
  2. 链式存储
    • 单链表(“单”是指链表结点只存储单个指针)
      typedef struct LinkNode{
      	ElemType data;
      	struct LinkNode *next;
      } LinkNode, *LinkList;
      

      LinkNode*和LinkList是等价的:通常用LinkNode*表示单链表节点的指针变量;用LinkList表示单链表的头指针

    • 双向链表
      typedef struct DLinkNode{
      	ElemType data;
      	struct DLinkNode *prior, *next; // 前驱和后继指针
      } DLinkNode, *DLinkList;
      
    • 循环链表(相比于之前的单链表和双链表,其特点是表中最后一个节点的指针指向头节点,整个链表形成一个环)
      • 循环单链表
        typedef struct LNode{
        	ElemType data;
        	struct LNode *next;
        } LNode, *LinkList;
        
        // 初始化一个循环单链表
        bool InitList(LinkList &L){
        	L = (LNode *) malloc(sizeof(LNode)); // 分配一个头节点
        	if (L==NULL)
        		return false;
        	L->next = L; // 头节点next指向头节点
        	return true;
        }
        
      请添加图片描述
      在这里插入图片描述
      • 循环双链表
        typedef struct DNode{
        	ElemType data;
        	struct DNode *prior, *next;
        } DNode, *DLinklist;
        
        // 初始化空的循环双链表
        bool InitDLinkList(DLinkList &L){
        	L = (DNode *) malloc(sizeof(DNode));
        	if (L==NULL)
        		return false;
        	L->prior = L;
        	L->next = L;
        	return true;
        }
        
        请添加图片描述
        在这里插入图片描述
    • 静态链表(单链表是用的指针,但是有的编程语言是没有指针这个功能的,可以用数组来代替指针来描述单链表,这种用数组描述的链表就叫静态链表)
      #define MaxSize 10
      typedef struct{
      	ElemType data; // 存储数据元素
      	int next; // 下一个元素的数组下标
      } SLinkList[MaxSize];
      
      在这里插入图片描述
      请添加图片描述
      • 优点:增、删操作不需要大量移动元素
      • 缺点:不能随机存取,只能从头节点开始依次往后查找;容量固定不可变
      • 使用场景:不支持指针的低级语言;数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

  1. 栈的顺序存储(静态数组实现,并需要记录栈顶指针)
    #define MaxSize 50
    typedef struct{
    	Elemtype data[MaxSize];
    	int top; //指向栈顶位置
    }SqStack;
    
  2. 共享栈(顺序存储,两个栈共享同一片空间。栈满条件:top0+1==top1)
    #define MaxSize 10
    typedef struct{
    	ElemType data[MaxSize];
    	int top0; // 0号栈栈顶指针
    	int top1; // 1号栈栈顶指针
    } ShStack;
    
  3. 栈的链式存储(入栈就是在头节点后面插入一个元素,出栈就是把头节点下一个元素删除)
    typedef struct LinkNode{
    	ElemType data;
    	struct LinkNode *next;
    } LinkNode, *LiStack;
    
    请添加图片描述

队列

  1. 顺序存储
    #define MaxSize 50 // 定义队列中元素的最大个数
    typedef struct{
    	ElemType data[MaxSize];
    	int front, rear;
    } SqQueue;
    
  2. 链式存储(头指针指向队首节点的前一个节点,方便删除;尾指针指向队尾节点)
    typedef struct LinkNode{
    	ElemType data; 
    	struct LinkNode *next;
    } LinkNode;
    
    typedef struct{
    	LinkNode *front, *rear; // 队列可由队头指针和队尾指针代表整个链表,因此将队头指针和队尾指针放入一个结构体用来表示队列
    } LinkQueue;
    
  3. 循环队列:是解决了假溢出问题的顺序队列
  4. 双端队列:指在队列的两端都可以进行插入和删除操作的队列

数组

无代码

二、代码/算法

线性表

  1. 顺序表上的基本操作:初始化(静态分配and动态分配)、插入、删除、按位查找、按值查找、遍历输出、顺序表清空、顺序表判空、(动态分配)增加动态数组的长度
  2. 单链表上的操作:
    • 单链表的初始化
      • 有头节点
      • 无头节点(不带头节点,写代码更麻烦。对第一个数据节点和后续数据节点的处理需要用不同的代码逻辑,对空表和非空表的处理需要用不同的代码逻辑)
    • 建立单链表
      • 头插法
      • 尾插法
    • 按位查找节点
    • 按值查找节点
    • 单链表遍历输出
    • 插入节点
    • 删除节点
    • 求表长
    • 单链表清空
    • 判空
    • 原地倒置单链表
    • 双指针遍历单链表:双指针的几个经典用法:
      • 找到链表倒数第k个节点
      • 找到链表中间的节点
      • 判断链表是否有环
  3. 双链表上的基本操作:插入、删除
  4. 循环链表的插入和删除与普通链表区别不大,只需在头尾处进行插入删除操作时要注意维护循环链表循环的特性。若

  1. 顺序栈的基本操作:初始化、判空、判满、进栈、出栈、读栈顶元素
  2. 链栈的基本操作:进栈、出栈

队列

  1. 不同队列的操作:初始化、判队空、判队满、入队、出队
    • 链式存储下,一般不会队满,除非内存不足

不同数据结构的对比

  1. 顺序表 VS 链表
    • 逻辑结构:都属于线性表,都是线性结构
    • 物理结构(存储结构)
      • 顺序表是顺序存储,支持随机存取、存储密度高。但大片连续空间分配不方便,改变容量不方便
      • 链表是链式存储,离散的小空间分配方便,改变容量方便。但不可随机存取,存储密度低
    • 数据的运算和操作
      • 创建:
        • 顺序表需要预先分配大片连续空间(静态分配容量不可改变,动态分配容量可改变,但要移动大量元素,时间代价高);
        • 链式存储只需分配一个头节点(也可不要头节点,只声明一个头指针)
      • 销毁:
        • 顺序表:静态分配为系统自动回收空间;动态分配需要手动free(删除)
        • 链表:需要依次free各个节点
      • 插入/删除元素
        • 顺序表:需要将后序元素都后移/前移,时间复杂度 O ( n ) O(n) O(n)(主要来源于移动元素)
        • 链表:只需修改指针,时间复杂度 O ( n ) O(n) O(n)(主要来源于查找目标元素)
      • 查找
        • 顺序表:按位查找 O ( 1 ) O(1) O(1);按值查找 O ( n ) O(n) O(n)
        • 链表:按位查找 O ( n ) O(n) O(n);按值查找 O ( n ) O(n) O(n)
    • 综上,若表长难以预估、经常要增加/删除元素,用链表;若表长可预估、查询(搜索)操作较多则用顺序表

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

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

相关文章

【IDEA问题】下载不了源代码

引出问题 最近不知道怎么打开 IDEA,本想查看源代码,然后点击下载源码,总是报找不到此对象的源代码。百度找了半天,GPT问了半天还是解决不了,直到遇到了这篇:idea中无法下载源码问题解决,终于得…

wms仓储管理系统是什么,wms仓储管理系统有什么用

阅读本文,您可以了解:1、wms仓储管理系统是什么;2、wms仓储管理系统有什么用 一、wms仓储管理系统是什么 WMS是Warehouse Management System(仓储管理系统)的缩写。它是一种用于优化和管理仓库操作的软件系统。WMS帮…

液压机行业分析报告:市场规模调查及行业发展趋势

液压机是一种以液体为工作介质,根据帕斯卡原理制成的用于传递能量以实现各种工艺的机器。液压机一般由本机(主机)、动力系统及液压控制系统三部分组成。 液压机应用领域 【汽车】液压机被汽车和卡车零件制造商用于原始设备和售后市场产品。…

小白到运维工程师自学之路 第七十二集 (半自动yum安装k8s集群)

一、准备环境 修改主机名 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 bashvim /etc/hosts 192.168.77.14 k8s-master 192.168.77.15 k8s-node1 192.168.77.16 k8s-node2 下载阿里源 wget -O /etc/yum…

Typora缩小行间距

Typora确实是个好工具,但行间距太宽,写东西写起来太难受,作为已经深度使用两天的大神(小白)终于找到了正确的打开方式,以下: Ⅰ.ShiftEnter # 不太推荐,不符合日常习惯,效果约等于单回车 Ⅱ.直…

QProgressDialog进度条类

QProgressDialog 常用API简单的使用 QProgressDialog类是QDialog的子类, 通过这个类我们可以得到一个带进度条的对话框窗口 常用API // 构造函数 /* 参数:- labelText: 对话框中显示的提示信息- cancelButtonText: 取消按钮上显示的文本信息- minimum: 进度条最小值- maximum…

Mysql整理

一、基础概念 1. 索引 之前的文章已经写过了,比较细 数据库索引含义,类别,用法,创建方式_表结构加树形id和索引是为什么_马丁•路德•王的博客-CSDN博客 简单概括就是在表的某个列或者多个列或者联合表的时候加个索引,类似图书馆书本的索引编号&…

lwip使用收发线程和不使用收发线程差异

使用收发线程的方式相对于不使用收发线程的方式,效率可能会稍低一些,这取决于具体的应用场景和实现方式。 lwIP(轻量级IP协议栈)是一个针对嵌入式系统的开源TCP/IP协议栈。它可以在单个线程中运行,也可以在多个线程中…

强大的AI语言模型

1.kameAI 点我 1️⃣可以绘图 2️⃣对接4.0 3️⃣具有长篇写作

UG NX二次开发(C#)-CAM自定义铣加工的出口环境

文章目录 1、前言2、自定义铣削加工操作3、出错原因4、解决方案4.1 MILL_USER的用户参数4.2 采用自定义铣削的方式生成自定义的dll4.2 配置加工的出口环境4.3 调用dll5、结论1、前言 作为一款大型的CAD/CAM软件, UG NX为我们提供了丰富的加工模板,通过加工模板能直接用于生成…

欧拉降幂问题

题目连接 D-幂运算_2023河南萌新联赛第(四)场:河南大学 (nowcoder.com) djz的数学题 (nowcoder.com) 欧拉降幂 当 b 过大时,快速幂的时间复杂度超过题目要求时,考虑欧拉降幂。 (c)是 欧拉函数…

C 语言的文件,流, 键盘输入, 重定向

文章目录 The End of File重定向 redirection输入重定向输出重定向组合重定向 A file is an area of memory in which information is stored. Normally, a file is kept in some sort of permanent memory, such as a hard disk, USB flash drive, or optical disc, such as a…

基于关系有向图的知识推理2022ACM 8.9+8.10

基于关系有向图的知识推理 摘要介绍相关工作基于路径的方法基于GNN的方法 关系有向图RED-GCNr-digraph递归编码学习用于查询的基本信息 实验 摘要 知识图推理旨在从已有的知识中推断出新的事实。基于关系路径的方法在文献中显示出较强的可解释性和归纳推理能力。然而&#xff…

如何进行游戏平台搭建?

游戏平台搭建涉及多个步骤和技术,下面是一个大致的指南: 市场调研和定位:首先,要了解游戏市场和受众的需求,选择适合的游戏类型和定位。 选择平台类型:决定是要搭建网页平台、移动应用平台还是其他类型的…

Vue3 —— to 全家桶及源码学习

该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>&#xff0c;且包含 typescript 的基础用法 前言 本篇主要学习几个 api 及相关源码&#xff1a; toReftoRefstoRaw 一、toRef toRef(reactiveObj, key) 接收两个参数&#xff0c;第一个是 响应式对象…

专治疗懒病:GO、KEGG富集分析一体函数

之前我们写过GO、KEGG的富集分析&#xff0c;参见&#xff1a;补充更新&#xff1a;GO、KEGG&#xff08;批量分组&#xff09;分析及可视化。演示了差异基因KEGG或者GO的分析流程。其实差异基因的富集分析输入的文件只需要一组基因就可以了。所以我们发挥了专治懒病的优良传统…

【MySQL】创建高级联结

目录 一、使用表别名 二、使用不同类型的联结 1.自联结 2.自然联结 3.外部联结 3.使用带聚集函数的联结 4.使用联结和联结条件 一、使用表别名 别名除了用于列名和计算字段外&#xff0c;SQL还允许给表名起别名。 起别名有两个好处&#xff1a; 一个是缩短SQL语句&am…

群晖6.X便捷的安装cpolar内网穿透

群晖6.X便捷的安装cpolar内网穿透 文章目录 群晖6.X便捷的安装cpolar内网穿透前言1. 下载cpolar的群晖套件1.1 打开群晖套件中心1.2 选择“手动安装”1.3 选择下载cpolar套件位置 2. 打开cpolar的Web-UI界面3. 注册会员 前言 随着硬件设备和软件技术的发展&#xff0c;以及数据…

ElasticsSearch基础概念和安装

ElasticSearch基础概念以及可视化界面安装 文章目录 ElasticSearch基础概念以及可视化界面安装1、引言2、基本概念3、倒排索引机制3.1、倒排索引 4、使用docker安装ElasticSearch4.1、下载镜像文件4.2 、创建实例,启动es 5.安装Kibana 1、引言 Elastic 的底层是开源库 Lucene。…

朋友圈点赞截图生成,制作朋友圈网页​

支持纯文字内容&#xff0c;图文内容&#xff0c;单图&#xff0c;多图。自定义点赞数量、自定义评论&#xff0c;随机头像和自定义头像。 这个工具基本支持我们所需要的所有功能。可以说是目前最全的朋友圈页面生成器。 朋友圈页面样式是Iphone pro 14上的效果&#xff0c;几…