当前位置:   article > 正文

<顺序表>题目练习《数据结构(C语言版)》_数据结构c语言版编程题

数据结构c语言版编程题

目录

题目:

【编程题】

1.顺序表的增删查改

2..合并两个有序数组。OJ链接

3.删除排序数组中的重复项。OJ链接 

解析:

后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                           ——By 作者:新晓·故知


题目:

【编程题】

1.顺序表的增删查改

2..合并两个有序数组。OJ链接

3.删除排序数组中的重复项。OJ链接 

解析:

1.

  1. // SeqList.h
  2. #pragma once
  3. #include <stdio.h>
  4. #include <assert.h>
  5. #include <stdlib.h>
  6. typedef int SLDateType;
  7. typedef struct SeqList
  8. {
  9. SLDateType* a;
  10. size_t size;
  11. size_t capacity; // unsigned int
  12. }SeqList;
  13. // 对数据的管理:增删查改
  14. void SeqListInit(SeqList* ps);
  15. void SeqListDestory(SeqList* ps);
  16. void SeqListPrint(SeqList* ps);
  17. void SeqListPushBack(SeqList* ps, SLDateType x);
  18. void SeqListPushFront(SeqList* ps, SLDateType x);
  19. void SeqListPopFront(SeqList* ps);
  20. void SeqListPopBack(SeqList* ps);
  21. // 顺序表查找
  22. int SeqListFind(SeqList* ps, SLDateType x);
  23. // 顺序表在pos位置插入x
  24. void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
  25. // 顺序表删除pos位置的值
  26. void SeqListErase(SeqList* ps, size_t pos);
  1. // SeqList.c
  2. #include "SeqList.h"
  3. void SeqListInit(SeqList* ps)
  4. {
  5. assert(ps);
  6. ps->a = NULL;
  7. ps->size = 0;
  8. ps->capacity = 0;
  9. }
  10. void SeqListDestory(SeqList* ps)
  11. {
  12. assert(ps);
  13. free(ps->a);
  14. ps->a = NULL;
  15. ps->size = ps->capacity = 0;
  16. }
  17. void SeqListPrint(SeqList* ps)
  18. {
  19. assert(ps);
  20. for (size_t i = 0; i < ps->size; ++i)
  21. {
  22. printf("%d ", ps->a[i]);
  23. }
  24. printf("%\n");
  25. }
  26. void CheckCacpity(SeqList* ps)
  27. {
  28. if (ps->size == ps->capacity)
  29. {
  30. size_t newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
  31. ps->a = (SLDateType*)realloc(ps->a, newcapacity*sizeof(SLDateType));
  32. ps->capacity = newcapacity;
  33. }
  34. }
  35. // 以下几个接口先讲不复用Insert和Erase的实现,最后再讲复用实现
  36. void SeqListPushBack(SeqList* ps, SLDateType x)
  37. {
  38. //assert(ps);
  39. //CheckCacpity(ps);
  40. //ps->a[ps->size] = x;
  41. //ps->size++;
  42. SeqListInsert(ps, ps->size, x);
  43. }
  44. void SeqListPushFront(SeqList* ps, SLDateType x)
  45. {
  46. assert(ps);
  47. /*CheckCacpity(ps);
  48. size_t end = ps->size;
  49. while (end > 0)
  50. {
  51. ps->a[end] = ps->a[end - 1];
  52. --end;
  53. }
  54. ps->a[0] = x;
  55. ++ps->size;*/
  56. SeqListInsert(ps, 0, x);
  57. }
  58. void SeqListPopFront(SeqList* ps)
  59. {
  60. assert(ps);
  61. //size_t start = 0;
  62. //while (start < ps->size-1)
  63. //{
  64. // ps->a[start] = ps->a[start + 1];
  65. // ++start;
  66. //}
  67. //size_t start = 1;
  68. //while (start < ps->size)
  69. //{
  70. // ps->a[start-1] = ps->a[start];
  71. // ++start;
  72. //}
  73. //--ps->size;
  74. SeqListErase(ps, 0);
  75. }
  76. void SeqListPopBack(SeqList* ps)
  77. {
  78. assert(ps);
  79. //ps->a[ps->size - 1] = 0;
  80. //ps->size--;
  81. SeqListErase(ps, ps->size-1);
  82. }
  83. int SeqListFind(SeqList* ps, SLDateType x)
  84. {
  85. for (size_t i = 0; i < ps->size; ++i)
  86. {
  87. if (ps->a[i] == x)
  88. {
  89. return i;
  90. }
  91. }
  92. return -1;
  93. }
  94. // 顺序表在pos位置插入x
  95. void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
  96. {
  97. assert(ps);
  98. assert(pos <= ps->size);
  99. CheckCacpity(ps);
  100. //int end = ps->size - 1;
  101. //while (end >= (int)pos)
  102. //{
  103. // ps->a[end + 1] = ps->a[end];
  104. // --end;
  105. //}
  106. size_t end = ps->size ;
  107. while (end > pos)
  108. {
  109. ps->a[end] = ps->a[end - 1];
  110. --end;
  111. }
  112. ps->a[pos] = x;
  113. ps->size++;
  114. }
  115. // 顺序表删除pos位置的值
  116. void SeqListErase(SeqList* ps, size_t pos)
  117. {
  118. assert(ps && pos < ps->size);
  119. //size_t start = pos;
  120. //while (start < ps->size-1)
  121. //{
  122. // ps->a[start] = ps->a[start + 1];
  123. // ++start;
  124. //}
  125. size_t start = pos+1;
  126. while (start < ps->size)
  127. {
  128. ps->a[start-1] = ps->a[start];
  129. ++start;
  130. }
  131. ps->size--;
  132. }

2.

解1:

  1. /*
  2. 解题思路:从最大值开始合并,所以合并从两个数组的末尾元素开始合并,依次把最大的元素放到末尾即可。
  3. */
  4. void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
  5. //end1:nums1的末尾
  6. //end2:nums2的末尾
  7. //end:合并之后整个数组的末尾
  8. int end1 = m-1;
  9. int end2 = n-1;
  10. int end = m+n-1;
  11. while(end1 >= 0 && end2 >= 0)
  12. { //选出尾最大的元素,存放到整个数组的末尾
  13. //每存放一个元素,尾向前移动一个位置
  14. if(nums1[end1] > nums2[end2])
  15. {
  16. nums1[end--] = nums1[end1--];
  17. }
  18. else
  19. {
  20. nums1[end--] = nums2[end2--];
  21. }
  22. }
  23. //剩余元素依次向末尾存放
  24. while(end1 >= 0)
  25. {
  26. nums1[end--] = nums1[end1--];
  27. }
  28. while(end2 >= 0)
  29. {
  30. nums1[end--] = nums2[end2--];
  31. }
  32. }

解2:

  1. int cmp(int* a, int* b)
  2.  {
  3. return *a - *b;
  4. }
  5. void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
  6.  {
  7. for (int i = 0; i != n; ++i)
  8. {
  9. nums1[m + i] = nums2[i];
  10. }
  11. qsort(nums1, nums1Size, sizeof(int), cmp);
  12. }

3.

解1:

  1. /*
  2. 解题思路:大致思路同上题,用非重复的元素去覆盖重复元素
  3. */
  4. int removeDuplicates(int* nums, int numsSize){
  5. int src1 = 0, src2 = 1;
  6. int dst = 0;
  7. // 跟上题的思路一致,相同的数只保留一个,依次往前放
  8. while(src2 < numsSize)
  9. {
  10. nums[dst] = nums[src1];
  11. ++dst;
  12. //如果两个指针指向的元素不重复,则指针同时向后移动
  13. if(nums[src1] != nums[src2])
  14. {
  15. ++src1;
  16. ++src2;
  17. }
  18. else
  19. {
  20. //如果重复,找到第一个不重复的元素
  21. while(src2 < numsSize && nums[src1] == nums[src2])
  22. {
  23. ++src2;
  24. }
  25. //更新指针
  26. src1 = src2;
  27. ++src2;
  28. }
  29. }
  30. if(src1 < numsSize)
  31. {
  32. nums[dst] = nums[src1];
  33. ++dst;
  34. }
  35. return dst;
  36. }

解2:

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

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                           ——By 作者:新晓·故知

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

闽ICP备14008679号