纯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. 运行截图
如有问题,欢迎指出!
谢谢!