C语言_数据结构总结1:静态分配方式的顺序表
- 其他
- 2025-09-12 04:45:01

纯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.表长加1 L->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.表长减1 L->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.表长加1 L->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.表长减1 L->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. 运行截图如有问题,欢迎指出!
谢谢!
C语言_数据结构总结1:静态分配方式的顺序表由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C语言_数据结构总结1:静态分配方式的顺序表”