C语言_数据结构总结1:静态分配方式的顺序表

server/2025/3/5 9:41:57/

纯C语言代码,不涉及C++

1. 初始化   

#define MaxSize 50
typedef int ElemType;

typedef struct SQList {
    ElemType data[MaxSize];    //定义一个数组存放顺序表元素
    int length;                            //顺序表当前的长度(元素个数)
}SqList;                                   //给顺序表SQList起别名为SqList

2. 插入   

即:在第pos个位置插入value值,即在数组下标pos-1的位置插入value值

int InsertSqList(SqList* L, int pos, ElemType value) {//1.判断插入位置是否合法if (pos < 1 || pos > L->length + 1){printf("选择插入位置不当!");return 0;}//2.判断顺序表存储空间是否满了if (L->length >= MaxSize){printf("顺序表空间已满,无法进行插入操作!");return 0;}//3.将第pos个位置及往后的元素都后移一个位置,空出第pos个位置(这里采用逆序遍历)for (int i = L->length - 1; i >= pos - 1; i--){L->data[i + 1] = L->data[i];}//4.插入数据L->data[pos - 1] = value;//5.表长加1L->length++;return 1;
}

3. 按位查找   

即:即返回第pos个位置(数组下标为pos-1)对应的value值

ElemType findValueByPos(SqList* L, int pos) {//1.判断要查找的位置是否合理if (pos < 1 || pos > L->length){printf("抱歉,该位置不在顺序表范围内!");return 0;}//2.查找第pos个位置对应的value值ElemType value = L->data[pos - 1];return value;
}

4. 按值查找   

即:即返回value值的位序,即第几个,下标加1

int  findPosByValue(SqList* L, ElemType value) {for (int i = 0; i < L->length; i++){if (L->data[i] == value) {return i + 1;}}printf("抱歉,查无此值");return 0;
}

5. 删除   

即:将第pos个的值赋值给value后腾开第pos个位置
然后将第pos个后的数据都往前移一个位置,填补第pos个位置

int deleteSqList(SqList* L, int pos,ElemType* value) {//1.判断要删除的位置是否合理,即是否在存有数据的范围里if (pos < 1 || pos > L->length){printf("选择删除位置不当!");return 0;}//2.判断空间是否为空if (L->length == 0){printf("顺序表空间为空,无法进行删除操作!");return 0;}//3.将被删除的元素赋值给value*value = L->data[pos - 1];//4.将第pos个位置往后的元素都前移一个位置for (int i = pos ; i < L->length; i++){L->data[i - 1] = L->data[i];}//4.表长减1L->length--;return 1;
}

6. 注销   

注意:由于顺序表采用的是静态分配方式,L->data 是一个数组,并非动态分配的内存,所以不能使用 free(L->data) 来释放内存。同时,L 是在栈上分配的,也不能使用 free(L) 释放。

void  destroySqList(SqList* L) {//静态分配无需释放内存if (L != NULL){L->length = 0;}
}

7. 打印顺序表(格式1:每个元素后都有空格打印) 

void printSqList1(SqList* L) {if (L->length == 0){printf("当前顺序表为空!\n");}for (int i = 0; i < L->length; i++){printf("%d ", L->data[i]);}printf("\n--------------------------------------------------\n");
}

8. 打印顺序表(格式2:最后一个元素末尾没有空格打印) 

void printSqList2(SqList* L) {if (L->length == 0){printf("当前顺序表为空!\n");}for (int i = 0; i < L->length; i++){if (i == L->length - 1){printf("%d", L->data[i]);}else{printf("%d ", L->data[i]);}}printf("\n--------------------------------------------------\n");
}

9. 测试代码   

int main() {SqList L;InitSqList(&L);//插入数据测试InsertSqList(&L, 1, 18);InsertSqList(&L, 2, 7);InsertSqList(&L, 3, 34);printSqList1(&L);  //18 7 34//删除数据测试ElemType value;deleteSqList(&L, 2,&value);printSqList1(&L);  //18 34//查找位置1的值是什么ElemType val = findValueByPos(&L, 1);  printf("%d\n",val);  //18//查找值18在顺序表的第几个位置int pos = findPosByValue(&L,18);printf("%d\n", pos);  //1//销毁顺序表destroySqList(&L);return 0;
}

10. 完整代码   

#include<stdio.h>
/*静态分配的顺序表
*/#define MaxSize 50
typedef int ElemType;typedef struct SQList {ElemType data[MaxSize];  //定义一个数组存放顺序表元素int length;              //顺序表当前的长度(元素个数)
}SqList; //给顺序表SQList起别名为SqList//操作1——初始化
void InitSqList(SqList* L) {L->length = 0;  //顺序表初始化长度为0
}//操作2——插入:在第pos个位置插入value值,即在数组下标pos-1的位置插入value值
int InsertSqList(SqList* L, int pos, ElemType value) {//1.判断插入位置是否合法if (pos < 1 || pos > L->length + 1){printf("选择插入位置不当!");return 0;}//2.判断顺序表存储空间是否满了if (L->length >= MaxSize){printf("顺序表空间已满,无法进行插入操作!");return 0;}//3.将第pos个位置及往后的元素都后移一个位置,空出第pos个位置(这里采用逆序遍历)for (int i = L->length - 1; i >= pos - 1; i--){L->data[i + 1] = L->data[i];}//4.插入数据L->data[pos - 1] = value;//5.表长加1L->length++;return 1;
}//操作3——按位查找,即返回第pos个位置对应的value值
ElemType findValueByPos(SqList* L, int pos) {//1.判断要查找的位置是否合理if (pos < 1 || pos > L->length){printf("抱歉,该位置不在顺序表范围内!");return 0;}//2.查找第pos个位置对应的value值ElemType value = L->data[pos - 1];return value;
}//操作4——按值查找,即返回value值的位序,即第几个,下标加1
int  findPosByValue(SqList* L, ElemType value) {for (int i = 0; i < L->length; i++){if (L->data[i] == value) {return i + 1;}}printf("抱歉,查无此值");return 0;
}//操作5——删除:将第pos个的值赋值给value后腾开第pos个位置
// 然后将第pos个后的都数据往前移一个位置,填补第pos个位置
int deleteSqList(SqList* L, int pos,ElemType* value) {//1.判断要删除的位置是否合理,即是否在存有数据的范围里if (pos < 1 || pos > L->length){printf("选择删除位置不当!");return 0;}//2.判断空间是否为空if (L->length == 0){printf("顺序表空间为空,无法进行删除操作!");return 0;}//3.将被删除的元素赋值给value*value = L->data[pos - 1];//4.将第pos个位置往后的元素都前移一个位置for (int i = pos ; i < L->length; i++){L->data[i - 1] = L->data[i];}//4.表长减1L->length--;return 1;
}//操作6——注销
void  destroySqList(SqList* L) {//静态分配无需释放内存if (L != NULL){L->length = 0;}
}//操作7.1——打印顺序表里存放的数据
void printSqList1(SqList* L) {if (L->length == 0){printf("当前顺序表为空!\n");}for (int i = 0; i < L->length; i++){printf("%d ", L->data[i]);}printf("\n--------------------------------------------------\n");
}//操作7.2——打印顺序表里存放的数据,最后一个元素后面无空格
void printSqList2(SqList* L) {if (L->length == 0){printf("当前顺序表为空!\n");}for (int i = 0; i < L->length; i++){if (i == L->length - 1){printf("%d", L->data[i]);}else{printf("%d ", L->data[i]);}}printf("\n--------------------------------------------------\n");
}//测试
int main() {SqList L;InitSqList(&L);//插入数据测试InsertSqList(&L, 1, 18);InsertSqList(&L, 2, 7);InsertSqList(&L, 3, 34);printSqList1(&L);  //18 7 34//删除数据测试ElemType value;deleteSqList(&L, 2,&value);printSqList1(&L);  //18 34//查找位置1的值是什么ElemType val = findValueByPos(&L, 1);  printf("%d\n",val);  //18//查找值18在顺序表的第几个位置int pos = findPosByValue(&L,18);printf("%d\n", pos);  //1//销毁顺序表destroySqList(&L);return 0;
}

11. 运行截图

如有问题,欢迎指出!

谢谢!


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

相关文章

SP导入智能材质球

智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新

希音(Shein)前端开发面试题集锦和参考答案

用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…

java数据结构_Map和Set_面试题_9.4

本文讲解几道使用Map和Set解决的面试题&#xff1a; 目录 1. 只出现一次的数字 2. 复制带有随机指针的链表 3. 宝石与石头 4. 坏键盘打字 5. 前K个高频单词 1. 只出现一次的数字 连接&#xff1a;136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 这道题目…

怎么进行mysql的优化?

MySQL 的优化是一个系统性的工作&#xff0c;涉及多个层面&#xff0c;包括查询优化、索引优化、配置优化、架构优化等。以下是一些常见的 MySQL 优化方法&#xff1a; 查询优化 避免全表扫描&#xff1a;确保查询能够使用索引&#xff0c;避免 SELECT *&#xff0c;只选择需要…

API,URL,Token,XML,JSON是干嘛的

API&#xff0c;URL&#xff0c;Token&#xff0c;XML&#xff0c;JSON是干嘛的 API的作用 API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一组定义和协议&#xff0c;用于构建和交互软件应用程序。API允许不同的软件系统之间…

基于eRDMA实测DeepSeek开源的3FS

DeepSeek昨天开源了3FS分布式文件系统, 通过180个存储节点提供了 6.6TiB/s的存储性能, 全面支持大模型的训练和推理的KVCache转存以及向量数据库等能力, 每个客户端节点支持40GB/s峰值吞吐用于KVCache查找. 发布后, 我们在阿里云ECS上进行了快速的复现, 并进行了性能测试, ECS…

记一次渗透测试实战:SQL注入漏洞的挖掘与利用

0x01 漏洞发现 在对某网站进行安全测试时&#xff0c;发现以下URL存在异常&#xff1a; https://******.com/search.php?keyword1&zt1954&dw1885&zz& 当参数keyword和zt被赋值为-1时页面返回特殊内容&#xff0c;初步判断存在SQL注入漏洞。 0x02 注入验证…

使用 Node.js 和 Follow 模块监控 CouchDB 数据库变更

在现代分布式系统中,实时监控数据库变更并将数据推送到消息队列(如 RabbitMQ)是一个常见需求。本文将介绍如何使用 Node.js、Nano 库和 Follow 模块实现对 CouchDB 数据库的变更监控,处理历史数据并无缝切换到实时监听。 背景 CouchDB 提供了强大的 _changes 端点,支持实…