当前位置:   article > 正文

数据结构教程实验一顺序表基本操作的实现_数据结构实验一顺序表实验报告

数据结构实验一顺序表实验报告

实验一  顺序表基本操作的实现

一、实验目的

1.掌握线性表的顺序存贮结构及基本操作,深入了解顺序表的基本特性,以便在实际问题背景下灵活运用它们。

2.深入理解和灵活掌握顺序表的插入、删除等操作。

二、实验环境

1.硬件:每个学生需配备计算机一台。

2.软件:Windows操作系统+Visual C++。

三、实验要求

    1.将建表、遍历、插入、删除分别定义为4个子函数,通过主函数实现对上述子函数的调用。

2.输入数据:数据类型设定为整型

四、实验内容

实现顺序表各种基本运算的基础上,设计主程序,完成如下功能:

(1)初始化顺序表L。

(2)依次插入2,5,7,9,10共5个元素。

(3)输出顺序表L。

(4)输出顺序表L的长度。

(5)判断顺序表L是否为空。

(6)输出顺序表L第4个元素。

(7)输出元素5的位置。

(8)在第4个元素的位置上插入元素100。

(9)输出顺序表L。

(10)删除顺序表L的第3个元素。

(11)输出顺序表L。

(12)释放顺序表L。

实现程序:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define MaxSize 50
  4. typedef int ElemType;
  5. //定义顺序表
  6. typedef struct{
  7. ElemType data[MaxSize]; //存放顺序表元素
  8. int length; //存放顺序表的长度
  9. }SqList; //声明顺序表的类型
  10. //创建顺序表
  11. void CreateList(SqList *&L,ElemType a[],int n)
  12. {
  13. int i=0,k=0;
  14. L=(SqList *)malloc(sizeof(SqList));
  15. while(i<n)
  16. {
  17. L->data[k]=a[i];
  18. k++;
  19. i++;
  20. }
  21. L->length=k;
  22. }
  23. //初始化线性表
  24. void InitList(SqList *&L){
  25. L=(SqList *)malloc(sizeof(SqList));
  26. L->length=0;
  27. }
  28. //销毁线性表
  29. void DestroyList(SqList *&L){
  30. free(L);
  31. }
  32. //判断线性表是否为空表
  33. bool ListEmpty(SqList *L){
  34. return(L->length==0);
  35. }
  36. //求线性表的长度
  37. int ListLength(SqList *L){
  38. return(L->length);
  39. }
  40. //输出顺序表
  41. void DispList(SqList *L)
  42. {
  43. for(int i=0;i<L->length;i++)
  44. {
  45. printf("%d",L->data[i]);
  46. }
  47. }
  48. //求线性表的第i个元素
  49. bool GetElem(SqList *L,int i,ElemType &e)
  50. {
  51. if(i<1 || i>L->length)
  52. return false;
  53. e=L->data[i-1];
  54. return true;
  55. }
  56. //查找第一个值为e的元素值
  57. int LocateElem(SqList *L,ElemType e)
  58. {
  59. int i=0;
  60. while(i<L->length && L->data[i]!=e)
  61. i++;
  62. if(i>=L->length)
  63. return 0;
  64. else
  65. return i+1;
  66. }
  67. //插入第i个元素
  68. bool ListInsert(SqList *&L,int i,ElemType e)
  69. {
  70. int j;
  71. if(i<1 || i>L->length+1 || L->length==MaxSize)
  72. return false;
  73. i--;
  74. for(j=L->length;j>i;j--)
  75. L->data[j]=L->data[j-i];
  76. L->data[i]=e;
  77. L->length++;
  78. return true;
  79. }
  80. //删除第i个元素
  81. bool ListDelete(SqList *&L,int i,ElemType &e)
  82. {
  83. int j;
  84. if(i<1 || i>L->length)
  85. return false;
  86. i--;
  87. e=L->data[i];
  88. for(j=i;j<L->length-1;j++)
  89. L->data[j]=L->data[j+1];
  90. L->length--;
  91. return true;
  92. }
  93. void main()
  94. {
  95. SqList *L;
  96. ElemType e;
  97. printf("顺序表的基本运算如下:\n");
  98. printf("(1)初始化顺序表L\n");InitList(L);
  99. printf("(2)依次插入2,5,7,9,10\n");
  100. int i,y;
  101. char s;
  102. //循环输入,遇到回车停止输入
  103. for(i=1;i<51&&s!='\n';i++){
  104. scanf("%d",&y);
  105. s=getchar();
  106. ListInsert(L,i,y);
  107. }
  108. printf("(3)输出顺序表L");DispList(L);
  109. printf("\n(4)输出顺序表L长度:%d\n",ListLength(L));
  110. printf("(5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));
  111. GetElem(L,3,e);
  112. printf("(6)顺序表L的第3个元素:%d\n",e);
  113. printf("(7)元素5的位置:%d\n",LocateElem(L,5));
  114. printf("(8)在第4个元素位置上插入100");ListInsert(L,4,100);
  115. printf("\n(9)输出顺序列表L:");
  116. DispList(L);
  117. printf("\n(10)删除L的第3个元素\n");
  118. ListDelete(L,3,e);
  119. printf("(11)输出顺序表L:");
  120. DispList(L);
  121. printf("\n(12)释放顺序表L\n");
  122. DestroyList(L);
  123. }

运行结果:

测试结果:

通过!

2.顺序表的应用

(1)设计算法,删除顺序表中所有值等于x的元素。

实现程序:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define MaxSize 50
  4. typedef int ElemType;
  5. //定义顺序表
  6. typedef struct{
  7. ElemType data[MaxSize]; //存放顺序表元素
  8. int length; //存放顺序表的长度
  9. }SqList; //声明顺序表的类型
  10. //创建顺序表
  11. void CreateList(SqList *&L,ElemType a[],int n)
  12. {
  13. int i=0,k=0;
  14. L=(SqList *)malloc(sizeof(SqList));
  15. while(i<n)
  16. {
  17. L->data[k]=a[i];
  18. k++;
  19. i++;
  20. }
  21. L->length=k;
  22. }
  23. //初始化线性表
  24. void InitList(SqList *&L){
  25. L=(SqList *)malloc(sizeof(SqList));
  26. L->length=0;
  27. }
  28. //销毁线性表
  29. void DestroyList(SqList *&L){
  30. free(L);
  31. }
  32. //输出顺序表
  33. void DispList(SqList *L)
  34. {
  35. for(int i=0;i<L->length;i++)
  36. {
  37. printf("%d",L->data[i]);
  38. }
  39. }
  40. //插入第i个元素
  41. bool ListInsert(SqList *&L,int i,ElemType e)
  42. {
  43. int j;
  44. if(i<1 || i>L->length+1 || L->length==MaxSize)
  45. return false;
  46. i--;
  47. for(j=L->length;j>i;j--)
  48. L->data[j]=L->data[j-i];
  49. L->data[i]=e;
  50. L->length++;
  51. return true;
  52. }
  53. //顺序表的删除
  54. bool Delete(SqList *&L,int a)
  55. {
  56. int k=0;
  57. for(int i=0;i<L->length ;i++)
  58. {
  59. if(L->data[i]==a)//当前元素为a时k增1
  60. {
  61. k++;
  62. }
  63. else
  64. {
  65. L->data [i-k]=L->data [i];//当前元素不a时将其前移k个位置
  66. }
  67. }
  68. L->length -= k;//顺序表L的长度减K
  69. return true;
  70. }
  71. void main()
  72. {
  73. SqList *L;
  74. InitList(L);
  75. printf("请输入顺序表用空格分开按回车结束\n");
  76. int i,y;
  77. char s;
  78. for(i=1;i<51&&s!='\n';i++){
  79. scanf("%d",&y);
  80. s=getchar();
  81. ListInsert(L,i,y);
  82. }
  83. printf("输出顺序表L");DispList(L);
  84. printf("\n请输入删除元素:\n");
  85. int a;
  86. scanf("%d",&a);
  87. Delete(L,a);
  88. printf("输出顺序表L\n");
  89. DispList(L);
  90. }

运行结果:

测试结果:

通过!

(2)设计算法,将顺序表L中所有奇数移动到偶数的前面。

实现程序:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define MaxSize 50
  4. typedef int ElemType;
  5. //定义顺序表
  6. typedef struct{
  7. ElemType data[MaxSize]; //存放顺序表元素
  8. int length; //存放顺序表的长度
  9. }SqList; //声明顺序表的类型
  10. //创建顺序表
  11. void CreateList(SqList *&L,ElemType a[],int n)
  12. {
  13. int i=0,k=0;
  14. L=(SqList *)malloc(sizeof(SqList));
  15. while(i<n)
  16. {
  17. L->data[k]=a[i];
  18. k++;
  19. i++;
  20. }
  21. L->length=k;
  22. }
  23. //初始化线性表
  24. void InitList(SqList *&L){
  25. L=(SqList *)malloc(sizeof(SqList));
  26. L->length=0;
  27. }
  28. //销毁线性表
  29. void DestroyList(SqList *&L){
  30. free(L);
  31. }
  32. //插入第i个元素
  33. bool ListInsert(SqList *&L,int i,ElemType e)
  34. {
  35. int j;
  36. if(i<1 || i>L->length+1 || L->length==MaxSize)
  37. return false;
  38. i--;
  39. for(j=L->length;j>i;j--)
  40. L->data[j]=L->data[j-i];
  41. L->data[i]=e;
  42. L->length++;
  43. return true;
  44. }
  45. //输出顺序表
  46. void DispList(SqList *L)
  47. {
  48. int i,b;
  49. int a=0;
  50. int j=L->length-1;
  51. while(a<j){
  52. while((j>=0)&&(L->data[j]%2==0))
  53. j--;
  54. while((a<j)&&(L->data[a]%2==1))
  55. a++;
  56. if(a<j){
  57. b=L->data[j];
  58. L->data[j]=L->data[a];
  59. L->data[a]=b;
  60. }
  61. }
  62. for(i=0;i<L->length;i++){
  63. printf("%d",L->data[i]);
  64. }
  65. }
  66. void main()
  67. {
  68. SqList *L;
  69. InitList(L);
  70. printf("请输入顺序表用空格分开按回车结束\n");
  71. int i,y;
  72. char s;
  73. for(i=1;i<51&&s!='\n';i++){
  74. scanf("%d",&y);
  75. s=getchar();
  76. ListInsert(L,i,y);
  77. }
  78. printf("输出顺序表L");
  79. DispList(L);
  80. printf("\n");
  81. DestroyList(L);
  82. }

运行结果:

测试结果:

通过!

五、思考题

1.删除顺序表中自第i个元素起连续k个元素。

程序实现:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define MaxSize 50
  4. typedef int ElemType;
  5. //定义顺序表
  6. typedef struct{
  7. ElemType data[MaxSize]; //存放顺序表元素
  8. int length; //存放顺序表的长度
  9. }SqList; //声明顺序表的类型
  10. //创建顺序表
  11. void CreateList(SqList *&L,ElemType a[],int n)
  12. {
  13. int i=0,k=0;
  14. L=(SqList *)malloc(sizeof(SqList));
  15. while(i<n)
  16. {
  17. L->data[k]=a[i];
  18. k++;
  19. i++;
  20. }
  21. L->length=k;
  22. }
  23. //初始化线性表
  24. void InitList(SqList *&L){
  25. L=(SqList *)malloc(sizeof(SqList));
  26. L->length=0;
  27. }
  28. //销毁线性表
  29. void DestroyList(SqList *&L){
  30. free(L);
  31. }
  32. //判断线性表是否为空表
  33. bool ListEmpty(SqList *L){
  34. return(L->length==0);
  35. }
  36. //求线性表的长度
  37. int ListLength(SqList *L){
  38. return(L->length);
  39. }
  40. //输出顺序表
  41. void DispList(SqList *L)
  42. {
  43. for(int i=0;i<L->length;i++)
  44. {
  45. printf("%d",L->data[i]);
  46. }
  47. }
  48. //插入第i个元素
  49. bool ListInsert(SqList *&L,int i,ElemType e)
  50. {
  51. int j;
  52. if(i<1 || i>L->length+1 || L->length==MaxSize)
  53. return false;
  54. i--;
  55. for(j=L->length;j>i;j--)
  56. L->data[j]=L->data[j-i];
  57. L->data[i]=e;
  58. L->length++;
  59. return true;
  60. }
  61. //顺序表的删除
  62. bool Delete(SqList *&L,int a)
  63. {
  64. if(L->length==0) //线性表为空
  65. return 0;
  66. if(a<L->length)
  67. {
  68. for(int i=a;i<L->length;i++)
  69. {
  70. L->data[i-1]=L->data[i];
  71. }
  72. L->length--;
  73. }
  74. return 1;
  75. }
  76. void main()
  77. {
  78. SqList *L;
  79. InitList(L);
  80. printf("请输入顺序表用空格分开按回车结束\n");
  81. int i,y;
  82. char s;
  83. for(i=1;i<51&&s!='\n';i++){
  84. scanf("%d",&y);
  85. s=getchar();
  86. ListInsert(L,i,y);
  87. }
  88. printf("输出顺序表L");DispList(L);
  89. printf("\n请输入删除的位置和删除的元素个数:\n");
  90. int a,b;
  91. scanf("%d%d",&a,&b);
  92. if(b>=L->length)
  93. {
  94. printf("输入有误\n");
  95. }
  96. else
  97. {
  98. while(b--)
  99. {
  100. Delete(L,a);
  101. }
  102. }
  103. printf("输出顺序表L\n");
  104. DispList(L);
  105. DestroyList(L);
  106. }

运行结果:

测试结果:

通过!

2.已知顺序表递减有序,将元素x插入,保持其有序性

程序实现:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define MaxSize 50
  4. typedef int ElemType;
  5. //定义顺序表
  6. typedef struct{
  7. ElemType data[MaxSize]; //存放顺序表元素
  8. int length; //存放顺序表的长度
  9. }SqList; //声明顺序表的类型
  10. //创建顺序表
  11. void CreateList(SqList *&L,ElemType a[],int n)
  12. {
  13. int i=0,k=0;
  14. L=(SqList *)malloc(sizeof(SqList));
  15. while(i<n)
  16. {
  17. L->data[k]=a[i];
  18. k++;
  19. i++;
  20. }
  21. L->length=k;
  22. }
  23. //初始化线性表
  24. void InitList(SqList *&L){
  25. L=(SqList *)malloc(sizeof(SqList));
  26. L->length=0;
  27. }
  28. //销毁线性表
  29. void DestroyList(SqList *&L){
  30. free(L);
  31. }
  32. //输出顺序表
  33. void DispList(SqList *L)
  34. {
  35. int n;
  36. int l;
  37. n=L->length;
  38. //冒泡排序法从小到大排序
  39. for(int i=0;i<n-1;i++)
  40. {
  41. for(int j=0;j<n-1-i;j++){
  42. if(L->data[j]<L->data[j+1]){
  43. l=L->data[j];
  44. L->data[j]=L->data[j+1];
  45. L->data[j+1]=l;
  46. }
  47. }
  48. }
  49. for(i=0;i<L->length;i++){
  50. printf("%d",L->data[i]);
  51. }
  52. }
  53. //插入元素
  54. bool ListInserts(SqList *&L,int i,ElemType e)
  55. {
  56. int j;
  57. if(i<1 || i>L->length+1 || L->length==MaxSize)
  58. return false;
  59. i--;
  60. for(j=L->length;j>i;j--)
  61. L->data[j]=L->data[j-i];
  62. L->data[i]=e;
  63. L->length++;
  64. return true;
  65. }
  66. //插入新增元素到最后
  67. bool ListInsert(SqList *&L,ElemType e)
  68. {
  69. int i;
  70. i=L->length+1;
  71. ListInserts(L,i,e);
  72. return true;
  73. }
  74. void main()
  75. {
  76. SqList *L;
  77. InitList(L);
  78. printf("请输入顺序表用空格分开按回车结束\n");
  79. int i,y;
  80. char s;
  81. for(i=1;i<51&&s!='\n';i++){
  82. scanf("%d",&y);
  83. s=getchar();
  84. ListInserts(L,i,y);
  85. }
  86. printf("输出顺序表L");DispList(L);
  87. printf("\n输入要插入的元素");
  88. int f;
  89. scanf("%d",&f);
  90. ListInsert(L,f);
  91. printf("再次输出顺序表");
  92. DispList(L);
  93. printf("\n");
  94. DestroyList(L);
  95. }

运行结果:

测试结果:

通过!

六、实验总结

通过本次增加了对C语言的掌握,对顺序表的建表、初始化、输出等操作有了进一步的认识,同时对C语言主函数和子函数的调用进一步的认识。领会顺序表存储结构和掌握顺序表中各种基本运算算法的设计。对C语言循环结构、冒泡排序法等方法进行了复习。在实验过程中会出现很多问题,出现程序报错的情况。在测试阶段发现出现的错误基本为小错误,如参数错误,调用错误,返回值错误等。一个程序最可怕的是无报错错误,在程序不报错的情况下运行结果和实验结果不同,经过调试后最终和实验结果相同。

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

闽ICP备14008679号