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

server/2024/12/23 2:39:09/

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

本文目录

  • 引言
  • 正文
    • 一、顺序表的概念及结构
      • 1. 顺序表的定义
      • 2. 顺序表的结构
      • 3. 顺序表的初始化
    • 二、顺序表的基本操作(静态)
      • 1. 插入操作
      • 2. 删除操作
      • 3. 查找操作
      • 4. 更新操作
      • 5. 获取元素操作
      • 6. 遍历操作
      • 7. 求顺序表的长度
      • 8. 判断顺序表是否为空
  • 快乐的时光总是短暂,咱们下篇博文再见啦!!!在下一篇博文,小编将会带着宝子们学习动态顺序表,敬请期待吧!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!

引言

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

在这里插入图片描述


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

正文


一、顺序表的概念及结构

1. 顺序表的定义

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

2. 顺序表的结构

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

如下所示:

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

3. 顺序表的初始化

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

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

void InitList(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)

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

int LocateElem(SqList L, ElemType e) {for (int i = 0; i < L.length; i++) {if (L.data[i] == e) {return i + 1; // 返回查找到的元素的位序(从1开始计数)}}return 0; // 未找到目标元素,返回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)

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

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

7. 求顺序表的长度

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

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

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

8. 判断顺序表是否为空

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

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

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

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


http://www.ppmy.cn/server/152384.html

相关文章

ELK部署

背景 很多公司还是在单体项目中苦苦挣扎&#xff0c;没有必要上elk系统&#xff0c;大家都懂的一个原则系统的技术栈越多系统越复杂&#xff0c;维护起来也越麻烦&#xff0c;在没有大流量高并发的情况下我们就用单体服务挺舒服。我们行业的特殊性做的都是BTB的项目&#xff0…

Bootstrap Blazor中使用PuppeteerSharp对HTML截图

PuppeteerSharp是一个基于.NET的库&#xff0c;提供了对Puppeteer的C#支持&#xff0c;用于自动化&#xff0c;可用于测试、截图、爬虫等任务。 官网&#xff1a;Puppeteer Sharp&#xff08;感觉文章中有些代码段没有更新&#xff0c;直接用会有报错&#xff09;。 本篇文章…

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…

uni-app商品搜索页面

目录 一:功能概述 二:功能实现 一:功能概述 商品搜索页面,可以根据商品品牌,商品分类,商品价格等信息实现商品搜索和列表展示。 二:功能实现 1:商品搜索数据 <view class="search-map padding-main bg-base"> <view class…

uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决

要在创建的key上添加配额 点击配额之后进入分配页面&#xff0c;分配完之后刷新uniapp就可以调用成功了。

VMware虚拟机Ubuntu 18.04版本 磁盘扩容

一、版本配置 虚拟机版本&#xff1a;VMware WORKSTATION 16 PRO Ubuntu版本&#xff1a;Ubuntu 18.04 二、磁盘大小介绍 目的&#xff1a;磁盘扩容&#xff08;20G----->100G&#xff09;&#xff0c;从20G扩到100G 查看磁盘大小命令&#xff1a;df -h 扩容前的磁盘大小 …

MySQL -- 库的相关操作

目录 查看数据库 创建数据库 直接创建&#xff1a; 加约束条件 if not exists 字符集和校对规则 什么是字符集 什么是校对规则 校对规则的主要功能 校对规则的特性 查看指定的数据库使用的字符集和校对规则&#xff1a; 比较是否区分大小写字母差异 显示创建语句 …

QP:Query类目

Query类目 Query类目指的是根据查询内容将查询词Query归类到某个特定的分类体系中。这个体系通常是多级的&#xff0c;能够将查询词从更广泛的类别逐渐细分到更具体的子类目&#xff0c;这个体系通常在电商搜索和推荐领域中有重要的作用。 Query和Doc一般共用一套类目体系&am…