【数据结构】C语言实现顺序表的相关操作
顺序表
定义
顺序表:在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表
线性表:具有相同特性的数据元素的一个有限序列。
表示
#define MAXSIZE 100 typedef int ElemType; typedef struct SeqList { ElemType data[MAXSIZE]; int length; }SeqList;
ElemType data[MAXSIZE]:data数组,用于存放数据
length:记录数组中存放数据的个数
也可以这样表示
#define MAXSIZE 100 typedef int ElemType; typedef struct SeqList { ElemType* data; int length; }SeqList;
两种表示方式差别不大,以下代码都是基于第一种表示方式
初始化
初始化函数
参数:顺序表的地址
void init(SeqList* L) { int i = 0; for (i = 0; i < MAXSIZE; i++) { L->data[i] = 0; } L->length = 0; }
也可以在主函数中直接初始化
SeqList L = { {0},0 };
插入
数据是按存储空间的顺序存入到内存中,插入的位置是在已有数据的内存之间或者之后的第一个内存空间
假设有1到10的空间,那么第一个插入的位置只能是1,第二个插入的位置可以是1到2,第三个插入的位置可以是1到3,第四个1到4,第五个…
插入函数
把从第 location 个位置开始的数据依次后移
参数:顺序表的地址,插入的位置,插入的数据
返回值:1表示插入成功,0表示插入失败
int insert(SeqList* L, int location, ElemType x) { if (L->length == MAXSIZE) { //printf("表满,无法插入新元素\n"); return 0; } if (location < 1 || location > MAXSIZE) { //printf("插入的位置不合适\n"); return 0; } int i = L->length; for (i = L->length; i >= location; i--) { L->data[i] = L->data[i - 1]; } L->data[location - 1] = x; L->length++; return 1; }
当 location = L->length + 1时,插入的位置是表尾后的第一个空间时(在上图中,就是位置7),for循环不会执行
int i = L->length; for (i = L->length; i >= location; i--) { L->data[i] = L->data[i - 1]; } L->data[location - 1] = x; L->length++;
也可以这么写,都是一样的
if (location == L->length + 1) //插入表尾之后的第一个空间,直接插入,无需移动数据 { L->data[location - 1] = x; } else //插入其他位置,需要移动数据 { int i = L->length; for (i = L->length; i >= location; i--) { L->data[i] = L->data[i - 1]; } L->data[location - 1] = x; }
删除
删除函数
删除 location 位置上的数据,然后把从第 location + 1 位置开始的数据依次前移
参数:顺序表的地址,删除的位置
返回值:1表示插入成功,0表示插入失败
int del(SeqList* L, int location) { if (L->length == 0) { //printf("表空,无法删除元素\n"); return 0; } if (location < 1 || location > MAXSIZE) { //printf("删除的位置不合适\n"); return 0; } int i = 0; for (i = location - 1; i <= L->length - 2; i++) { L->data[i] = L->data[i + 1]; } L->length--; return 1; }
按值查找
查找函数
在顺序表上查找第一个和 x 值相等的元素,若查找成功,返回它在顺序表中的位置 ,否则,返回0。这里的位置不是下标。
参数:顺序表的地址,查找的值
返回值:返回值为 x 在顺序表中第一次出现的位置,返回0则表示找不到
int search(SeqList* L, ElemType x) { int i = 0; for (i = 0; i < L->length; i++) { if (L->data[i] == x) { return (i + 1); } } return 0; }
清空
清空函数
将顺序表清空
参数:顺序表的地址
void clear(SeqList* L) { L->length = 0; }
顺序表中的所有数据还是原来的数据,把顺序表中 length 的值设为0,就可以对原来的数据进行修改
顺序结构的缺点
- 插入和删除操作需要移动大量的数据
- 在实际的系统中缺少大块可利用的空间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程