当前位置:   article > 正文

数据结构题集(C语言版-严蔚敏)算法题代码P17 2.11_设顺序表va中的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保

设顺序表va中的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保

P17 2.11

设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

解法一:边判断边移动(代码更简单)

  1. void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
  2. if (va.list_len == va.list_size) {
  3. printf("顺序表已经满了!\n");
  4. return ;
  5. }
  6. int i;
  7. for (i = va.list_len ; i > 0 && x < va.a[i - 1]; i--) {
  8. va.a[i] = va.a[i - 1];
  9. }
  10. va.a[i] = x;
  11. va.list_len++;
  12. return ;
  13. }

解法二:先找到需要移动的位置,再移动。(注意x插入头部、尾部的情况)

  1. void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
  2. if (va.list_len == va.list_size) {
  3. printf("顺序表已经满了!\n");
  4. return ;
  5. }
  6. int res = va.list_len;//考虑插入尾部
  7. for (int i = va.list_len - 1; i >= 0; i--) {
  8. if (x >= va.a[i]) {
  9. res = i + 1;
  10. break;
  11. }
  12. if (i == 0) {//考虑插入首部
  13. res = 0;
  14. break;
  15. }
  16. }
  17. for (int i = va.list_len - 1; i >= res; i--) {
  18. va.a[i + 1] = va.a[i];
  19. }
  20. va.a[res] = x;
  21. va.list_len++;
  22. return ;
  23. }

完整代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>//动态数组
  3. #define len 10
  4. #define size 20
  5. typedef struct {
  6. int *a;//顺序表起始地址
  7. int list_len;//实际表长
  8. int list_size;//总长度
  9. } Seqlist;
  10. void Init_list(Seqlist &va) { //初始化顺序表
  11. va.a = (int *)malloc(len * sizeof(int));
  12. if (!va.a) {
  13. printf("内存分配失败!\n");
  14. exit(1);//程序将立即退出,不再继续执行后面的语句
  15. }
  16. va.list_len = len;
  17. va.list_size = size;
  18. printf("请输入长度为10的有序数列:\n");
  19. for (int i = 0; i < va.list_len; i++) {
  20. scanf("%d", &(va.a[i]));
  21. }
  22. return ;
  23. }
  24. //void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
  25. // if (va.list_len == va.list_size) {
  26. // printf("顺序表已经满了!\n");
  27. // return ;
  28. // }
  29. // int res = va.list_len;//考虑插入尾部
  30. // for (int i = va.list_len - 1; i >= 0; i--) {
  31. // if (x >= va.a[i]) {
  32. // res = i + 1;
  33. // break;
  34. // }
  35. // if (i == 0) {//考虑插入首部
  36. // res = 0;
  37. // break;
  38. // }
  39. // }
  40. // for (int i = va.list_len - 1; i >= res; i--) {
  41. // va.a[i + 1] = va.a[i];
  42. // }
  43. // va.a[res] = x;
  44. // va.list_len++;
  45. // return ;
  46. //}
  47. void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
  48. if (va.list_len == va.list_size) {
  49. printf("顺序表已经满了!\n");
  50. return ;
  51. }
  52. int i;
  53. for (i = va.list_len ; i > 0 && x < va.a[i - 1]; i--) {
  54. va.a[i] = va.a[i - 1];
  55. }
  56. va.a[i] = x;
  57. va.list_len++;
  58. return ;
  59. }
  60. int main() {
  61. Seqlist va;
  62. Init_list(va);
  63. int x;
  64. printf("请输入插入元素:\n");
  65. scanf("%d", &x);
  66. Insert_list(x, va);
  67. printf("最终结果:\n");
  68. for (int i = 0; i < va.list_len; i++) {
  69. printf("%d\t", va.a[i]);
  70. }
  71. free(va.a);
  72. return 0;
  73. }

运行截图:

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

闽ICP备14008679号