当前位置:   article > 正文

数据结构:顺序表的基本操作!(C语言)

数据结构:顺序表的基本操作!(C语言)

一、静态存储

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*[1].定义静态顺序表的最大容量*/
  4. #define MaxSize 10
  5. /*[2].自定义数据元素的数据类型*/
  6. typedef int ElemType;

1. 静态分配的定义结构体 

  1. /*[3].静态分配的结构体定义*/
  2. typedef struct {
  3. ElemType data[MaxSize]; // 静态数组存放数据元素
  4. int length; // 表长
  5. }SqList; // 顺序表的类型定义

2.初始化顺序表 

  1. /*[4].静态分配的顺序表的初始化*/
  2. void InitSqList(SqList &L) {
  3. L.length = 0;
  4. }

3.插入操作 

  1. /*[5].插入操作: 在第i位置插入一个元素e */
  2. bool ListInsert(SqList &L, int i, ElemType e) {
  3. //判断插入的位置是否合法
  4. if (i < 1 || i > L.length + 1) { // 插入可以在1~length+1位置插入
  5. return false;
  6. }
  7. //判断存储空间是否已满
  8. if (L.length >= MaxSize) {
  9. return false;
  10. }
  11. for (int j=L.length; j>=i; j--) {
  12. L.data[j] = L.data[j-1];
  13. }
  14. L.data[i-1] = e;
  15. L.length++;
  16. return true;
  17. }

4.删除操作

  1. /*[6].删除操作: 删除第i个位置的元素,并将删除元素返回出去*/
  2. bool ListDelete(SqList &L, int i, ElemType &e) {
  3. // 与插入不同的是删除只能删的位置是 1~length
  4. if (i < 1 || i > L.length) {
  5. return false;
  6. }
  7. e = L.data[i-1]; // 将删除元素的值返回出去
  8. for (int j=i; j<L.length; j++) {
  9. L.data[j-1] = L.data[j];
  10. }
  11. L.length--;
  12. return true;
  13. }

5.查找操作

  1. /*[7].查找操作(按值查找): 查找第一个值等于e的元素,并返回位序*/
  2. int LocateElem(SqList L, ElemType e) {
  3. int i;
  4. for (i=0; i<L.length; i++) {
  5. if (L.data[i] == e) {
  6. return i+1; // 返回的是位序,不是索引号!!
  7. }
  8. }
  9. return 0;
  10. }
  11. /*[8].查找操作(按位查找): 查找第一个值等于e的元素,并返回位序*/
  12. ElemType SeqListFindW(SeqList L, int i) {
  13. return L.data[i-1];
  14. }

6.打印顺序表元素 

  1. bool SqListPrint(SqList L) {
  2. if (L.length == 0) {
  3. printf("the list is null!\n");
  4. return false;
  5. }
  6. printf("静态分配顺序表输出:");
  7. for (int i=0; i<L.length; i++) {
  8. printf("%d-->", L.data[i]);
  9. }
  10. printf("end\n");
  11. return true;
  12. }

7.主函数测试 

  1. int main() {
  2. SqList L;
  3. /*1. 测试初始化*/
  4. InitSqList(L);
  5. /*2.测试插入操作*/
  6. ListInsert(L, 1, 1);
  7. ListInsert(L, 2, 2);
  8. ListInsert(L, 3, 3);
  9. ListInsert(L, 4, 4321);
  10. ListInsert(L, 5, 5);
  11. ListInsert(L, 6, 6);
  12. ListInsert(L, 7, 7);
  13. ListInsert(L, 8, 8);
  14. SqListPrint(L);
  15. /*3.测试查找操作*/
  16. int num = LocateElem(L, 7);
  17. printf("静态分配按值查找后返回的位序是:%d\n", num);
  18. int num1 = SqListFindW(L, 7);
  19. printf("静态分配按位查找后返回的值是:%d\n", num1);
  20. /*4.测试删除操作*/
  21. ElemType e;
  22. ListDelete(L, 2, e);
  23. SqListPrint(L);
  24. printf("SqList删除的元素是:%d\n", e);
  25. }

运行结果:

二、动态分配

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*[1].动态顺序表的初始默认最大容量*/
  4. #define InitSize 10
  5. /*[2].自定义数据元素的数据类型*/
  6. typedef int ElemType;

1.动态分配的结构体定义

  1. /*[3].动态分配的结构体定义*/
  2. typedef struct {
  3. ElemType *data; // 指示动态分配数组的指针
  4. int maxSize; // 数组的最大容量
  5. int length;
  6. }SeqList;

2.动态分配的初始化

  1. /*[4].动态分配的顺序表的初始化*/
  2. void InitList(SeqList &L) {
  3. L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize);
  4. L.length = 0;
  5. L.maxSize = InitSize;
  6. }

3.插入操作

  1. /*[5].插入操作(按位插入): 在第i位置插入一个元素e */
  2. bool InsertSqList(SeqList &L, int i, ElemType e) {
  3. //判断插入的位置是否合法
  4. if (i < 1 || i > L.length + 1) {
  5. return false;
  6. }
  7. //如果存储空间已满,则也不能插入
  8. if (L.length > MaxSize) {
  9. return false;
  10. }
  11. for (int j = L.length; j >= i; j--) {
  12. L.data[j] = L.data[j-1];
  13. }
  14. L.data[i-1] = e;
  15. L.length++;
  16. return true;
  17. }

 4.删除操作

  1. /*[6].删除操作: 删除第i个位置的元素,并将删除元素返回出去*/
  2. bool SqListDelete(SeqList &L, int i, ElemType &e) {
  3. if (i<1 || i>L.length) {
  4. return false;
  5. }
  6. e = L.data[i-1];
  7. for (int j=i; j<L.length; j++) {
  8. L.data[j-1] = L.data[j];
  9. }
  10. L.length--;
  11. return true;
  12. }

5.查找操作

  1. /*[7].查找操作(按值查找): 查找第一个值等于e的元素,并返回位序*/
  2. int LocateElem(SeqList L, ElemType e) {
  3. int i;
  4. for (int i=0; i<L.length; i++) {
  5. if (L.data[i] == e) {
  6. return i+1;
  7. }
  8. }
  9. return 0;
  10. }
  11. /*[8].查找操作(按位查找): 查找第一个值等于e的元素,并返回位序*/
  12. int SqListFindW(SeqList L, int i) {
  13. return L.data[i-1];
  14. }

 

6.扩容操作

  1. bool IncreaseSqList(SeqList &L, int len) {
  2. // 1. 生成指向原来顺序表存储空间的指针,便于后续的释放原来的内存空间
  3. ElemType *p = L.data;
  4. // 2. 为原来的顺序表开辟一块更大的空间
  5. L.data = (ElemType *)malloc(sizeof(ElemType)*(L.maxsize+len));
  6. // 3. 转移数据
  7. for (int i=0; i<L.length; i++) {
  8. L.data[i] = p[i];
  9. }
  10. // 4.修改顺序表的最大长度,其值 + len
  11. L.maxsize += len;
  12. // 5.释放原来的内存空间
  13. free(p);
  14. // 6.成功后返回true
  15. return true;
  16. }

7.打印顺序表

  1. bool SeqListPrint(SeqList L) {
  2. if (L.length == 0) {
  3. printf("该顺序表为空!\n");
  4. return false;
  5. }
  6. printf("动态分配顺序表输出:\n");
  7. for (int i=0; i<L.length; i++) {
  8. printf("%d-->", L.data[i]);
  9. }
  10. printf("end\n");
  11. return true;
  12. }

8.主函数测试 

  1. int main() {
  2. SeqList L;
  3. /*1. 测试初始化*/
  4. InitSqList(L);
  5. /*2.测试插入操作*/
  6. InsertSqList(L, 1, 1);
  7. InsertSqList(L, 2, 2);
  8. InsertSqList(L, 3, 3);
  9. InsertSqList(L, 4, 4111);
  10. /*3.测试查找操作*/
  11. int num = LocateElem(L, 3);
  12. printf("动态分配按值查找后返回的位序是:%d\n", num);
  13. int num1 = SqListFindW(L, 3);
  14. printf("动态分配按位查找后返回的值是:%d\n", num1);
  15. /*4.测试删除操作*/
  16. ElemType q;
  17. SqListDelete(L, 3, q);
  18. printf("SeqList删除的元素是:%d\n", q);
  19. SqListPrint(L);
  20. /*5.测试动态分配顺序表的扩容操作*/
  21. IncreaseSqList(L, 20);
  22. printf("扩容后的L的maxsize为:%d\n",L.maxSize); // 30 -> 扩容成功
  23. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/412669
推荐阅读
相关标签
  

闽ICP备14008679号