重生之我在异世界学编程之算法与数据结构:深入静态顺序表篇

重生之我在异世界学编程之算法与数据结构:深入静态顺序表篇
大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在ZEEKLOG这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

本文目录

引言

C语言顺序表(Sequential List)是一种线性表的存储结构,采用一段地址连续的存储空间来依次存放线性表的元素。其特点是逻辑上相邻的元素在物理位置上也相邻,可以通过下标直接访问任意位置的元素,因此具有高效的随机存取性能。顺序表通常使用数组来实现,并配备一个变量来记录当前表的长度。其主要操作包括初始化、插入、删除、查找和遍历等。由于需要预先分配固定大小的内存空间,顺序表在插入和删除元素时可能会遇到内存重新分配的问题,但在已知数据规模或元素变动不频繁的情况下,顺序表仍是一种高效且易于实现的数据结构。那现在,一起来看看吧!!!

在这里插入图片描述

那接下来就让我们开始遨游在知识的海洋!

正文


一、顺序表的概念及结构

1. 顺序表的定义

顺序表是用一段地址连续的存储单元依次存储线性表的数据元素的线性表。其特点是逻辑上相邻的元素在物理位置上也相邻。顺序表一般使用数组来实现。

2. 顺序表的结构

顺序表的基本结构包括一个用于存储数据元素的数组和一个表示当前顺序表长度的变量(通常称为“长度”或“size”)。此外,为了操作的方便和高效,有时还需要设置一个“最大容量”(通常称为“capacity”)来表示顺序表可以容纳的最大元素个数。

如下所示:

#defineMAXSIZE100// 定义顺序表的最大容量typedefint ElemType;// 定义顺序表中存储的数据类型typedefstruct{ ElemType data[MAXSIZE];// 存储数据元素的数组int length;// 当前顺序表的长度} SqList;
  • 在上述结构中,data是一个一维数组,用于存放顺序表中的元素;length是一个整型变量,用于记录顺序表中当前所含元素的个数。

3. 顺序表的初始化

顺序表的初始化操作主要是设置其长度为0,并可以根据需要为其分配存储空间(如果采用动态分配的话)。

以下是一个简单的初始化函数示例:

voidInitList(SqList *L){ L->length =0;// 将顺序表的长度初始化为0}

注意:

  • 这里我们假设顺序表的存储空间已经通过定义结构体时分配的数组来实现了,因此不需要额外的内存分配操作。如果需要动态分配存储空间,则需要在初始化函数中调用相应的内存分配函数(如malloc)来为data数组分配内存。

二、顺序表的基本操作(静态)

1. 插入操作

在顺序表中插入一个新元素时,需要找到插入位置,然后将该位置及其后的所有元素都向后移动一位,最后将新元素放入指定位置。插入操作的时间复杂度为O(n),其中n是顺序表的长度。

以下是插入操作的实现代码:

#include<stdio.h>#include<stdbool.h> bool ListInsert(SqList *L,int i, ElemType e){if(i <1|| i > L->length +1){return false;// 插入位置不合法}if(L->length >= MAXSIZE){return false;// 顺序表已满,无法插入新元素}for(int k = L->length -1; k >= i -1; k--){ L->data[k +1]= L->data[k];// 将插入位置及其后的元素后移一位} L->data[i -1]= e;// 在指定位置插入新元素 L->length++;// 顺序表长度加1return true;}
  • 在上述代码中,我们首先检查插入位置是否合法以及顺序表是否已经满员。然后,从顺序表的末尾开始向前遍历,将插入位置及其后的所有元素都向后移动一位。最后,在指定位置插入新元素,并将顺序表的长度加1

2. 删除操作

在顺序表中删除一个元素时,需要找到要删除的元素的位置,然后将该位置之后的所有元素都向前移动一位。删除操作的时间复杂度也为O(n)。

以下是删除操作的实现代码:

bool ListDelete(SqList *L,int i, ElemType *e){if(i <1|| i > L->length){return false;// 删除位置不合法}*e = L->data[i -1];// 保存被删除的元素的值for(int k = i; k < L->length; k++){ L->data[k -1]= L->data[k];// 将删除位置之后的元素前移一位} L->length--;// 顺序表长度减1return true;}
  • 在上述代码中,我们首先检查删除位置是否合法。然后,将要删除的元素的值保存到参数e指向的变量中。接着,从删除位置开始向后遍历,将删除位置之后的所有元素都向前移动一位。最后,将顺序表的长度减1

3. 查找操作

在顺序表中查找一个元素时,需要从头到尾依次比较每个元素与目标值的大小关系,直到找到目标值或者遍历完整个顺序表为止。查找操作的时间复杂度为O(n)。

以下是按值查找操作的实现代码:

intLocateElem(SqList L, ElemType e){for(int i =0; i < L.length; i++){if(L.data[i]== e){return i +1;// 返回查找到的元素的位序(从1开始计数)}}return0;// 未找到目标元素,返回0或其他特殊标记值}
  • 在上述代码中,我们使用了一个循环来遍历顺序表中的每个元素,并将其与目标值进行比较。如果找到了目标值,则返回其在顺序表中的位序(从1开始计数);否则,返回0或其他特殊标记值来表示未找到目标元素

另外,还可以根据元素的位序来查找对应的元素值。这种操作的时间复杂度也是O(1)(因为可以直接通过下标访问),但前提是已知元素的位序且该位序在顺序表的范围内内有效


4. 更新操作

更新操作是指修改顺序表中某个位置的元素的值。由于顺序表是基于数组的实现的,因此可以通过直接访问数组的下标来快速定位并修改指定位置的元素的值。更新操作的时间复杂度为O(1)。

以下是更新操作的实现代码:

bool ListUpdate(SqList *L,int i, ElemType e){if(i <1|| i > L->length){return false;// 修改位置不合法} L->data[i -1]= e;// 修改指定位置的元素的值return true;}
  • 在上述代码中,我们首先检查修改位置是否合法。然后,直接通过下标访问并修改指定位置的元素的值。

5. 获取元素操作

获取元素操作是指获取顺序表中某个位置的元素的值。与更新操作类似,由于顺序表是基于数组的实现的,因此可以通过直接访问数组的下标来快速获取指定位置的元素的值。获取元素操作的时间复杂度也为O(1)。

以下是获取元素操作的实现代码:

bool GetElem(SqList L,int i, ElemType *e){if(i <1|| i > L.length){return false;// 获取位置不合法}*e = L.data[i -1];// 获取指定位置的元素的值return true;}
  • 在上述代码中,我们首先检查获取位置是否合法。然后,直接通过下标访问并获取指定位置的元素的值,并将其保存到参数e指向的变量中。

6. 遍历操作

遍历操作是指依次访问顺序表中的每个元素,并对它们进行某种处理(如打印输出)。遍历操作可以使用循环语句来实现,时间复杂度为O(n)。

以下是遍历操作的实现代码:

voidTraverseList(SqList L){for(int i =0; i < L.length; i++){printf("%d ", L.data[i]);// 打印输出每个元素的值(假设元素类型为整型)}printf(" ");}
  • 在上述代码中,我们使用了一个循环来遍历顺序表中的每个元素,并使用printf函数将其打印输出。当然,在实际应用中,对元素的处理方式可能更加复杂多样。

7. 求顺序表的长度

求顺序表的长度操作是指获取顺序表中当前所含元素的个数。由于顺序表的长度是通过一个整型变量来记录的,因此该操作的时间复杂度为O(1)。

以下是求顺序表长度的实现代码:

intListLength(SqList L){return L.length;// 返回顺序表的长度}
  • 在上述代码中,我们直接返回了顺序表的长度变量的值。

8. 判断顺序表是否为空

判断顺序表是否为空操作是指检查顺序表中是否包含任何元素。这可以通过比较顺序表的长度与0的大小关系来实现,时间复杂度为O(1)。

以下是判断顺序表是否为空的实现代码:

bool IsEmpty(SqList L){return L.length ==0;// 如果顺序表的长度为0,则表示为空表}
  • 在上述代码中,我们比较了顺序表的长度与0的大小关系,并根据结果返回一个布尔值来表示顺序表是否为空。

快乐的时光总是短暂,咱们下篇博文再见啦!!!在下一篇博文,小编将会带着宝子们学习动态顺序表,敬请期待吧!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!

Read more

Rust与WebAssembly深度实战——将高性能Rust代码运行在浏览器与Node.js

Rust与WebAssembly深度实战——将高性能Rust代码运行在浏览器与Node.js

Rust与WebAssembly深度实战——将高性能Rust代码运行在浏览器与Node.js 一、学习目标与重点 1.1 学习目标 1. 理解WebAssembly基础:深入掌握WebAssembly(Wasm/Wasmtime)的核心定义、运行机制、与JavaScript的性能对比 2. 掌握Rust到Wasm的编译:熟练使用wasm-pack、cargo-web等工具链,完成Rust代码到Wasm模块的编译、打包、优化 3. 精通Rust与JavaScript交互:实现双向交互(Rust调用JS函数、JS调用Rust函数),处理复杂数据类型(数组、对象、字符串),管理内存(Wasm线性内存的分配与释放) 4. 开发真实Wasm应用:编写浏览器端高性能任务(Canvas图像滤镜、WebGL计算辅助)、Node.js端计算密集型任务(图像处理、加密解密、数据压缩) 5. 优化Wasm模块:使用wasm-opt工具优化Wasm体积,学习代码分割、懒加载、模块缓存

By Ne0inhk
基于C++11手撸前端Promise

基于C++11手撸前端Promise

文章导航 * 引言 * 前端Promise的应用与优势 * 常见应用场景 * 并发请求 * Promise 解决的问题 * 手写 C++ Promise 实现 * 类结构与成员变量 * 构造函数 * resolve 方法 * reject 方法 * then 方法 * onCatch 方法 * 链式调用 * 使用示例 * `std::promise` 与 `CProimse` 对比 * 1. 基础功能对比 * 2. 实现细节对比 * (1) 状态管理 * (2) 回调注册与执行 * (3) 异步支持 * (4) 链式调用 * 3. 代码示例对比 * (1) `CProimse` 示例 * (2) `std::promise` 示例 * 4.

By Ne0inhk

手把手教你配置:企业微信外部群 Webhook 主动发送指南

QiWe开放平台 · 个人名片                 API驱动企微自动化,让开发更高效         核心能力:为开发者提供标准化接口、快速集成工具,助力产品高效拓展功能场景         官方站点:https://www.qiweapi.com         团队定位:专注企微API生态的技术服务团队        对接通道:搜「QiWe 开放平台」联系客服         核心理念:合规赋能,让企微开发更简单、更高效   在企业微信的自动化体系中,群机器人(Webhook) 是实现系统消息自动同步到外部群最快捷、门槛最低的工具。 虽然 2026 年官方对外部群机器人的管理更加精细化,但只要掌握正确的配置流程和调用逻辑,它依然是效率提升的神器。以下是完整的实操步骤: 第一步:获取 Webhook 地址 1. 添加机器人: 打开企业微信电脑端,进入你需要配置的外部群,点击右上角“...”,选择“群机器人” -> “添加机器人”。 2.

By Ne0inhk
网站检测不用等! Web-Check+cpolar让异地协作查漏洞更高效

网站检测不用等! Web-Check+cpolar让异地协作查漏洞更高效

文章目录 * 前言 * 1.关于Web-Check * 2.功能特点 * 3.安装Docker * 4.创建并启动Web-Check容器 * 5.本地访问测试 * 6.公网远程访问本地Web-Check * 7.内网穿透工具安装 * 8.创建远程连接公网地址 * 9.使用固定公网地址远程访问 前言 Web-Check 是一款全方位的网站诊断工具,能检测 IP 信息、SSL 证书、DNS 记录、开放端口等关键数据,适合开发者做性能优化、运维人员做安全巡检,还能帮安全测试人员识别潜在风险。它的优点是结果可视化强,所有数据在仪表盘分类呈现,不用手动整合多工具报告,省时又清晰。 用 Web-Check 时发现,检测前最好确认目标网站能正常访问,否则可能出现数据不全;另外,生成的报告里有不少专业术语,新手可以先查基础概念(比如 SSL 链、DNS

By Ne0inhk