当前位置:   article > 正文

数据结构与算法-头歌【1】顺序线性表--课上练_顺序线性表数据结构定义如下:typedef int datatype;struct seqlist{

顺序线性表数据结构定义如下:typedef int datatype;struct seqlist{ int maxn

 本意是整理和复习,理解不深或者有错误的评论区提出即可。

只有第一关的代码里面有结构体的定义,其余我只放了功能函数。

初始代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*此处是顺序线性表数据结构定义*/
  4. typedef int DataType;
  5. struct seqList
  6. {//有3个数据成员
  7. int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM
  8. int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum
  9. DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
  10. };
  11. typedef struct seqList *PseqList;
  12. //第一关
  13. PseqList createNullList_seq(int m)
  14. {//此处填写代码,创建一个空的顺序线性表,能存放的最大元素个数为 m
  15. //若m=0,则返回NULL
  16. }
  17. //第二关
  18. int isFullList_seq(PseqList L)
  19. {
  20. //判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
  21. }
  22. int insertP_seq(PseqList L , int p ,int x)
  23. {// 在线性表L中下标为p的位置插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  24. //如果线性表满了, 还需输"list is full"的提示
  25. //如果插入位置非法,需输出提示"position is illegel"
  26. }
  27. int insertPre_seq(PseqList L , int p ,int x)
  28. {
  29. // 在线性表L中下标为p的位置的前面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  30. //提示:直接调用insertP函数实现即可
  31. }
  32. int insertPost_seq(PseqList L , int p ,int x)
  33. {
  34. // 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  35. //提示:直接调用insertP函数实现即可
  36. }
  37. void printList_seq(PseqList L)
  38. {//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
  39. }
  40. //第三关
  41. int destroyList_seq(PseqList L)
  42. {
  43. //返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
  44. }
  45. //第四关
  46. int locate_seq(PseqList L,int x)
  47. {//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
  48. }
  49. DataType locatePos_seq(PseqList L,int pos)
  50. {// 在顺序表L中查找指定位置pos处的数据元素,若位置非法,则返回第0个数据元素
  51. }
  52. //第五关
  53. int deletePos_seq(PseqList L,int pos)
  54. {//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
  55. }
  56. int delete_seq(PseqList L,int x)
  57. {//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
  58. //可以使用之前已完成的操作
  59. }
  60. //第六关
  61. void replace_seq(PseqList L,int x,int y)
  62. {//将顺序表L中值为x的数据元素替换为y
  63. }
  64. void delDuplicate_seq(PseqList L)
  65. {//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
  66. //使用常规删除即可,已修改测试用例
  67. }

1.创建空顺序线性表

题目

任务描述

本关要求按照完成顺序表数据类型定义,并初始化一个顺序线性表。

编程要求

顺序线性表数据结构定义如下:

  1. typedef int DataType;
  2. struct seqList {
  3. int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM
  4. int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum
  5. DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
  6. };

本关的编程任务是补全文件中createNullList_seq函数,以实现初始化一个空的顺序线性表的要求。

开始你的任务吧,祝你成功!

测试

输入:4

输出:success to create a seqlist of 4 elements,current item 0

输入:0

输出:fail to create

输入:6

输出:success to create a seqlist of 6 elements,current item 0

已通过代码

功能函数

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*此处是顺序线性表数据结构定义*/
  4. typedef int DataType;
  5. struct seqList
  6. { //有3个数据成员
  7. int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM
  8. int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum
  9. DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
  10. };
  11. typedef struct seqList *PseqList;
  12. //第一关
  13. PseqList createNullList_seq(int m)
  14. {//此处填写代码,创建一个空的顺序线性表,能存放的最大元素个数为 m
  15. //若m=0,则返回NULL
  16. if(m == 0){
  17. return NULL;
  18. }
  19. else{
  20. PseqList palist = (PseqList)malloc(sizeof(struct seqList));
  21. if(palist != NULL){//判断创建是否成功
  22. palist->element = (DataType *)malloc(sizeof(DataType)*m);//创建m个元素的空间
  23. if(palist->element){//判断创建是否成功
  24. palist->MAXNUM = m;
  25. palist->curNum = 0;
  26. return palist;
  27. }
  28. else
  29. free(palist); //如果创建元素空间失败则要释放线性表空间
  30. //指针的空间释放之后,指针的值没有改变
  31. }
  32. }
  33. }

 main函数

  1. int main(void)
  2. {
  3. int m;
  4. scanf("%d",&m);
  5. PseqList head = createNullList_seq(m);
  6. if(head == NULL)
  7. printf("fail to create");
  8. else
  9. printf("success to create a seqlist of %d elements,current item %d",m,head->curNum);
  10. }

2.顺序表插入

题目

任务描述

本关任务: 你需要实现不同的插入操作: 在顺序线性表中下标为p位置、p位置之前、p位置之后插入数据元素

编程要求

为了实现线性表插入操作,你需要实现判断线性表是否为满的判断函数,另外你需要根据提示,在右侧编辑器补充代码,完成操作insertP_seq,insertPre_seq,insertPost_seq三个插入函数,以及遍历输出线性表数据元素的操作printList_seq。具体说明见操作注释。


开始你的任务吧,祝你成功!

测试

输入:5 1 2 3 4

输出:position is illegel4 1 4 3 2

输入:2 1 4

输出:position is illegel1 4

输入:6 1 2 3 4 5 6

输出:position is illegellist is fulllist is full5 1 5 4 2 3

已通过代码块

功能函数

  1. //第二关
  2. int isFullList_seq(PseqList L)
  3. {
  4. //判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
  5. return (L->curNum >= L->MAXNUM);
  6. }
  7. int insertP_seq(PseqList L , int p ,int x)
  8. {// 在线性表L中下标为p的位置插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  9. //如果线性表满了, 还需输"list is full"的提示
  10. //如果插入位置非法,需输出提示"position is illegel"
  11. int q;//记录p的位置
  12. if(isFullList_seq(L)){//线性表已满
  13. printf("list is full");
  14. return 0;
  15. }
  16. else if(p < 0 || p > L->curNum){
  17. //输入非法
  18. printf("position is illegel");
  19. return 0;
  20. }
  21. else{
  22. for(q = L->curNum - 1; q >= p; q--){//q以及q位置以后的元素后移一位
  23. L->element[q+1] = L->element[q];
  24. }
  25. L->element[p] = x;
  26. L->curNum ++;
  27. return 1;
  28. }
  29. }
  30. int insertPre_seq(PseqList L , int p ,int x)
  31. {
  32. // 在线性表L中下标为p的位置的前面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  33. //提示:直接调用insertP函数实现即可
  34. return insertP_seq(L , p-1 , x);
  35. }
  36. int insertPost_seq(PseqList L , int p ,int x)
  37. {
  38. // 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  39. //提示:直接调用insertP函数实现即可
  40. return insertP_seq(L , p+1 , x);
  41. }
  42. void printList_seq(PseqList L)
  43. {//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
  44. for(int i=0; i < L->curNum; i++){
  45. printf("%d ", L->element[i]);
  46. }
  47. }

main函数 

  1. int main(void)
  2. {
  3. int m ,x;
  4. scanf("%d",&m);
  5. PseqList head = createNullList_seq(m);
  6. for(int i=0;i<m/2;i++)
  7. {
  8. scanf("%d",&x);
  9. insertP_seq(head,i,x);
  10. }
  11. for(int i=0;i<m/2;i++)
  12. {
  13. scanf("%d",&x);
  14. insertPre_seq(head,i,x);
  15. insertPost_seq(head,i,x);
  16. }
  17. printList_seq(head);
  18. }

3.销毁线性表

题目

任务描述

本关任务:销毁线性表的实质时实现动态分配的线性表空间回收。

相关知识

使用malloc函数分配的内存空间应该在程序退出时使用free将空间回收还给操作系统。 由于顺序线性表创建时使用了malloc为线性表结构、线性表数据元素动态分配了存储空间,我们应使用free将相应空间回收。

编程要求

根据提示,在右侧编辑器补充代码,实现销毁线性表的功能。


开始你的任务吧,祝你成功!

测试

输入:4 1 3 5 7

输出:4

输入:0

输出:0

输入:5 1 2 3 4 5

输出:5

已通过代码块

功能函数

  1. //第三关
  2. int destroyList_seq(PseqList L)
  3. {
  4. //返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
  5. if(L == NULL)
  6. return 0;
  7. else{
  8. free(L->element);
  9. return L->curNum;
  10. }
  11. }

主函数

  1. int main(void)
  2. {
  3. int m ,x;
  4. scanf("%d",&m);
  5. PseqList head = createNullList_seq(m);
  6. for(int i=0;i<m;i++)
  7. {
  8. scanf("%d",&x);
  9. insertP_seq(head,i,x);
  10. }
  11. printf("%d", destroyList_seq(head));
  12. }

4.查找

题目

任务描述

本关任务: 1.在顺序线性表中查找第一个值为x的元素下标。 2.在顺序线性表中查找某个位置pos处的数据元素


开始你的任务吧,祝你成功!

测试

输入:8 12 3 23 -12 89 6 67 123 6

输出:

67

5

输入:4 123 4 45 23 10

输出:

123

-1

已通过代码块

功能函数

  1. //第四关
  2. int locate_seq(PseqList L,int x)
  3. {//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
  4. for(int i = 0; i < L->curNum; i++){
  5. if(x == L->element[i])
  6. return i;
  7. }
  8. return -1;
  9. }
  10. DataType locatePos_seq(PseqList L,int pos)
  11. {// 在顺序表L中查找指定位置pos处的数据元素,若位置非法,则返回第0个数据元素
  12. //位置非法
  13. if(pos < 0 || pos > L->curNum)
  14. return L->element[0];
  15. else
  16. return L->element[pos];
  17. }

主函数

  1. int main(void)
  2. {
  3. int m ,x;
  4. scanf("%d",&m);
  5. PseqList head = createNullList_seq(m);
  6. for(int i=0;i<m;i++)
  7. {
  8. scanf("%d",&x);
  9. insertP_seq(head,i,x);
  10. }
  11. scanf("%d",&m);
  12. printf("%d\n",locatePos_seq(head,m));
  13. printf("%d\n",locate_seq(head,m));
  14. destroyList_seq(head);
  15. }

5.删除

题目

任务描述

本关任务: (1)在顺序表L中删除下标pos处的数据元素 (2)在顺序表L中删除与参数x值相同的数据元素

编程要求

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


开始你的任务吧,祝你成功!

测试

输入:6 12 34 56 3 4 12 3 12

输出:

1

2

34 56 4

已通过代码块

功能函数

  1. //第五关
  2. int deletePos_seq(PseqList L,int pos)
  3. {//在顺序表L中删除下标pos处的数据元素,若pos非法,则返回-1;否则返回1
  4. //pos非法
  5. if(pos < 0 || pos > L->curNum - 1)
  6. return -1;
  7. else{
  8. for(int i = pos; i < L->curNum - 1 ; i++)
  9. L->element[i] = L->element[i+1];//pos位置后面的元素均前移一位
  10. L->curNum--;
  11. return 1;
  12. }
  13. }
  14. int delete_seq(PseqList L,int x)
  15. {//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
  16. //可以使用之前已完成的操作
  17. int n = 0;//记录删除的元素个数
  18. int p;
  19. for(p = 0; p < L->curNum; p++){
  20. if(L->element[p] == x){
  21. deletePos_seq(L, p);
  22. n++;
  23. }
  24. }
  25. return n;
  26. }

主函数

  1. int main(void)
  2. {
  3. int m ,x;
  4. scanf("%d",&m);
  5. PseqList head = createNullList_seq(m);
  6. for(int i=0;i<m;i++)
  7. {
  8. scanf("%d",&x);
  9. insertP_seq(head,i,x);
  10. }
  11. scanf("%d",&m);
  12. printf("%d\n",deletePos_seq(head,m));
  13. scanf("%d",&m);
  14. printf("%d\n",delete_seq(head,m));
  15. printList_seq(head);
  16. destroyList_seq(head);
  17. }

6.顺序表应用

题目

任务描述

本关任务: (1)使用将顺序表L中值为x的数据元素替换为y; (2)此处假设线性表中的元素用于表示集合,不考虑线性表中元素的位置,移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。

编程要求

根据提示,在右侧编辑器补充代码,完成第六关的两个函数。


开始你的任务吧,祝你成功!

测试

输入:5 1 5 -1 5 9 5 1

输出:-1 9

输入:6 12 4 3 3 3 3 3 12

输出:4

已通过代码块

功能函数

  1. //第六关
  2. void replace_seq(PseqList L,int x,int y)
  3. {//将顺序表L中值为x的数据元素替换为y
  4. for(int i = 0; i < L->curNum; i++)
  5. if(L->element[i] == x)
  6. L->element[i] = y;
  7. }
  8. void delDuplicate_seq(PseqList L)
  9. {//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
  10. //使用常规删除即可,已修改测试用例
  11. int t, flag = 0;
  12. //t:记录最开始用来比较的下标
  13. //flag:记录有没有与他重复的元素
  14. for(int i = 0; i < L->curNum; i++){
  15. t = i;
  16. for(int j = i + 1; j < L->curNum; j++){
  17. if(L->element[i] == L->element[j])
  18. deletePos_seq(L, j); //删除重复元素
  19. flag = 1;
  20. }
  21. if(flag)
  22. deletePos_seq(L, t); //如果有重复的元素就把原来用来比较的元素也删掉
  23. flag = 0; //flag清零
  24. }
  25. }

主函数

  1. int main(void)
  2. {
  3. int m ,x;
  4. scanf("%d",&m);
  5. PseqList head = createNullList_seq(m);
  6. for(int i=0;i<m;i++)
  7. {
  8. scanf("%d",&x);
  9. insertP_seq(head,i,x);
  10. }
  11. scanf("%d%d",&m,&x);
  12. replace_seq(head,m,x);
  13. delDuplicate_seq(head);
  14. printList_seq(head);
  15. destroyList_seq(head);
  16. }

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

闽ICP备14008679号