数据结构--线性表(顺序结构)

1.线性表的定义和基本操作

1.1线性表以及基本逻辑

1.1.1线性表

(1)n(>=0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。

(2)ai是线性表中“第i个”元素在线性表中的位序。

注意:数组下标从0(a[0])开始,位序从1开始.

 1.1.2逻辑特征(n>0)

存在唯一的一个被称为“第一个”的数据元素。

存在唯一的一个被称为“最后一个”的数据元素。

除了第一个元素以外,其他元素均只有一个直接前驱。

除了最后一个元素外,其他元素均只有一个直接后继。

1.2线性表的基本操作

InitList(&L)              //创建一个新的线性表L

ListEmpty(L)           //判断L是否为空

ListLength(L)          //求L的长度

GetElem(L,i,&e)     //取i位置数据元素的值

ClearList(&L)          //将L置为空表

ListInsert(&L,i,e)     //在i位置插入值为e的数据元素

ListDelete(&L,i,&e) //删除i位置的元素e

1.ListInsert(&L,i,e)  ,传值

2.ListDelete(&L,i,&e),传引用

3.ListDelete(&L,i,*e),传指针

1.形参改变->不会影响实参

2.3.形参改变->会影响实参(传引用,传指针)

 下面用一张图来介绍形参和实参的区别:(by 通义千问)

传引用(&)适用场景:

1.需要函数修改原始数据。

2.对于大型数组或对象,为了节省内存开销和提升运算效率,使用引用传递。

一句话:对参数的修改结果要“带回来”。 

2.线性表的顺序表示

2.1线性表和顺序表的定义

(1)线性表:线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。

(2)顺序表:用顺序的方式实现线性表的顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

2.2静态分配和动态分配

2.2.1静态分配

#define MAX 10
int arr[MAX];
int n;         //数据元素个数小于n个

结构体进行封装:

#define MAX 100
typedef struct
{ElemType elem[MAX];int n;
}Sqlist;

2.2.2动态存储

(1)动态申请和释放内存空间

(2)C语言--malloc,free函数

L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize)
//malloc函数返回一个指针,需要用“(ElemType *)”强制类型转化为自己定义的数据元素类型指针

2.2.3顺序表基本操作实现

1.初始化顺序表InitList_Sq(&L)

操作结果:构造一个空的顺序表L.

Status InitList_Sq(SqList&L)       // 定义一个函数名为 InitList_Sq 的函数,参数是对 SqList 类型的引用 L,返回类型为 Status(这里 Status 可能是一个自定义的表示状态的类型)
{L.elem=(ElemType*)malloc(initial_size*sizeof(ElemType));  // 为 L 的 elem 属性分配一块内存空间,大小为 initial_size 个 ElemType 类型元素所需的空间,并将其地址转换为 ElemType*类型赋给 L.elemif(!L.elem)                    // 如果分配内存失败(L.elem 为假,即内存分配不成功得到的是 null 指针等情况)exit(OVERFLOW);            // 退出程序并表示存储空间分配失败(OVERFLOW 可能是一个表示溢出或错误的常量)L.length=0;                    // 将顺序表 L 的当前长度设置为 0L.listsize=initial_size;       // 将顺序表 L 的初始容量设置为 initial_sizereturn 0;                      // 返回一个状态值(这里可能表示成功初始化)
}

下面是对顺序表中长度和容量的解释: 

在顺序表(Sequential List)中:

 

一、长度(length

 

指的是顺序表中当前实际存储的元素个数。

 

例如,如果有一个顺序表存储了 5 个整数,那么这个顺序表的长度就是 5。随着向顺序表中添加或删除元素,长度会相应地发生变化。

 

二、容量(listsize

 

指的是顺序表预先分配的能够存储元素的最大空间大小。

 

例如,一开始创建顺序表时可能分配了一块可以存储 10 个整数的连续内存空间,那么此时这个顺序表的容量就是 10。当顺序表中的元素个数达到容量时,如果要继续添加元素,通常需要进行扩容操作(重新分配更大的连续内存空间)。而如果顺序表中的元素个数远小于容量,那么就存在一部分未被使用的内存空间。

2.销毁顺序表DestroyList_Sq(&L):

释放L所占用的内存空间

void DestroyList_Sq(SqList &L)
{free(L.elem); // 释放顺序表 L 的存储数据的内存空间。free 函数用于释放由 malloc、calloc 或 realloc 等函数分配的动态内存。L.elem = NULL; // 将 L 的 elem 指针设置为 NULL,避免出现悬空指针。L.length = 0; // 将顺序表的长度设置为 0,表示表中没有元素。L.listsize = 0; // 将顺序表的容量设置为 0。
}

3.判定是否为空表 ListEmpty_Sq(L):

若L为空表,返回1,否则返回0;

int ListEmpty_Sq(SqList L)
{if (L.length==0)return 1;else return 0;

4.输出顺序表 DispList_Sq(L):

操作结果:当L不为空时,顺序显示L中各个元素的值。

Status DispList_Sq(SqList L)
{if (ListEmpty_Sq(L))return ERROR;// 如果顺序表为空(通过调用 ListEmpty_Sq 函数判断),则返回 ERROR(可能是一个表示错误的状态码)。for(i=0;i<=L-1;i++){print(L.elem[i]);}// 如果顺序表不为空,遍历顺序表,从第一个元素(下标为 0)开始,直到最后一个元素(下标为 L-1),逐个打印顺序表中的元素。return OK;// 遍历完成后,返回 OK(可能是一个表示成功的状态码)。
}

5.插入数据元素  ListInsert_Sq(&L,i,e):

操作结果:在顺序表L的第i个位置前插入新元素e. 

ListInsert_Sq(SqList &L, int i, ElemType e) 
{if (i < 1 || i > L.length + 1) {return ERROR;}// 判断插入位置 i 是否合法,i 应该在 1 到(当前顺序表长度 + 1)之间,否则返回错误状态码 ERROR。if (L.length >= L.listsize) {newbase = (ElemType*)malloc(L.elem,(L.listsize + ElemNumber)*sizeof(ElemType));L.elem = newbase;L.listsize += ElemNumber;}// 如果当前顺序表中已存储的元素个数(L.length)等于或超过了顺序表的容量(L.listsize),则进行扩容操作。// 分配一块新的内存空间,大小为原来的容量加上 ElemNumber 个 ElemType 类型元素所需的空间,然后将新分配的内存地址赋给 L.elem,并更新顺序表的容量 L.listsize。for (j = L.length; j >= i; j--) {L.elem[j] = L.elem[j - 1];}// 将插入位置 i 及之后的元素向后移动一位。L.elem[i - 1] = e;// 在插入位置 i 处放入新元素 e。++L.length;// 顺序表长度加一。return 1;// 返回一个表示成功的状态码(这里是 1)。
}

时间复杂度:

-最好情况:新元素插到表尾,不需要移动元素i=n+1,循环0次,T(n)=O(1);

-最坏情况:新元素插到表头,需要将原有的n个元素全部向后移动i=1,循环n次,T(n)=O(n);

-平均情况:,新元素插入到任意一个位置概率相同,需要的时间是n/2,考虑到时间复杂度量级,T(n)=O(n).  

6.删除数据元素 ListDelete_Sq(&L,i,&e):

操作结果:删除顺序表L中的第i个元素,用引用变量e返回删除的元素。

ListInsert_Sq(SqList &L, int i, ElemType &e) 
{if (i < 1 || i > L.length) {return ERROR;}// 判断插入位置 i 是否合法。i 应该在 1 到顺序表的当前长度之间,如果不合法则返回错误状态码 ERROR。e = L.elem[i - 1];// 将顺序表中位置 i 处的元素赋值给参数 e。for (j = i; j < L.length; j++) {L.elem[j - 1] = L.elem[j];}// 从位置 i 开始,将后面的元素依次向前移动一位。--L.length;// 顺序表的长度减一,表示删除了一个元素。return 1;// 返回一个表示成功的状态码(这里是 1)。
}

时间复杂度:

-最好情况:T(n)=O(1);

-最坏情况:T(n)=O(n);

-平均情况:T(n)=O(n).  

 7.按位查找操作 GetElem(L,i):

操作结果:获取表L中的第i个位置元素的值。

ElemType GetElem(SeqList L,int i)
{return L.data[i-1];
}

 时间复杂度:O(1)

 8.按值查找操作 LocateElem(L,e):

操作结果:在表L中查找具有给定关键字值的元素(第一个)。

//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L,ElemType e)
{for(int i=0;i<=L.length-1;i++){if(L.data[i]==e){return i+1;}}return 0;
}

时间复杂度:

-最好情况:目标元素子啊表头,循环1次,T(n)=O(1);

-最坏情况:目标元素在表尾,循环n次,T(n)=O(n);

-平均情况:目标元素出现在任何一个位置的概率相同,T(n)=O(n).  

 下面是链表,敬请期待...

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

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

相关文章

Redis数据库与GO(二):list,set

一、list&#xff08;列表&#xff09; list&#xff08;列表&#xff09;是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。List本质是个链表&#xff0c; list是一个双向链表&#xff0c;其元素是有序的&#xff0c;元…

51单片机系列-串口(UART)通信技术

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 并行通信和串行通信 并行方式 并行方式&#xff1a;数据的各位用多条数据线同时发送或者同时接收 并行通信特点&#xff1a;传送速度快&#xff0c;但因需要多根传输线&#xf…

计算机视觉学习路线:从基础到进阶

计算机视觉学习路线&#xff1a;从基础到进阶 计算机视觉&#xff08;Computer Vision&#xff09;是人工智能和机器学习领域中重要的分支&#xff0c;致力于让计算机能够理解和分析图像、视频等视觉信息。随着深度学习的发展&#xff0c;计算机视觉的应用变得越来越广泛&…

HTML增加文本复制模块(使用户快速复制内容到剪贴板)

增加复制模块主要是为了方便用户快速复制内容到剪贴板&#xff0c;通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤&#xff1a; HTML结构&#xff1a; 在文本旁边添加一个复制按钮&#xff0c;例如 <butto…

车载入行:HIL测试、功能安全测试、CAN一致性测试、UDS测试、ECU测试、OTA测试、TBOX测试、导航测试、车控测试

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

【易社保-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【黑马软件测试三】web功能测试、抓包

阶段三&#xff0c;内容看情况略过 Web功能测试链接测试表单测试搜索测试删除测试cookies/session测试数据库测试抓包工具的使用一个APP的完整测试流程熟悉APP业务流程功能测试APP专项测试兼容性安装、卸载和升级交叉测试(干扰测试)push消息测试用户体验测试 Web功能测试 通过…

Windows安装ollama和AnythingLLM

一、Ollama安装部署 1&#xff09;安装ollama 官网下载&#xff1a;https://ollama.com/download&#xff0c;很慢 阿里云盘下载&#xff1a;https://www.alipan.com/s/jiwVVjc7eYb 提取码: ft90 百度云盘下载&#xff1a;https://pan.baidu.com/s/1o1OcY0FkycxMpZ7Ho8_5oA?…

PostgreSQL 任意命令执行漏洞(CVE-2019-9193)

记一次授权攻击通过PostgreSql弱口令拿到服务器权限的事件。 使用靶机复现攻击过程。 过程 在信息收集过程中&#xff0c;获取到在公网服务器上开启了5432端口&#xff0c;尝试进行暴破&#xff0c;获取到数据库名为默认postgres&#xff0c;密码为1 随后连接进PostgreSql …

需求6:如何写一个后端接口?

这两天一直在对之前做的工作做梳理总结&#xff0c;不过前两天我都是在总结一些bug的问题。尽管有些bug问题我还没写文章&#xff0c;但是&#xff0c;我今天不得不先停下对bug的总结了。因为在国庆之后&#xff0c;我需要自己开发一个IT资产管理的功能&#xff0c;这个功能需要…

【Maven】依赖管理,Maven仓库,Maven核心功能

Maven 是一个项目管理工具&#xff0c;基于 POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;的概念&#xff0c;Maven 可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件 大白话&#xff1a;Maven 是一个项目管理工…

GAMES101(19节,相机)

相机 synthesis合成成像&#xff1a;比如光栅化&#xff0c;光线追踪&#xff0c;相机是capture捕捉成像&#xff0c; 但是在合成渲染时&#xff0c;有时也会模拟捕捉成像方式&#xff08;包括一些技术 动态模糊 / 景深等&#xff09;&#xff0c;这时会有涉及很多专有名词&a…

Linux 安装 yum

第一步&#xff1a;下载安装包 这里以 CentOS 7 为例 wget https://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm wget https://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget…

初识算法 · 双指针(4)

目录 前言&#xff1a; 复写零 题目解析 算法原理 算法编写 四数之和 题目解析 算法原理 算法编写 前言&#xff1a; 本文是双指针算法的最后一文&#xff0c;以复写零和四数之和作为结束&#xff0c;介绍方式同样是题目解析&#xff0c;算法原理&#xff0c;算法编写…

电气自动化入门10:传感器应用介绍

视频链接&#xff1a;4.1 电工知识&#xff1a;传感器应用介绍与接近开关的实际应用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p12&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电工传感器介绍 2.常用电工传感器的种类和用途 3.接近开关

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

TCP BIC 的拟合函数分析

前面说了这么多&#xff0c;还没有对 bic 的数学性质进行分析&#xff0c;本文补上。 tcp reno 完全依赖 ack 时钟以 rtt 为单位线性增窗&#xff0c;增窗速度与 rtt 负相关&#xff0c;如何在 rtt 比较大时增加增窗速度&#xff0c;这就是 bic&#xff0c;以二分替换遍历。 …

银河麒麟服务器:检查仓库源连接状态

银河麒麟服务器&#xff1a;检查仓库源连接状态 1. 清理YUM缓存2. 生成YUM缓存 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟高级服务器操作系统中&#xff0c;要检查仓库源是否连接成功&#xff0c;可以执行以下两个命令&…

SQL优化 - 排序

文章目录 排序和索引降序索引 FilesortORDER BY 顺序问题ORDER BY LIMIT 排序和索引 如果ORDER BY操作使用了索引&#xff0c;那么就可以避免排序操作&#xff0c;因为索引本身就是按索引 key 排好序的。那什么情况下&#xff0c;ORDER BY会走索引呢&#xff1f; 例如&#…

C#基于SkiaSharp实现印章管理(10)

向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。   最初的想法是使用PDF浏览控件在线打开PDF文件&#xff0c;然后在控件中实现鼠标移动时动态显示印章&#xff0c;点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目&#xff0c;选…