当前位置:   article > 正文

C语言-数据结构-可变长顺序表的初始化,插入和输出_第一行,一个整数n(n<100),为顺序表的长度。 第二行,n个整数,为顺序表的n个元素的

第一行,一个整数n(n<100),为顺序表的长度。 第二行,n个整数,为顺序表的n个元素的

问题描述:

实现可变长顺序表的建表过程。任务要求:通过顺序表的初始化、插入算法,实现顺序表的建表,并依次输出顺序表元素。

【输入形式】

第一行输入整数N(1<=N<=100),表示创建长度为N的顺序表;

第二行输入N个整数,表示顺序表的N个元素,依次放入表中;

【输出形式】

依次输出顺序表的全部元素。(以空格分隔)

【样例输入】

5

1 2 3 4 5

【样例输出】

1 2 3 4 5

采用可变长顺序表,顺序表长度可根据数据存储需要,动态增加存储空间。

实现可变长顺序表要定义:常量INIT_SIZE表示顺序表初始化的初始长度;常量INCREM表示当存储空间不够,每次增加的单元数;顺序表可以存放任意数据类型的数据,上述定义中,名称ElemType表示此处代表基本类型int。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define INIT_SIZE 5 //初始分配的存储空间长度
  4. #define INCREM 3 //存储空间再分配的增量
  5. #define OK 1
  6. #define ERROR 0

下面定义结构体类型

  1. typedef int ElemType;
  2. /*顺序表结构*/
  3. typedef struct Sqlist{
  4. ElemType *slist;
  5. int length;
  6. int listsize;
  7. }Sqlist;

顺序表的初始化

注意:顺序表结构定义时,并未分配存储空间,因此需要进行初始化为顺序表分配存储空间。初始化空间大小为listsize,和表长length。

顺序表的初始化就是为顺序表分配连续的一组存储单元。初始化好的顺序表的初始表长为0。

注意:函数malloc由头文件<malloc.h>提供。向系统申请分配存储单元,并不能保证一定申请成功,因此初始化有可能因未申请到空间而导致失败(符号OK表示常量1,ERROR表示常量0)。

  1. int initSq(Sqlist *L)
  2. {
  3. L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
  4. if(!L->slist)return 0; //初始化失败返回0
  5. L->length=0; //置为空表长度为0
  6. L->listsize=INIT_SIZE; //设置初始空间容量
  7. return 1;
  8. }

接下来是插入和输出操作:

顺序表的插入算法:

在顺序表的某个位置插入一个元素,顺序表中元素的前后逻辑关系会发生变化,例如在顺序表第i个位置处插入一个新元素。

 基本步骤:

(1)先移动元素,需要从线性表最后一个元素开始向后移动;

(2)插入新元素;

(3)修改表长加一;(容易忘记)

  1. /*在i位置插入元素:插入成功返回1,不成功返回0*/
  2. int insertSq(Sqlist *L, int i,ElemType e)
  3. {
  4. if(i<0||i>L->length+1)return 0; //插入位置不正确返回0
  5. if(L->length+1>L->listsize) //当前储存空间已满,进行空间增量
  6. {
  7. L->slist=(ElemType*)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType));
  8. if(!L->slist)return 0; //申请存储空间失败
  9. L->listsize+=INCREM;
  10. }
  11. int j;
  12. for(j=L->length;j>i;j--) //插入位置后数据元素依次后移
  13. {
  14. L->slist[j]=L->slist[j-1];
  15. }
  16. L->slist[i]=e; //插入新数据元素
  17. L->length++; //当前表长加一
  18. return 1;
  19. }
  20. /*输出顺序表元素*/
  21. void printSq(Sqlist *L)
  22. {
  23. int i;
  24. for(i=0;i<L->length;i++)
  25. {
  26. printf("%d ",L->slist[i]); //依次输出表中元素
  27. }
  28. printf("\n");
  29. }

最后实现完整代码查看结果

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define INIT_SIZE 5 //初始分配的存储空间长度
  4. #define INCREM 3 //存储空间再分配的增量
  5. #define OK 1
  6. #define ERROR 0
  7. typedef int ElemType;
  8. /*顺序表结构*/
  9. typedef struct Sqlist{
  10. ElemType *slist;
  11. int length;
  12. int listsize;
  13. }Sqlist;
  14. int initSq(Sqlist *L)
  15. {
  16. L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
  17. if(!L->slist)return 0; //初始化失败返回0
  18. L->length=0; //置为空表长度为0
  19. L->listsize=INIT_SIZE; //设置初始空间容量
  20. return 1;
  21. }
  22. /*在i位置插入元素:插入成功返回1,不成功返回0*/
  23. int insertSq(Sqlist *L, int i,ElemType e)
  24. {
  25. if(i<0||i>L->length+1)return 0; //插入位置不正确返回0
  26. if(L->length+1>L->listsize) //当前储存空间已满,进行空间增量
  27. {
  28. L->slist=(ElemType*)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType));
  29. if(!L->slist)return 0; //申请存储空间失败
  30. L->listsize+=INCREM;
  31. }
  32. int j;
  33. for(j=L->length;j>i;j--) //插入位置后数据元素依次后移
  34. {
  35. L->slist[j]=L->slist[j-1];
  36. }
  37. L->slist[i]=e; //插入新数据元素
  38. L->length++; //当前表长加一
  39. return 1;
  40. }
  41. /*输出顺序表元素*/
  42. void printSq(Sqlist *L)
  43. {
  44. int i;
  45. for(i=0;i<L->length;i++)
  46. {
  47. printf("%d ",L->slist[i]); //依次输出表中元素
  48. }
  49. printf("\n");
  50. }
  51. int main()
  52. {
  53. Sqlist sq;
  54. ElemType e;
  55. int n;
  56. if(initSq(&sq)){
  57. scanf("%d",&n);
  58. /*补充代码,实现n个元素顺序表的创建*/
  59. int i;
  60. for(i=0;i<n;i++)
  61. {
  62. scanf("%d",&e);
  63. insertSq(&sq,i,e);
  64. }
  65. printSq(&sq);
  66. }
  67. return 0;
  68. }

运行结果如下:

 

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

闽ICP备14008679号