目次
0——静态分配内存的序次表和动态分配内存的序次表的雷同之处和差异之处
雷同之处
差异之处
代码实现
1. 初始化
2. 插入
3. 按位查找
4. 按值查找
5. 删除
6. 注销
7. 打印序次表
8. 测试代码
9. 完备代码
10. 运行截图
0——静态分配内存的序次表和动态分配内存的序次表的雷同之处和差异之处
雷同之处
- 根本操纵逻辑雷同:无论是静态分配还是动态分配的序次表,其核心的操纵逻辑是划一的。比方插入操纵都须要将插入位置之后的元素依次后移,删除操纵都须要将删除位置之后的元素依次前移,查找操纵也都是通过遍历大概直接定位来完成。
- 数据元素存储方式雷同:两种序次表都是将数据元素依次存储在连续的内存空间中,都可以通过数组下标来直接访问元素,时间复杂度为 \(O(1)\)。
- 功能用途雷同:都用于实现线性表的功能,支持数据的插入、删除、查找等根本操纵。
差异之处
- 内存分配方式:
- 静态分配:在编译时就确定了序次表的最大容量,利用数组来存储元素,数组的巨细在步调运行过程中不能改变。
- 动态分配:在步调运行时根据须要动态地分配内存空间,可以通过 malloc、realloc 等函数来调解序次表的容量。
- 内存管理:
- 静态分配:不须要手动管理内存,数组的内存空间由体系自动分配和开释。
- 动态分配:须要手动管理内存,利用 malloc 分配内存,利用 free 开释内存,否则会造成内存走漏。
- 表长限定:
- 静态分配:序次表的最大长度是固定的,一旦到达最大长度就无法再插入新的元素。
- 动态分配:可以根据须要动态地调解序次表的容量,理论上只要体系有富足的内存,就可以不绝地插入新的元素。
纯C语言代码,不涉及C++
代码实现
1. 初始化
#define MaxSize 50
typedef int ElemType;
typedef struct SQList {
ElemType data[MaxSize]; //界说一个数组存放序次表元素
int length; //序次表当前的长度(元素个数)
}SqList; //给序次表SQList起别名为SqList
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) {
- return -1; // 插入位置不合法
- }
- //2.判断顺序表存储空间是否满了
- if (L->length >= MaxSize) {
- return -2; // 顺序表空间已满
- }
- //3.将第pos个位置及往后的元素都后移一个位置,空出第pos个位置(这里采用逆序遍历)
- for (int i = L->length; i >= pos; i--) {
- L->data[i] = L->data[i - 1];
- }
- //4.插入数据
- L->data[pos - 1] = value;
- //5.表长加1
- L->length++;
- return 0; // 插入成功
- }
复制代码
3. 按位查找
即:即返回第pos个位置(数组下标为pos-1)对应的value值
- int findValueByPos(SqList* L, int pos, ElemType* value) {
- //1.判断要查找的位置是否合理
- if (pos < 1 || pos > L->length) {
- return -1; // 查找位置不合法
- }
- //2.查找第pos个位置对应的value值
- *value = L->data[pos - 1];
- return 0; // 查找成功
- }
复制代码
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;
- }
- }
- return -1; // 未找到该值
- }
复制代码
5. 删除
即:将第pos个的值赋值给value后腾开第pos个位置
然后将第pos个后的数据都往前移一个位置,弥补第pos个位置
- int deleteSqList(SqList* L, int pos, ElemType* value) {
- //1.判断要删除的位置是否合理,即是否在存有数据的范围里
- if (pos < 1 || pos > L->length) {
- return -1; // 删除位置不合法
- }
- //2.判断空间是否为空
- if (L->length == 0) {
- return -2; // 顺序表空间为空
- }
- //3.将被删除的元素赋值给value
- *value = L->data[pos - 1];
- //4.将第pos个位置往后的元素都前移一个位置
- for (int i = pos; i < L->length; i++) {
- L->data[i - 1] = L->data[i];
- }
复制代码
6. 注销
注意:由于序次表接纳的是静态分配方式,L->data 是一个数组,并非动态分配的内存,以是不能利用 free(L->data) 来开释内存。同时,L 是在栈上分配的,也不能利用 free(L) 开释。
- void destroySqList(SqList* L) {
- //静态分配无需释放内存
- if (L != NULL)
- {
- L->length = 0;
- }
- }
复制代码
7. 打印序次表
- void printSqList(SqList* L) { //让打印的最后一个元素末尾没有空格
- if (L->length == 0) {
- printf("当前顺序表为空!\n");
- }
- else {
- 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");
- }
- printf("--------------------------------------------------\n");
- }
复制代码
8. 测试代码
- 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;
- }
复制代码
9. 完备代码
- #include <stdio.h>#include <stdlib.h>/* 静态分配的序次表*/#define MaxSize 50typedef 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) {
- return -1; // 插入位置不合法
- }
- //2.判断顺序表存储空间是否满了
- if (L->length >= MaxSize) {
- return -2; // 顺序表空间已满
- }
- //3.将第pos个位置及往后的元素都后移一个位置,空出第pos个位置(这里采用逆序遍历)
- for (int i = L->length; i >= pos; i--) {
- L->data[i] = L->data[i - 1];
- }
- //4.插入数据
- L->data[pos - 1] = value;
- //5.表长加1
- L->length++;
- return 0; // 插入成功
- }//操纵3——按位查找,即返回第pos个位置对应的value值int findValueByPos(SqList* L, int pos, ElemType* value) {
- //1.判断要查找的位置是否合理
- if (pos < 1 || pos > L->length) {
- return -1; // 查找位置不合法
- }
- //2.查找第pos个位置对应的value值
- *value = L->data[pos - 1];
- return 0; // 查找成功
- }//操纵4——按值查找,即返回value值的位序,即第几个,下标加1int findPosByValue(SqList* L, ElemType value) {
- for (int i = 0; i < L->length; i++) {
- if (L->data[i] == value) {
- return i + 1;
- }
- }
- return -1; // 未找到该值
- }//操纵5——删除:将第pos个的值赋值给value后腾开第pos个位置// 然后将第pos个后的都数据往前移一个位置,弥补第pos个位置int deleteSqList(SqList* L, int pos, ElemType* value) {
- //1.判断要删除的位置是否合理,即是否在存有数据的范围里
- if (pos < 1 || pos > L->length) {
- return -1; // 删除位置不合法
- }
- //2.判断空间是否为空
- if (L->length == 0) {
- return -2; // 顺序表空间为空
- }
- //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 0; // 删除乐成}//操纵6——注销void destroySqList(SqList* L) { //静态分配无需开释内存 if (L != NULL) { L->length = 0; }}//操纵7——打印序次表里存放的数据void printSqList(SqList* L) { if (L->length == 0) { printf("当前序次表为空!\n"); } else { 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"); } printf("--------------------------------------------------\n");}//测试int main() { SqList L; InitSqList(&L); //插入数据测试 if (InsertSqList(&L, 1, 18) != 0) { printf("插入失败!\n"); } if (InsertSqList(&L, 2, 7) != 0) { printf("插入失败!\n"); } if (InsertSqList(&L, 3, 34) != 0) { printf("插入失败!\n"); } printSqList(&L); //18 7 34 //删除数据测试 ElemType value; if (deleteSqList(&L, 2, &value) != 0) { printf("删除失败!\n"); } printSqList(&L); //18 34 //查找位置1的值是什么 ElemType val; if (findValueByPos(&L, 1, &val) == 0) { printf("%d\n", val); //18 } else { printf("查找失败!\n"); } //查找值18在序次表的第几个位置 int pos = findPosByValue(&L, 18); if (pos != -1) { printf("%d\n", pos); //1 } else { printf("未找到该值!\n"); } //烧毁序次表 destroySqList(&L); return 0;}
复制代码
10. 运行截图
文章如有堕落不敷处,欢迎品评区指出,如果以为文章不错,就给我点个赞吧,谢谢!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |