当前位置:   article > 正文

【C++】顺序表(千字好文哦)_c++顺序表

c++顺序表

1.顺序表

1.顺序表

定义:一系列物理连续地址的存储单元,用来存储一系列的数据元素,一般是用数组的形式存储,(但和数组还是有一些区别),用来实现对数据的增删查改

比如数组的成员访问是任意的,我可以创建十个元素长度的数组,在下标为0放一个元素,下标为4放一个元素,其他空着也不初始化

但是顺序表强调的就是连续

还记得我们之前写过的动态版本的通讯录

https://blog.csdn.net/weixin_71138261/article/details/127030054?spm=1001.2014.3001.5501

其实我们当初的设想就是,如果只用一个固定大小的数组不够完美,这个数据的大小最好能根据我要放多少个数据来确定,这样不会浪费空间

  1. struct contact
  2. {
  3. struct People_Information* date;
  4. int sz;
  5. int capacity;
  6. };

其实在那个程序里这个部分,我们就用到一个结构体来动态存放数据

这就是一个顺序表的思想

把这个程序里面的顺序表部分拿出来我们再巩固一下

//头文件.h

被注释的地方就是静态的顺序表,用到的不多,所以着重看动态的部分

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #pragrama once //防止头文件被多次包含
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <assert.h>
  6. //static squential list
  7. //#define LEN 10
  8. typedef int Datatype;
  9. //typedef struct SquList
  10. //{
  11. // int arr[LEN];
  12. // int size;
  13. //}SL;
  14. //dynamic
  15. typedef struct SquList
  16. {
  17. Datatype*squ;
  18. int size;
  19. int capacity;
  20. }SL;
  21. void SquInit(SL*ps); //初始化
  22. void SquPushBack(SL* ps, Datatype x); //尾插
  23. void Destory(SL* ps); //销毁
  24. void PopBack(SL* ps);//尾删
  25. void SquPrint(SL* ps);//打印

//函数实现部分.c

函数实现部分,一些增删查改的函数

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "sldlist.h"
  3. void SquInit(SL* ps)
  4. {
  5. assert(ps);
  6. ps->squ=NULL;
  7. ps->capacity = 0;
  8. ps->size = 0;
  9. }
  10. void SquPushBack(SL* ps, Datatype x)
  11. {
  12. assert(ps);
  13. if (ps->size == ps->capacity)
  14. {
  15. int newcapacity = ps->size == 0 ? 4 : ps->capacity * 2;
  16. Datatype*tmp= (Datatype*)realloc(ps->squ, newcapacity * sizeof(Datatype));
  17. if (tmp == NULL)
  18. {
  19. perror("realloc");
  20. exit(-1);
  21. }
  22. ps->squ = tmp;
  23. ps->capacity = newcapacity;
  24. }
  25. ps->squ[ps->size] = x;
  26. ps->size++;
  27. }
  28. void Destory(SL* ps)
  29. {
  30. assert(ps);
  31. if (ps ->squ)
  32. {
  33. free(ps->squ);
  34. ps ->squ= NULL;
  35. }
  36. }
  37. void PopBack(SL* ps)
  38. {
  39. assert(ps->size > 0);
  40. ps->size--;
  41. }
  42. void SquPrint(SL* ps)
  43. {
  44. assert(ps);
  45. for(int i = 0; i < ps->size; i++)
  46. {
  47. printf("%d ", ps->squ[i]);
  48. }
  49. printf("\n");
  50. }

//函数主体.c

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "sldlist.h"
  3. #include <stdio.h>
  4. int main()
  5. {
  6. SL sl;
  7. SquInit(&sl);
  8. SquPushBack(&sl, 1);
  9. SquPushBack(&sl, 2);
  10. SquPushBack(&sl, 3);
  11. SquPushBack(&sl, 4);
  12. SquPushBack(&sl, 5);
  13. SquPrint(&sl);
  14. SquPushBack(&sl, 7);
  15. SquPushBack(&sl, 9);
  16. SquPushBack(&sl, 10);
  17. SquPrint(&sl);
  18. PopBack(&sl);
  19. SquPrint(&sl);
  20. Destory(&sl);
  21. return 0;
  22. }

当然,如果这个顺序表只能尾插尾删,那他也太不合格了

所以我们现在增加一些他的功能,包括头插,头删,尾插,尾删,万能插,万能删(指定位置)

新的程序如下

squential.h

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. typedef int type;
  7. typedef struct Squential
  8. {
  9. type* a;
  10. type size;
  11. type capacity;
  12. }SL;
  13. void Init(SL* ps);
  14. void PushFront(SL* ps,type x);
  15. void Print(SL* ps);
  16. void Destory(SL* ps);
  17. void Plus(SL* ps);
  18. void PopFront(SL* ps);
  19. void PushBack(SL* ps,type x);
  20. void PopBack(SL* ps);
  21. void Push(SL* ps, type pos,type x );
  22. void Delete(SL* ps, type pos);

squential.c

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "squential.h"
  3. //初始化
  4. void Init(SL* ps)
  5. {
  6. ps->a = NULL;
  7. ps->capacity = 0;
  8. ps->size = 0;
  9. }
  10. //判断一下是不是要扩容
  11. void Plus(SL* ps)
  12. {
  13. assert(ps);
  14. if (ps->capacity == ps->size)
  15. {
  16. type new = ps->capacity == 0 ? 4 : ps->capacity * 2;
  17. type* tmp = (type*)realloc(ps->a,new * sizeof(type));
  18. if (tmp == NULL)
  19. {
  20. perror("realloc");
  21. exit(0);
  22. }
  23. ps->a = tmp;
  24. ps->capacity = new;
  25. }
  26. }
  27. //头插
  28. void PushFront(SL* ps,type x)
  29. {
  30. assert(ps);
  31. Plus(ps);
  32. if (ps->size == 0)
  33. {
  34. ps->a[0] = x;
  35. }
  36. else
  37. {
  38. type end = ps->size-1;
  39. while (end >= 0)
  40. {
  41. ps->a[end+1] = ps->a[end ];
  42. end--;
  43. }
  44. ps->a[0] = x;
  45. }
  46. ps->size++;
  47. }
  48. //打印
  49. void Print(SL* ps)
  50. {
  51. assert(ps);
  52. for (int i = 0; i < ps->size; i++)
  53. {
  54. printf("%d", ps->a[i]);
  55. }
  56. printf("\n");
  57. }
  58. //销毁
  59. void Destory(SL* ps)
  60. {
  61. assert(ps);
  62. if (ps->a != NULL)
  63. {
  64. free(ps->a);
  65. ps->a= NULL;
  66. ps->capacity = 0;
  67. ps->size = 0;
  68. }
  69. }
  70. //头删
  71. void PopFront(SL* ps)
  72. {
  73. assert(ps);
  74. if (ps->size == 0)
  75. {
  76. printf("表空\n");
  77. exit(0);
  78. }
  79. else
  80. {
  81. type begin = 1;
  82. while (begin < ps->size)
  83. {
  84. ps->a[begin-1] = ps->a[begin ];
  85. begin++;
  86. }
  87. }
  88. ps->size--;
  89. }
  90. //尾插
  91. void PushBack(SL* ps,type x)
  92. {
  93. assert(ps);
  94. Plus(ps);
  95. if (ps->size == 0)
  96. {
  97. ps->a[0] = x;
  98. }
  99. else
  100. {
  101. ps->a[ps->size] = x;
  102. }
  103. ps->size++;
  104. }
  105. //尾删
  106. void PopBack(SL* ps)
  107. {
  108. assert(ps);
  109. if (ps->size == 0)
  110. {
  111. printf("表空\n");
  112. exit(0);
  113. }
  114. else
  115. {
  116. ps->size--;
  117. }
  118. }
  119. //万能插
  120. void Push(SL* ps,type pos,type x)
  121. {
  122. assert(ps);
  123. Plus(ps);
  124. assert(pos >= 0);
  125. assert(pos <= ps->size);
  126. Plus(ps);
  127. type end= ps->size -1;
  128. while (end >= pos)
  129. {
  130. ps->a[end + 1] = ps->a[end];
  131. end--;
  132. }
  133. ps->a[pos] = x;
  134. ps->size++;
  135. }
  136. //万能删除
  137. void Delete(SL* ps,type pos)
  138. {
  139. assert(ps);
  140. Plus(ps);
  141. assert(pos >= 0);
  142. assert(pos <ps->size);
  143. type begin = pos;
  144. while (begin < ps->size-1)
  145. {
  146. ps->a[begin] = ps->a[begin + 1];
  147. begin++;
  148. }
  149. ps->size--;
  150. }

Test.c

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "squential.h"
  3. void Test1(void)
  4. {
  5. SL sl;
  6. Init(&sl);
  7. PushFront(&sl, 1);
  8. PushFront(&sl, 2);
  9. PushFront(&sl,3);
  10. Print(&sl);
  11. Destory(&sl);
  12. }
  13. void Test2(void)
  14. {
  15. /*SL sl;
  16. Init(&sl); //打印表空
  17. */
  18. SL sl;
  19. Init(&sl);
  20. PushFront(&sl, 1);
  21. PushFront(&sl, 2);
  22. PushFront(&sl, 3);
  23. Print(&sl); //321
  24. PopFront(&sl);
  25. Print(&sl);//21
  26. PushFront(&sl, 1);
  27. PushFront(&sl, 2);
  28. PushFront(&sl, 3);
  29. Print(&sl);//32121
  30. PopFront(&sl);
  31. Print(&sl);//2121
  32. Destory(&sl);
  33. }
  34. void Test3(void)
  35. {
  36. SL sl;
  37. Init(&sl);
  38. PushBack(&sl, 0);
  39. Print(&sl);
  40. PushFront(&sl, 1);
  41. PushFront(&sl, 2);
  42. PushFront(&sl, 3);
  43. Print(&sl);
  44. PushBack(&sl,4);
  45. Destory(&sl);
  46. }
  47. void Test4(void)
  48. {
  49. SL sl;
  50. Init(&sl);
  51. PushFront(&sl, 1);
  52. PushFront(&sl, 2);
  53. PushFront(&sl, 3);
  54. PopBack(&sl);
  55. Print(&sl);
  56. Destory(&sl);
  57. }
  58. void Test5(void)
  59. {
  60. SL sl;
  61. Init(&sl);
  62. Push(&sl,0, 1);
  63. Push(&sl, 1,2);
  64. Push(&sl, 2, 3);
  65. Push(&sl, 3, 4);
  66. Print(&sl);
  67. Destory(&sl);
  68. }
  69. void Test6(void)
  70. {
  71. SL sl;
  72. Init(&sl);
  73. Push(&sl, 0, 1);
  74. Push(&sl, 1, 2);
  75. Push(&sl, 2, 3);
  76. Push(&sl, 3, 4);
  77. Delete(&sl, 2);
  78. Print(&sl);
  79. Destory(&sl);
  80. }
  81. int main()
  82. {
  83. //Test1();
  84. //Test2();
  85. //Test3();
  86. //Test4();
  87. //Test5();
  88. Test6();
  89. return 0;
  90. }

当然我们还可以在里面丰富很多功能,比如删除重复的数字

  1. //删除所有的x
  2. //找到第一次出现x的位置
  3. type Find(SL* ps,type x,type pos)
  4. {
  5. assert(ps);
  6. for (type i = pos; i < ps->size; i++)
  7. {
  8. if (ps->a[i] == x)
  9. {
  10. return i;
  11. }
  12. }
  13. return - 1;
  14. }
  15. void del(SL* ps, type x)
  16. {
  17. assert(ps);
  18. type i = Find(ps, x,0);
  19. while (i != -1)
  20. {
  21. Delete(ps, i);
  22. i=Find(ps, x,i+1);
  23. }
  24. }

感谢收看~

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

闽ICP备14008679号