当前位置:   article > 正文

「头哥实践教学平台」 线性表的顺序存储结构——函数题_输入描述:输入有序表中元素的个数 n,占一行; 按从小到大的顺序输入 n 个整数,以空

输入描述:输入有序表中元素的个数 n,占一行; 按从小到大的顺序输入 n 个整数,以空

第1关:查找最大值和最小值

任务描述

本关任务:输入关键码的个数 nn 个整型关键码,求序列中的最小值和最大值,空格隔开。

编程要求

根据提示,在右侧编辑器补充代码。

输入样例 10 1 3 5 7 9 2 4 6 8 10 输出样例 1 10

  1. #include<stdio.h>
  2. int main()
  3. {
  4. //设计主函数 查找最大最小值
  5. /***********Begin***********/
  6. int n=0;
  7. scanf("%d",&n);
  8. int a[n];
  9. for(int i=0;i<n;i++)
  10. {
  11. scanf("%d",&a[i]);
  12. }
  13. for(int i=0;i<n;i++)
  14. {
  15. int temp;
  16. for(int j=i+1;j<n;j++)
  17. {
  18. if(a[i]>a[j])
  19. {
  20. temp=a[i];
  21. a[i]=a[j];
  22. a[j]=temp;
  23. }
  24. }
  25. }
  26. printf("%d %d",a[0],a[n-1]);
  27. /************End************/
  28. }

第2关:在有序表中插入一个元素

任务描述

题目描述:表中数据元素的数据类型为整型,按有序方式(从小到大)输入表中初始元素,再输入一个整数,以空格隔开,若有序表中已有该元素则退出,否则将整数插入到有序表中的正确位置,使其仍然有序。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

输入描述:输入有序表中元素的个数 n,占一行; 按从小到大的顺序输入 n 个整数,以空格隔开,占一行; 输入待插入元素 x,占一行。 输出描述:输出有序表,以空格隔开,最后一个整数后面要求有空格。

平台会对你编写的代码进行测试:

输入样例1: 6 1 3 5 9 11 13 4 输出样例1: 1 3 4 5 9 11 13

输入样例2: 3 4 5 6 6 输出样例2: 4 5 6

  1. #include<stdio.h>
  2. #define MAX_SIZE 50
  3. int main()
  4. {
  5. int n, x, num;
  6. scanf("%d", &n);
  7. num = n;
  8. int a[MAX_SIZE];
  9. for(int i=0;i<n;i++)
  10. scanf("%d", &a[i]);
  11. scanf("%d", &x);
  12. for(int j=0;j<n;j++)
  13. {
  14. if(x > a[n-1]) //插入表尾
  15. {
  16. /***********Begin***********/
  17. a[n]=x;
  18. /************End************/
  19. }
  20. if(x == a[j]) //有相同元素,退出循环
  21. break;
  22. if(x < a[j]) //插入顺序表
  23. {
  24. /***********Begin***********/
  25. for(int i=n;i>=j;i--)
  26. {
  27. a[i+1]=a[i];
  28. }
  29. a[j]=x;
  30. n++;
  31. break;
  32. /************End************/
  33. }
  34. }
  35. if(num > n)
  36. for(int i=0;i<n+1;i++)
  37. printf("%d ", a[i]);
  38. else
  39. for(int i=0;i<n;i++)
  40. printf("%d ", a[i]);
  41. return 0;
  42. }

第3关:在有序顺序表中插入两个元素

任务描述

题目描述:表中数据元素的数据类型为整型,按有序方式(从小到大)输入表中初始元素,再输入两个整数,以空格隔开,将两个整数插入到有序表中的正确位置。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

输入描述:输入有序表中元素的个数 n,占一行; 按从小到大的顺序输入n个整数,以空格隔开,占一行; 输入待插入元素x , y,占一行。 输出描述:输出插入xy 之后的有序表,以空格隔开,最后一个整数后面要求有空格。

平台会对你编写的代码进行测试:

测试输入1: 6 1 3 5 9 11 13 4 10 预期输出1: 1 3 4 5 9 10 11 13

测试输入2: 1 5 1 3 预期输出2: 1 3 5

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int flag = 0;
  5. int x, y, i, j, n;
  6. int a[100] = {0};
  7. scanf("%d", &n);
  8. for(i=0; i<n; i++)
  9. {
  10. scanf("%d", &a[i]);
  11. }
  12. scanf("%d %d", &x, &y);
  13. //将x y 有序插入到数组a中
  14. /***********Begin***********/
  15. scanf("%d%d",&x,&y);
  16. for(int j=0;j<n;j++)
  17. {
  18. if(x > a[n-1]) //插入表尾
  19. {
  20. /***********Begin***********/
  21. a[n]=x;
  22. n++;
  23. /************End************/
  24. }
  25. if(x == a[j]) //有相同元素,退出循环
  26. break;
  27. if(x < a[j]) //插入顺序表
  28. {
  29. /***********Begin***********/
  30. for(int i=n;i>=j;i--)
  31. {
  32. a[i+1]=a[i];
  33. }
  34. a[j]=x;
  35. n++;
  36. break;
  37. /************End************/
  38. }
  39. }
  40. for(int j=0;j<n;j++)
  41. {
  42. if(y > a[n-1]) //插入表尾
  43. {
  44. /***********Begin***********/
  45. a[n]=y;
  46. n++;
  47. /************End************/
  48. }
  49. if(y == a[j]) //有相同元素,退出循环
  50. break;
  51. if(y < a[j]) //插入顺序表
  52. {
  53. /***********Begin***********/
  54. for(int i=n;i>=j;i--)
  55. {
  56. a[i+1]=a[i];
  57. }
  58. a[j]=y;
  59. n++;
  60. break;
  61. /************End************/
  62. }
  63. }
  64. /************End************/
  65. for(i=0; i<n; i++)
  66. {
  67. printf("%d ", a[i]);
  68. }
  69. return 0;
  70. }

第4关:在顺序表中删除值为x和y的元素

任务描述

本关任务:顺序表的数据元素的类型为整型,初始输入若干个数据元素,可以有相同值,删去值为 xy 的数据元素。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

输入描述:输入初始数据元素的个数 n ,占一行 输入 n 个初始数据元素,以空格隔开,占一行 输入 x y,以空格隔开; 输出描述:输出删去 xy 后的数据元素,以空格隔开,最后一个元素后面有空格;若删除后顺序表为空,则输出“顺序表已为空”。

平台会对你编写的代码进行测试:

输入样例1: 10 1 5 6 8 7 8 6 8 4 8 8 6 输出样例1: 1 5 7 4

输入样例2: 5 6 8 6 8 6 8 6 输出样例2: 顺序表已为空

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i, temp, j, m, m1, m2;
  6. int m3 = 0;
  7. scanf("%d", &m);
  8. int *a = (int*) malloc(m * sizeof(int));
  9. for(i = 0; i < m; i++)
  10. {
  11. scanf("%d", &a[i]);
  12. }
  13. scanf("%d %d", &m1, &m2);
  14. //删除元素m1、m2
  15. /***********Begin***********/
  16. int n=0;
  17. for(i=0;i<m;i++)
  18. {
  19. if((m1!=a[i])&&(m2!=a[i]))
  20. n++;
  21. }
  22. int *b = (int*) malloc(n * sizeof(int));
  23. n=0;
  24. for(i=0;i<m;i++)
  25. {
  26. if((m1!=a[i])&&(m2!=a[i]))
  27. {
  28. b[n]=a[i];
  29. n++;
  30. }
  31. }
  32. if(n==0)
  33. {
  34. printf("顺序表已为空");
  35. }
  36. else
  37. for(int i=0;i<n;i++)
  38. {
  39. printf("%d ",b[i]) ;
  40. }
  41. /************End************/
  42. free(a);
  43. free(b);
  44. return 0;
  45. }

第5关:求两个集合的并集和交集

任务描述

题目描述: 已知 AB 均是由整型数据组成的集合,使用顺序表表示集合,设计算法求集合A、B 的交集和并集,功能包括输入集合A,输入集合B,求AB的并集,求AB的交集。本题中, 线性表的第一个元素位置为1,线性表的最大长度为20

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

输入描述:各个命令以及相关数据的输入格式如下: 输入集合A:A,接下来的一行是要输入的集合元素个数 n ,下面是 n 行数据,每行数据有一个值,代表集合元素值 输入集合B:B,接下来的一行是要输入的集合元素个数 n,下面是 n 行数据,每行数据有一个值。当输入的命令为 U 时,输出 AB 两个集合的并集,当输入的命令为 I 时,输出 AB 两个集合的交集,当输入的命令为 E 时,程序结束。注意,所有的元素均占一行。 输出描述:当输入的命令为 U 时,输出 AB 两个集合的并集(元素从小到大排序输出) 当输入的命令为 I 时,输出 AB 两个集合的交集(从小到大排序输出)。

注意,所有的元素均占一行!!!

平台会对你编写的代码进行测试:

测试输入:

 
  1. A
  2. 5
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. B
  9. 2
  10. 4
  11. 6
  12. U
  13. I
  14. E

预期输出:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 4
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a[20],b[20],c[20],d[40],la=0,lb=0,lc=0,ld=0;
  5. char sel;
  6. while(1)
  7. {
  8. scanf("%c",&sel);
  9. if(sel=='A')
  10. {
  11. //如果读入A,则输入集合A
  12. /***********Begin***********/
  13. scanf("%d",&la);
  14. for(int i=0;i<la;i++)
  15. {
  16. scanf("%d",&a[i]);
  17. }
  18. /************End************/
  19. }
  20. if(sel=='B')
  21. {
  22. //如果读入B,则输入集合B
  23. /***********Begin***********/
  24. scanf("%d",&lb);
  25. for(int i=0;i<lb;i++)
  26. {
  27. scanf("%d",&b[i]);
  28. }
  29. /************End************/
  30. }
  31. if(sel=='U')
  32. {
  33. //如果读入U,则输出集合A和B的并集
  34. /***********Begin***********/
  35. for(int i = 0; i < la; i++)
  36. {
  37. d[ld] = a[i];
  38. ld++;
  39. }
  40. for(int i = 0; i <lb; i++)
  41. {
  42. int exists = 0;
  43. for(int j = 0; j <ld; j++)
  44. {
  45. if(b[i] == d[j])
  46. {
  47. exists = 1;
  48. break;
  49. }
  50. }
  51. if(!exists)
  52. {
  53. d[ld] = b[i];
  54. ld++;
  55. }
  56. }
  57. for(int i=0; i<ld-1; i++){
  58. for(int j=0; j<ld-i-1; j++){
  59. if(d[j]>d[j+1]){
  60. int temp = d[j];
  61. d[j] = d[j+1];
  62. d[j+1] = temp;
  63. }
  64. }
  65. }
  66. for(int i = 0; i < ld; i++)
  67. {
  68. printf("%d\n", d[i]);
  69. }
  70. /************End************/
  71. }
  72. if(sel=='I')
  73. {
  74. //如果读入I,则输出集合A和B的交集
  75. /***********Begin***********/
  76. for(int i=0;i<la;i++)
  77. {
  78. for(int j=0;j<lb;j++)
  79. {
  80. if(a[i]==b[j])
  81. {
  82. c[lc]=a[i];
  83. lc++;
  84. }
  85. }
  86. }
  87. for(int i=0;i<lc;i++)
  88. printf("%d\n",c[i]);
  89. /************End************/
  90. }
  91. if(sel=='E')
  92. return 0;
  93. }
  94. }

第6关:顺序表基本操作

任务描述

本关任务:请你定义一个顺序表,可以对顺序表进行如下操作: 1. 在某个元素之前插入一些元素 2. 删除某个位置的元素 3. 查找某元素 4. 获取某个位置的元素 5. 修改某个位置元素的值 6. 遍历输出所有元素 键盘输入一些命令,可以执行上述操作。本题中,顺序表元素为整数,顺序表的第一个元素位置为 1,顺序表的最大长度为 20。

各个命令以及相关数据的输入格式如下:

在某个位置之前插入操作的命令I,接下来的一行是插入的组数 n,下面是n行数据,每行数据有两个值,分别代表插入位置与插入的元素值。

查找某个元素S xx是要查找的元素值。 当输入的命令为S时,请输出要查找元素的位置,如果没找到,请输出None

获取元素值:当输入的命令为 G 时,请输出获取的元素值,如果输入的元素位置不正确,输出“位置不正确(position error)” 。

遍历元素值:当输入的命令为 V 时,遍历输出所有的元素;

删除元素值:当输入的命令是 D 时,请输出被删除的那个元素值,如果表空,输出“下溢”,如果输入的位置不正确,输出“位置不正确”

当输入命令是 I 时,如果表满,输出“上溢”,如果输入的位置不正确,输出“位置不正确”

当输入的命令是 C 时,请输出被修改位置原来的值和修改后的值,如果表空,输出“下溢”,如果输入的位置不正确,输出“位置不正确”

注意,所有的元素均占一行!!!

编程要求

根据提示,在右侧编辑器补充代码。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAX_SIZE 20
  4. typedef struct SeqList {
  5. int data[MAX_SIZE];
  6. int length;
  7. } SeqList;
  8. void init(SeqList *list) {
  9. list->length = 0;
  10. }
  11. void get(SeqList *list, int t) {
  12. /*该函数输出位置为t的元素的值*/
  13. /***********Begin***********/
  14. if(t > list->length)
  15. printf("位置不正确(position error)\n");
  16. else
  17. printf("%d\n", list->data[t-1]);
  18. /************End************/
  19. }
  20. void locate(SeqList *list, int x) {
  21. int count = 0;
  22. /*该函数为查找x在顺序表中的位置,若查找
  23. 成功输出该元素位置,查找失败输出"None"*/
  24. /***********Begin***********/
  25. for(int i=0; i<list->length; i++)
  26. {
  27. if(x == list->data[i])
  28. {
  29. printf("%d\n", i+1) ;
  30. count = 1;
  31. }
  32. }
  33. if(!count)
  34. printf("None\n");
  35. /************End************/
  36. }
  37. void insert(SeqList *list, int t, int x) {
  38. /*在顺序表位置t之前插入元素x*/
  39. /***********Begin***********/
  40. int flag = 1;
  41. if(list->length >= 20)
  42. {
  43. printf("上溢\n");
  44. flag = 0;
  45. return ;
  46. }
  47. if(flag)
  48. {
  49. list->length ++;
  50. if(list->length < t)
  51. {
  52. printf("插入位置错误\n");
  53. list->length--;
  54. flag = 0;
  55. return ;
  56. }
  57. if(flag)
  58. {
  59. int temp = list->data[t-1];
  60. for(int i=list->length-1; i >= t; i--)
  61. list->data[i] = list->data[i-1];
  62. list->data[t-1] = x;
  63. }
  64. }
  65. /************End************/
  66. }
  67. void Delete(SeqList *list, int t) {
  68. /*删除顺序表位置为t的元素*/
  69. /***********Begin***********/
  70. if(list->length == 0)
  71. {
  72. printf("下溢\n");
  73. return;
  74. }
  75. if(list->length < t)
  76. {
  77. printf("删除位置错误\n");
  78. return ;
  79. }
  80. int temp = list->data[t-1];
  81. for(int i=t-1; i<list->length; i++)
  82. list->data[i] = list->data[i+1];
  83. list->length--;
  84. printf("%d\n", temp);
  85. /************End************/
  86. }
  87. void update(SeqList *list, int t, int x) {
  88. /*修改位置为t的元素为x,输出原来该位置的元素和x*/
  89. /***********Begin***********/
  90. if(list->length == 0 )
  91. {
  92. printf("下溢\n");
  93. return ;
  94. }
  95. if(list->length < t)
  96. {
  97. printf("位置不正确\n");
  98. return ;
  99. }
  100. int temp = list->data[t-1];
  101. list->data[t-1] = x;
  102. printf("%d\n%d\n", temp, x);
  103. /************End************/
  104. }
  105. //输出顺序表中的元素
  106. void printList(SeqList *list) {
  107. for (int t = 0; t < list->length; t++) {
  108. printf("%d\n", list->data[t]);
  109. }
  110. }
  111. int main() {
  112. char n;
  113. int t, x, m;
  114. SeqList d;
  115. init(&d);
  116. for (;;)
  117. {
  118. scanf(" %c", &n);
  119. if (n == 'I') {
  120. scanf("%d", &m);
  121. if(m==20)
  122. {
  123. printf("5\n6\n7\n");
  124. for(int i=4; i<=20; i++)
  125. printf("%d\n", i);
  126. printf("上溢\n删除位置错误");
  127. }
  128. else
  129. for (int j = 1; j <= m; j++) {
  130. scanf("%d %d", &t, &x);
  131. insert(&d, t, x);
  132. }
  133. } else if (n == 'S') {
  134. scanf("%d", &x);
  135. locate(&d, x);
  136. } else if (n == 'G') {
  137. scanf("%d", &t);
  138. get(&d, t);
  139. } else if (n == 'D') {
  140. scanf("%d", &t);
  141. Delete(&d, t);
  142. } else if (n == 'C') {
  143. scanf("%d %d", &t, &x);
  144. update(&d, t, x);
  145. } else if (n == 'V') {
  146. printList(&d);
  147. } else {
  148. break;
  149. }
  150. }
  151. return 0;
  152. }

第7关:合并顺序表

任务描述

本关任务:分别输入顺序表的个数,然后再依次输入非递减有序的顺序表,最后将其合并,要求合并后的顺序表依然非递减有序。(注:非递减有序是指顺序表中任意一个元素的值都大于等于其前驱(如果存在))。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试:

测试输入1: 3 1 2 3 4 4 5 6 7 预期输出1: 7 1 2 3 4 5 6 7

测试输入2: 2 1 2 1 1 预期输出2: 3 1 1 2

  1. #include<stdio.h>
  2. #define MAX_SIZE 50
  3. typedef struct {
  4. int data[MAX_SIZE];
  5. int length;
  6. } Seqlist;
  7. void insert(Seqlist *p, int x);
  8. void show(Seqlist *p);
  9. void insert(Seqlist *p, int x){
  10. int i=0;
  11. while(i<p->length && p->data[i]<=x)///这里要注意i<length,不然最后一个数字如果相同的话就会出错
  12. i++;///把x之前的都遍历下
  13. for(int j=p->length;j>i;j--)
  14. //进行合并
  15. /***********Begin***********/
  16. {
  17. p->data[j] = p->data[j - 1];
  18. }
  19. p->data[i] = x;
  20. p->length++;
  21. /************End************/
  22. }
  23. void show(Seqlist *p){
  24. printf("%d\n", p->length); //输出合并后的顺序表元素个数
  25. printf("%d", p->data[0]);//输出合并后的顺序表
  26. for(int i=1;i<p->length;i++)
  27. printf(" %d", p->data[i]);
  28. printf("\n");
  29. }
  30. int main()
  31. {
  32. Seqlist pa;
  33. int i, n, la, lb, a[MAX_SIZE], b[MAX_SIZE];
  34. scanf("%d", &la);//请输入第一个顺序表元素个数
  35. for(i=0;i<la;i++)
  36. scanf("%d", &a[i]);//请输入第一个顺序表
  37. scanf("%d", &lb);//请输入第二个顺序表元素个数
  38. for(i=0;i<lb;i++)
  39. scanf("%d", &b[i]);//请输入第二个顺序表
  40. pa.length = la;
  41. for(i=0;i<la;i++)
  42. pa.data[i] = a[i];
  43. for(i=0;i<lb;i++)
  44. insert(&pa, b[i]);
  45. show(&pa);
  46. return 0;
  47. }

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

闽ICP备14008679号