当前位置:   article > 正文

P3156 【深基15.例1】询问学号

P3156 【深基15.例1】询问学号

        昨天我发布了关于数据结构线性表的学习知识(【数据结构】顺序表-CSDN博客)。所谓“纸上得来终觉浅”,光看不练可不行,下面我们来看一下顺序表的习题。

 题目链接

【深基15.例1】询问学号 - 洛谷

题目解读

        题目描述了一个场景,有 n 名同学陆续进入教室,我们知道他们的学号,学号在 1 到 10^9 之间。按同学进入教室的顺序给出学号。

我们需要完成以下几个主要任务:

  1. 定义一个结构体 SeqList 来表示存储学号的顺序表,其中包含学号数组 number 、最大容量 capacity 和有效数字个数 size 。
  2. 编写 init 函数来初始化顺序表。
  3. 编写 checkcapacity 函数来检查顺序表的容量,如果容量不足则进行扩容。
  4. 编写 insert 函数向顺序表中插入(尾插)学号。

听起来不难,那么下面开始写代码。

代码详解

    1.定义SeqList结构体

        结构体的定义和初始化都不难,咱们不过多解释,有问题可以在评论区讨论。

  1. typedef struct SeqList
  2. {
  3. int* number;//学号
  4. int capacity;//最大容量
  5. int size;//有效数字个数
  6. }SL;

   2.初始化函数

  1. void init(SL* p)
  2. {
  3. p->number=NULL;
  4. p->capacity=0;
  5. p->size=0;
  6. }

    3.检测容量足够与否并扩容

        整体来说不难理解,看一下注释应该不成问题。唯一的难点可能是有些同学不懂realloc的用法,博主将它的用法放在了疑难解答,大家可以自行学习。

  1. /**
  2. * 检查并调整顺序表的容量
  3. * p 指向顺序表结构体的指针
  4. */
  5. void checkcapacity(SL* p)
  6. {
  7. // 如果指针为空,输出错误信息并退出程序
  8. if(p == NULL)
  9. {
  10. cout << "未检查到指针所指向数据" << endl;
  11. exit(1);
  12. }
  13. // 如果当前容量等于元素个数
  14. if(p->capacity == p->size)
  15. {
  16. // 计算新的容量,如果当前容量为 0,则新容量为 4,否则新容量为当前容量的 2 倍
  17. int newcapacity = p->capacity == 0? p->capacity = 4 : 2 * p->capacity;
  18. // 重新分配内存空间
  19. int* ps = (int*)realloc(p->number, newcapacity * sizeof(int));
  20. // 如果重新分配内存失败
  21. if(ps == NULL)
  22. {
  23. perror("realloc fail");
  24. exit(1);
  25. }
  26. // 更新顺序表的指针和容量
  27. p->number = ps;
  28. p->capacity = newcapacity;
  29. }
  30. }

    4.尾插函数

参数含义:

  • p:是指向顺序表结构体的指针,用来操作顺序表的相关数据。
  • x:要添加到顺序表末尾的数据。
  1. /**
  2. * 向顺序表中插入一个元素
  3. * p 指向顺序表结构体的指针
  4. * x 要插入的元素值
  5. */
  6. void insert(SL* p, int x)
  7. {
  8. // 如果指针为空,输出错误信息并退出程序
  9. if(p == NULL)
  10. {
  11. cout << "初始化失败" << endl;
  12. exit(1);
  13. }
  14. // 检查并调整顺序表的容量
  15. checkcapacity(p);
  16. // 将元素插入到顺序表中,并增加元素个数
  17. p->number[p->size++] = x;
  18. }

 完整代码

  1. #include<bits/stdc++.h>
  2. #include<assert.h>
  3. using namespace std;
  4. typedef struct SeqList
  5. {
  6. int* number;//学号
  7. int capacity;//最大容量
  8. int size;//有效数字个数
  9. }SL;
  10. void init(SL* p)
  11. {
  12. p->number=NULL;
  13. p->capacity=0;
  14. p->size=0;
  15. }
  16. void checkcapacity(SL* p)
  17. {
  18. if(p==NULL)
  19. {
  20. cout<<"未检查到指针所指向数据"<<endl;
  21. exit(1);
  22. }
  23. if(p->capacity==p->size)
  24. {
  25. int newcapacity=p->capacity==0?p->capacity=4:2*p->capacity;
  26. int* ps=(int*)realloc(p->number,newcapacity*sizeof(int));
  27. if(ps==NULL)
  28. {
  29. perror("realloc fail");
  30. exit(1);
  31. }
  32. p->number=ps;
  33. p->capacity=newcapacity;
  34. }
  35. }
  36. void insert(SL* p,int x)
  37. {
  38. if(p==NULL)
  39. {
  40. cout<<"初始化失败"<<endl;
  41. exit(1);
  42. }
  43. checkcapacity(p);
  44. p->number[p->size++]=x;
  45. }
  46. main()
  47. {
  48. SL s;
  49. init(&s);
  50. int n;
  51. int m;
  52. cin>>n>>m;
  53. for(int i=0;i<n;i++)
  54. {
  55. int x;
  56. cin>>x;
  57. insert(&s,x);
  58. }
  59. for(int i=0;i<m;i++)
  60. {
  61. int x;
  62. cin>>x;
  63. cout<<s.number[x-1]<<endl;
  64. }
  65. }

    AC 

 

 疑难解答

     realloc的用法

realloc 函数用于重新分配内存块的大小。

函数原型:void *realloc(void *ptr, size_t size);

参数含义:

  • ptr:指向之前通过 malloc、calloc 或 realloc 分配的内存块的指针。
  • size:新的所需内存大小。

用法及作用:

  • 如果 ptr 为 NULL,则 realloc 的功能类似于 malloc,分配指定大小的内存。
  • 如果 size 为 0 且 ptr 不为 NULL,则相当于释放 ptr 指向的内存,类似于 free 函数。
  • 否则,realloc 尝试改变之前分配的内存块的大小。如果有足够的连续空间可扩展现有内存块,会在原地进行扩展并返回原指针。如果没有足够的连续空间,会分配新的内存块,将原有数据复制到新位置,并释放旧的内存块,然后返回新的指针。

例如:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int *ptr = (int *)malloc(sizeof(int) * 5); // 分配 5 个整数的内存
  6. // 填充一些数据
  7. for (int i = 0; i < 5; i++)
  8. {
  9. ptr[i] = i;
  10. }
  11. int *newPtr = (int *)realloc(ptr, sizeof(int) * 10); // 重新分配为 10 个整数的内存
  12. if (newPtr!= NULL)
  13. {
  14. ptr = newPtr; // 更新指针
  15. // 继续使用扩展后的内存
  16. for (int i = 5; i < 10; i++)
  17. {
  18. ptr[i] = i;
  19. }
  20. // 输出数据
  21. for (int i = 0; i < 10; i++)
  22. {
  23. printf("%d ", ptr[i]);
  24. }
  25. printf("\n");
  26. free(ptr); // 释放内存
  27. }
  28. else
  29. {
  30. printf("Reallocation failed!\n");//创建失败提示信息
  31. }
  32. return 0;
  33. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/989767
推荐阅读
相关标签
  

闽ICP备14008679号