玩转顺序表:用 C 语言实现数据的插入与删除

server/2025/3/6 2:08:53/

目录

顺序表的定义

插入元素

删除元素 

查找元素 

主函数

打印顺序表

完整代码

总结


在这篇博客中,我们将探讨如何使用 C 语言实现一个简单的顺序表(也称为动态数组),并实现一些基本操作,包括插入、删除和查找元素。顺序表是一种线性数据结构,具有固定的大小,适合存储相同类型的元素。

顺序表的定义

首先,我们定义顺序表的结构。顺序表由一个数组和一个表示当前长度的变量组成。

#define MaxSize 50 // 定义顺序表的最大容量typedef int ElemType; // 定义元素类型为整型typedef struct {ElemType data[MaxSize]; // 存储元素的数组int length; // 当前顺序表的长度
} SqList;

在这里,MaxSize 定义了顺序表的最大容量,ElemType 定义了元素的类型为整型。

插入元素

我们实现了一个 ListInsert 函数,用于在顺序表的指定位置插入元素。该函数首先检查插入位置的有效性和顺序表是否已满,然后将插入位置及其后面的元素向后移动,最后在指定位置插入新元素。

bool ListInsert(SqList &L, int i, ElemType element) {if (i < 1 || i > L.length + 1 || L.length == MaxSize) {return false; // 插入位置无效或顺序表已满}for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1]; // 向后移动元素}L.data[i - 1] = element; // 插入新元素L.length++; // 更新顺序表长度return true; // 插入成功
}

删除元素 

ListDelete 函数用于删除顺序表中指定位置的元素。该函数首先检查删除位置的有效性,然后保存要删除的元素,并将后面的元素向前移动。

bool ListDelete(SqList &L, int i, ElemType &e) {if (i < 1 || i > L.length) {return false; // 删除位置无效}e = L.data[i - 1]; // 保存要删除的元素for (int j = i; j < L.length; j++) {L.data[j - 1] = L.data[j]; // 向前移动元素}L.length--; // 更新顺序表长度return true; // 删除成功
}

查找元素 

LocateElem 函数用于查找顺序表中指定元素的位置。如果找到该元素,返回其位置;否则返回 0。

int LocateElem(SqList &L, ElemType element) {for (int i = 0; i < L.length; i++) {if (element == L.data[i]) {return i + 1; // 返回顺序表的下标}}return 0; // 未找到元素
}

主函数

在主函数中,我们创建一个顺序表并进行一些操作,包括插入、删除和查找元素。

int main() {SqList L; // 定义顺序表 Lbool ret; // 用于存储操作的返回值L.data[0] = 1; // 初始化顺序表L.data[1] = 2;L.data[2] = 3;L.length = 3; // 设置当前长度// 插入元素ret = ListInsert(L, 2, 4);if (ret) {printf("insert success\n");PrintList(L);} else {printf("insert failed\n");}// 删除元素ElemType del;ret = ListDelete(L, 1, del);if (ret) {printf("delete success\n");printf("deleted element: %d\n", del);PrintList(L);} else {printf("delete failed\n");}// 查找元素int pos = LocateElem(L, 60);if (pos) {printf("element found at position: %d\n", pos);} else {printf("element not found\n");

当然可以!接下来我们将继续完成博客的内容,涵盖主函数的剩余部分以及总结。

打印顺序表

为了方便查看顺序表中的元素,我们实现了一个 PrintList 函数。该函数遍历顺序表并打印出所有元素。

void PrintList(SqList L) {for (int i = 0; i < L.length; i++) {printf("%d ", L.data[i]); // 打印每个元素}printf("\n"); // 打印完毕后换行
}

完整代码

以下是完整的代码示例,包含了顺序表的定义、插入、删除、查找和打印操作:

#include <stdio.h>#define MaxSize 50 // 定义顺序表的最大容量typedef int ElemType; // 定义元素类型为整型typedef struct {ElemType data[MaxSize]; // 存储元素的数组int length; // 当前顺序表的长度
} SqList;bool ListInsert(SqList &L, int i, ElemType element) {if (i < 1 || i > L.length + 1 || L.length == MaxSize) {return false; // 插入位置无效或顺序表已满}for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1]; // 向后移动元素}L.data[i - 1] = element; // 插入新元素L.length++; // 更新顺序表长度return true; // 插入成功
}void PrintList(SqList L) {for (int i = 0; i < L.length; i++) {printf("%d ", L.data[i]); // 打印每个元素}printf("\n"); // 打印完毕后换行
}bool ListDelete(SqList &L, int i, ElemType &e) {if (i < 1 || i > L.length) {return false; // 删除位置无效}e = L.data[i - 1]; // 保存要删除的元素for (int j = i; j < L.length; j++) {L.data[j - 1] = L.data[j]; // 向前移动元素}L.length--; // 更新顺序表长度return true; // 删除成功
}int LocateElem(SqList &L, ElemType element) {for (int i = 0; i < L.length; i++) {if (element == L.data[i]) {return i + 1; // 返回顺序表的下标}}return 0; // 未找到元素
}int main() {SqList L; // 定义顺序表 Lbool ret; // 用于存储操作的返回值L.data[0] = 1; // 初始化顺序表L.data[1] = 2;L.data[2] = 3;L.length = 3; // 设置当前长度// 插入元素ret = ListInsert(L, 2, 4);if (ret) {printf("insert success\n");PrintList(L);} else {printf("insert failed\n");}// 删除元素ElemType del;ret = ListDelete(L, 1, del);if (ret) {printf("delete success\n");printf("deleted element: %d\n", del);PrintList(L);} else {printf("delete failed\n");}// 查找元素int pos = LocateElem(L, 60);if (pos) {printf("element found at position: %d\n", pos);} else {printf("element not found\n");}return 0; // 程序结束
}

总结

在这篇博客中,我们实现了一个简单的顺序表,并提供了插入、删除、查找和打印元素的基本操作。顺序表是一种简单而有效的数据结构,适用于存储和管理线性数据。通过这些基本操作,我们可以更好地理解数据结构的工作原理。

希望这篇博客能帮助你更好地理解顺序表的实现和使用。如果你有任何问题或建议,请在评论区留言!


以上就是完整的博客内容。你可以根据自己的风格和需求进行调整和修改。希望这对你有帮助!


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

相关文章

Apache IoTDB 树表双模型直播回顾(上)

2 月 26 日面向 Apache IoTDB 树表双模型的功能特性、适用场景、建模选择和未来规划&#xff0c;田原同学通过直播进行了全面解答。以下为直播讲稿&#xff08;上&#xff09;&#xff0c;干货满满&#xff0c;建议收藏⬇️⬇️ ⚡️注意&#xff1a; 1. 功能演示部分请直接查看…

linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词

问了AI写的不错&#xff0c;记录一下&#xff0c;排查一些报错的时候比较好用 在 Linux 中&#xff0c;您可以通过命令行工具查看某个文件夹下的所有文件&#xff08;限制到当前文件夹及其子文件夹两层深度&#xff09;&#xff0c;并搜索包含特定单词&#xff08;如 XXXXX&am…

基于Selenium的Python淘宝评论爬取教程

文章目录 前言1. 环境准备安装 Python&#xff1a;安装 Selenium&#xff1a;下载浏览器驱动&#xff1a; 2. 实现思路3. 代码实现4. 代码解释5. 注意事项 前言 以下是一个基于 Selenium 的 Python 淘宝评论爬取教程&#xff0c;需要注意的是&#xff0c;爬取网站数据应当遵守…

搭建一个简单的node服务,模拟后端接口

目录 一、查看是否安装了node和npm 二、创建一个文件夹&#xff0c;用于放你的node服务代码 三、初始化一个package.json 四、安装 Express&#xff08;快速搭建服务的框架&#xff09; 五、创建serve.js 六、运行服务即可 七、测试接口 法一&#xff1a;使用 curl 法…

Ruby爬虫如何控制并发数量:爬取京东电子产品

1. 引言 京东作为中国最大的电商平台之一&#xff0c;拥有海量的商品信息&#xff0c;其中电子产品是其热门品类之一。对于市场研究人员、数据分析师和开发者来说&#xff0c;能够高效地爬取和分析这些数据具有重要的价值。然而&#xff0c;京东网站的复杂性和反爬措施使得爬取…

记录一次使用 Goland 连接 Docker 当中 MySQL 踩过的坑

问题描述 最近在做一个 Golang 的 Web 应用&#xff0c;在最后阶段需要使用 Docker 将整个应用打包&#xff0c;由于我在上一个阶段是在 Windows 环境中安装了本地的 MySQL 来进行开发的&#xff0c;在打包 Docker 的过程中出现了一些问题&#xff0c;遂想到在 Docker 中安装一…

什么是SElinux?

SELinux&#xff08;Security-Enhanced Linux&#xff09;是 Linux 内核中强制实施的强制访问控制&#xff08;MAC&#xff09;安全机制&#xff0c;旨在通过细粒度的权限管理增强系统安全性。它与传统的基于用户/组的权限&#xff08;自主访问控制&#xff0c;DAC&#xff09;…

QT控 件 :

&#xff1a;滚动条 &#xff1a;类似qq里的分组 添加页&#xff1a; &#xff1a;网页 &#xff1a;栈容器 把控件放入容器中&#xff0c;可点击切换不同的页面&#xff0c;但运行后没有该按钮 手动实现该功能点击按钮切换页面 //实现点击按钮跳转到第一页connect(ui->…