当前位置:   article > 正文

[C语言][数据结构][动态内存空间的开辟]顺序表的实现!

[C语言][数据结构][动态内存空间的开辟]顺序表的实现!

目录

零.必备知识

a.顺序表的底层是数组.

b.数组在内存中是连续存放的.

c.动态内存空间的开辟(malloc,calloc,realloc).

一.顺序表的定义与实现 

        1.1 顺序表的定义 

        1.2 顺序表的初始化 

        1.3 顺序表的销毁 

        1.4 顺序表容量的检查与调整(最关键的部分)

        1.5 顺序表的尾插

        1.6 顺序表的头插 

        1.7 顺序表的尾删

        1.8 顺序表的头删

         1.9 顺序表中在指定位置之前插入数据

        1.10 删除指定位置的数据 

        1.11 顺序表中查找指定数据

二.顺序表源码 

        SeqList.h

        SeqList.c

 


零.必备知识


a.顺序表的底层是数组.

b.数组在内存中是连续存放的.

c.动态内存空间的开辟(malloc,calloc,realloc).

一.顺序表的定义与实现 

注:具体解释都在注释中(在代码中具体分析!)

        1.1 顺序表的定义 

        1.2 顺序表的初始化 

        1.3 顺序表的销毁 

        1.4 顺序表容量的检查与调整(最关键的部分)

 

        1.5 顺序表的尾插

 

        1.6 顺序表的头插 

 

        1.7 顺序表的尾删

 

        1.8 顺序表的头删

 

         1.9 顺序表中在指定位置之前插入数据

 

        1.10 删除指定位置的数据 

 

        1.11 顺序表中查找指定数据

 

二.顺序表源码 

        SeqList.h

  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <assert.h>
  5. 静态顺序表
  6. //struct SeqList
  7. //{
  8. // int arr[100];
  9. // int size;
  10. //};
  11. // 动态顺序表的定义
  12. typedef int DateType; //数据类型
  13. typedef struct SeqList
  14. {
  15. DateType* arr;
  16. int size; //数组中的有效元素个数
  17. int capacity; //数组的总容量
  18. }SL;
  19. // 顺序表的初始化
  20. void SLInit(SL* psl);
  21. // 顺序表的销毁
  22. void SLDestroy(SL* psl);
  23. // 打印检查
  24. void SLprint(SL sl);
  25. // 容量检查与调整
  26. void CheckCapacity(SL* psl);
  27. // 尾插-头插
  28. void SLPushBack(SL* psl, DateType x);
  29. void SLPushFront(SL* psl, DateType x);
  30. // 尾删-头删
  31. void SLPopBack(SL* psl);
  32. void SLPopFront(SL* psl);
  33. // 在指定位置之前插入数据
  34. void SLInsert(SL* psl, int pos, DateType x); //pos:点
  35. // 删除指定位置的数据
  36. void SLErase(SL* psl, int pos);
  37. // 顺序表的查找
  38. void SLFind(SL psl, DateType x);

        SeqList.c

 

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "SeqList.h"
  3. // 顺序表的初始化
  4. void SLInit(SL* psl)
  5. {
  6. psl->arr = NULL;
  7. psl->size = psl->capacity = 0;
  8. }
  9. // 顺序表的销毁
  10. void SLDestroy(SL* psl)
  11. {
  12. if (psl->arr)
  13. {
  14. free(psl->arr); //释放动态开辟的内存空间
  15. }
  16. psl->arr = NULL;
  17. psl->size = psl->capacity = 0;
  18. }
  19. // 容量检查与调整
  20. void CheckCapacity(SL* psl)
  21. {
  22. if (psl->size == psl->capacity) //空间不够了,需要进行扩容
  23. {
  24. int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2; //避免 psl->capacity初始容量为空
  25. DateType* temp = (DateType*)realloc(psl->arr, newCapacity * sizeof(DateType));
  26. if (temp == NULL) //避免因为realloc调整空间失败,而导致psl->arr中的数据被清除
  27. {
  28. perror("realloc fail!");
  29. exit(1);
  30. }
  31. psl->capacity = newCapacity;
  32. psl->arr = temp;
  33. }
  34. }
  35. // 尾插
  36. void SLPushBack(SL* psl, DateType x)
  37. {
  38. CheckCapacity(psl);
  39. // 插入
  40. psl->arr[psl->size] = x;
  41. psl->size++;
  42. }
  43. // 头插
  44. void SLPushFront(SL* psl, DateType x)
  45. {
  46. CheckCapacity(psl);
  47. for (int i = psl->size; i > 0; i--)
  48. {
  49. psl->arr[i] = psl->arr[i - 1]; //psl->arr[1] = psl->arr[0]
  50. }
  51. psl->arr[0] = x;
  52. (psl->size)++;
  53. }
  54. // 尾删
  55. void SLPopBack(SL* psl)
  56. {
  57. assert(psl);
  58. assert(psl->size); //判断是否为空
  59. (psl->size)--;
  60. }
  61. // 头删
  62. void SLPopFront(SL* psl)
  63. {
  64. assert(psl);
  65. assert(psl->size); //判断是否为空
  66. for (int i = 0; i < psl->size - 1; i++)
  67. {
  68. psl->arr[i] = psl->arr[i + 1]; //psl->arr[psl->size - 1] = psl->arr[psl->size - 2]
  69. }
  70. (psl->size)--;
  71. }
  72. // 在指定位置之前插入数据
  73. void SLInsert(SL* psl, int pos, DateType x)
  74. {
  75. assert(psl);
  76. assert(pos >= 0 && pos <= psl->size);
  77. CheckCapacity(psl);
  78. for (int i = psl->size; i > pos; i--)
  79. {
  80. psl->arr[i] = psl->arr[i - 1]; //arr[pos + 1] = arr[pos]
  81. }
  82. psl->arr[pos] = x;
  83. psl->size++;
  84. }
  85. // 删除指定位置的数据
  86. void SLErase(SL* psl, int pos)
  87. {
  88. assert(psl);
  89. assert(psl->size != 0);
  90. assert(pos >= 0 && pos < psl->size);
  91. for (int i = pos; i < psl->size - 1; i++)
  92. {
  93. psl->arr[i] = psl->arr[i + 1]; //arr[i - 2] = arr[i - 1]
  94. }
  95. psl->size--;
  96. }
  97. // 顺序表的查找
  98. void SLFind(SL* psl, DateType x)
  99. {
  100. assert(psl);
  101. assert(psl->size != 0);
  102. for (int i = 0; i < psl->size; i++)
  103. {
  104. if (psl->arr[i] == x)
  105. {
  106. printf("找到了! 下标是%d\n", i);
  107. return;
  108. }
  109. }
  110. printf("找不到!\n");
  111. }
  112. // 打印
  113. void SLprint(SL sl)
  114. {
  115. for (int i = 0; i < sl.size; i++)
  116. {
  117. printf("%d ", sl.arr[i]);
  118. }
  119. printf("\n");
  120. }

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

闽ICP备14008679号