当前位置:   article > 正文

考研/计算机二级数据结构刷题之顺序表

考研/计算机二级数据结构刷题之顺序表

目录

第一题 顺序表的初始化,销毁,头插,尾插,头删,尾删,指定位置插入,指定删除以及打印

第二题 移除元素

题目链接: OJ链接

题目详解:移除元素 

第三题:删除有序数组中的重复项

题目链接:OJ链接 


第一题 顺序表的初始化,销毁,头插,尾插,头删,尾删,指定位置插入,指定删除以及打印

  1. //SL.h
  2. #pragma once
  3. typedef int SLDataType;
  4. typedef struct SeqList
  5. {
  6. SLDataType* a;
  7. int size;
  8. int capacity;
  9. }SL;
  10. //初始化
  11. void SLInit(SL* psl);
  12. //销毁
  13. void SLDestory(SL* psl);
  14. //打印函数
  15. void SLPrint(SL* psl);
  16. //扩容函数
  17. void SLCheckCapacity(SL* psl);
  18. //尾插
  19. void SLPushBack(SL* psl, SLDataType x);
  20. //头插
  21. void SLPushFront(SL* psl, SLDataType x);
  22. //尾删
  23. void SLPopBack(SL* psl);
  24. //头删
  25. void SLPopFront(SL* psl);
  26. //指定位置出入
  27. void SLInsert(SL* psl, int pos,SLDataType x);
  28. //制定位置删除
  29. void SLErase(SL* psl, int pos);
  30. //查找
  31. int SLFind(SL* psl, SLDataType x);
  32. //SL.c
  33. #define _CRT_SECURE_NO_WARNINGS
  34. #include"SL.h"
  35. #include<stdlib.h>
  36. #include<stdio.h>
  37. #include<math.h>
  38. #include<string.h>
  39. #include<assert.h>
  40. //初始化
  41. void SLInit(SL* psl)
  42. {
  43. psl->a = NULL;
  44. psl->size = 0;
  45. psl->capacity = 0;
  46. }
  47. //销毁
  48. void SLDestory(SL* psl)
  49. {
  50. assert(psl->a);
  51. free(psl->a);
  52. psl->a = NULL;
  53. psl->size = 0;
  54. psl->capacity = 0;
  55. }
  56. //打印函数
  57. void SLPrint(SL* psl)
  58. {
  59. assert(psl);
  60. for(int i=0;i<psl->size;i++)
  61. {
  62. printf("%d ", psl->a[i]);
  63. }
  64. printf("\n");
  65. }
  66. //扩容函数
  67. void SLCheckCapacity(SL* psl)
  68. {
  69. assert(psl);
  70. if(psl->size==psl->capacity) //当最后一个元素的下一个位置等于容量,即满了时要扩容
  71. {
  72. int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2; // 如果容量为0的话先赋初值为4,否则扩2倍
  73. SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * newcapacity); //用指针指向新地址,
  74. //realloc(a,b);第一个参数a是扩容前的原地址,b是扩容大小。扩容的容量大小是Int型用sizeof(SLDataType)求得数据类型所占字节子在成容量,是开辟新空间所占的字节数
  75. if(tmp==NULL)
  76. {
  77. perror("realloc fail");
  78. return 0;
  79. }
  80. psl->a = tmp;//将新空间赋给原地址,如果不引用tmp,如果扩容失败会导致原地址也消失
  81. psl->capacity = newcapacity;
  82. }
  83. }
  84. //尾插
  85. void SLPushBack(SL* psl, SLDataType x)
  86. {
  87. assert(psl); //指针不能为空NULL
  88. SLCheckCapacity(psl);
  89. psl->a[psl->size] = x;//顺序表是在size插入数据
  90. psl->size++;
  91. }
  92. //头插
  93. void SLPushFront(SL* psl, SLDataType x)
  94. {
  95. assert(psl);
  96. SLCheckCapacity(psl);
  97. int end = psl->size - 1;
  98. while(end>=0)
  99. {
  100. psl->a[end + 1] = psl->a[end];
  101. end--;
  102. }
  103. psl->a[0] = x;
  104. psl->size++;
  105. }
  106. //尾删
  107. void SLPopBack(SL* psl)
  108. {
  109. assert(psl);
  110. assert(psl->size > 0);
  111. psl->size--; //size--,直接覆盖前一个,不用free()
  112. }
  113. //头删
  114. void SLPopFront(SL* psl)
  115. {
  116. assert(psl);
  117. assert(psl->size > 0);
  118. int begin = 0;
  119. while (begin < psl->size) // 向前覆盖
  120. {
  121. psl->a[begin] = psl->a[begin + 1];
  122. begin++;
  123. }
  124. psl->size--; //size--
  125. }
  126. //指定位置插入
  127. void SLInsert(SL* psl, int pos, SLDataType x)
  128. {
  129. assert(psl);
  130. assert(pos >=0 && pos <=psl->size );
  131. SLCheckCapacity(psl);
  132. int end = psl->size - 1;
  133. while(end>=pos)
  134. {
  135. psl->a[end + 1] = psl->a[end];
  136. end--;
  137. }
  138. psl->a[pos] = x;
  139. psl->size++;
  140. }
  141. //指定位置删除
  142. void SLErase(SL* psl, int pos)
  143. {
  144. assert(psl);
  145. assert(pos >= 0 && pos <= psl->size);
  146. while(pos<=psl->size-1)
  147. {
  148. psl->a[pos] = psl->a[pos + 1];
  149. pos++;
  150. }
  151. psl->size--;
  152. }
  153. //查找
  154. int SLFind(SL* psl, SLDataType x)
  155. {
  156. assert(psl);
  157. assert(psl->size > 0);
  158. for(int i=0;i<psl->size-1;i++)
  159. {
  160. if(psl->a[i]==x)
  161. {
  162. return i;
  163. }
  164. }
  165. }
  166. //test.c
  167. #define _CRT_SECURE_NO_WARNINGS
  168. #include<stdio.h>
  169. #include"SL.h"
  170. void text1()
  171. {
  172. SL sl; //SL 结构体类型,sl是结构体变量
  173. SLInit(&sl); //初始化
  174. SLPushBack(&sl,1); //将变量sl指向的空间传递给形参,这样形参可以改变实参
  175. SLPushBack(&sl,2);
  176. SLPushBack(&sl,3);
  177. SLPushBack(&sl,4);
  178. SLPushBack(&sl,5);
  179. SLPrint(&sl);
  180. SLPushFront(&sl, 0);
  181. SLPushFront(&sl, -1);
  182. SLPushFront(&sl, -2);
  183. SLPushFront(&sl, -3);
  184. SLPrint(&sl);
  185. SLPopBack(&sl);
  186. SLPopBack(&sl);
  187. SLPopBack(&sl);
  188. SLPopBack(&sl);
  189. SLPopBack(&sl);
  190. SLPopBack(&sl);
  191. SLPrint(&sl);
  192. SLInsert(&sl, 2, 3);
  193. SLPrint(&sl);
  194. SLErase(&sl, 2);
  195. SLPrint(&sl);
  196. int t= SLFind(&sl, -1);
  197. SLErase(&sl, t);
  198. SLPrint(&sl);
  199. SLDestory(&sl);
  200. SLPrint(&sl);
  201. }
  202. int main()
  203. {
  204. text1();
  205. /*printf("%d", sizeof(int));*/
  206. return 0;
  207. }

第二题 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

  1. int removeElement(int* nums, int numsSize, int val){
  2. int left = 0;
  3. int right = 0;
  4. while(right<numsSize)
  5. {
  6. if(nums[right]!=val)
  7. {
  8. nums[left]=nums[right];
  9. left++;
  10. right++;
  11. }else
  12. {
  13. right++;
  14. }
  15. }
  16. return left;
  17. }

题目链接: OJ链接

题目详解:移除元素 

第三题:删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

题目链接:OJ链接 

非严格递增的含义:

后面都大于等于前者,不会小于前者

如 123345,是非严格递增,123342不是非严格递增

思路双指针:

  1. int removeDuplicates(int* nums, int numsSize) {
  2. int slow=0;
  3. int fast=1;
  4. while(fast<numsSize)
  5. {
  6. if(nums[fast]!=nums[slow])
  7. {
  8. slow++;
  9. nums[slow]=nums[fast];
  10. fast++;
  11. }else
  12. {
  13. fast++;
  14. }
  15. }
  16. return slow+1;
  17. }

 

 

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

闽ICP备14008679号