深圳幻海软件技术有限公司 欢迎您!

数据结构与算法-头歌【1】顺序线性表--课上练

2023-04-02

 本意是整理和复习,理解不深或者有错误的评论区提出即可。只有第一关的代码里面有结构体的定义,其余我只放了功能函数。1.创建空顺序线性表题目任务描述本关要求按照完成顺序表数据类型定义,并初始化一个顺序线性表。编程要求顺序线性表数据结构定义如下:typedefintDataType;struc

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

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

1.创建空顺序线性表

题目

任务描述

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

编程要求

顺序线性表数据结构定义如下: typedef int DataType; struct seqList { int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
};

本关的编程任务是补全文件中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. }

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览42751 人正在系统学习中