当前位置:   article > 正文

线性表的实现(C语言版)——详细代码_c语言实现线性表

c语言实现线性表

文章目录


前言

      今天对数据结构中的线性表进行了重新的梳理和复盘,有了许多收获,并花了一些时间在Devc++上进行了顺序表的基本操作的实现。本文就介绍一下自己动手过程中的一些心得和这些代码的内容。(本人小白一个,如有不当之处,请各位大佬不吝指教,万分感谢!)


一、线性表是什么?

线性表是具有相同数据类型的n个数据元素的有限序列,分为顺序表和链表。(本文阐述的是顺序表的实现)。

二、实现步骤

1.引入头文件并定义一个宏常量

代码如下(示例):

  1. #include <stdio.h>
  2. #include <stdlib.h>//malloc()、free()和exit()函数在这个头文件之中
  3. #define Max 10

2.定义顺序表的结构

代码如下(示例):

  1. typedef struct{
  2.     int *data;//存放存储空间首地址的指针变量
  3.     int length;//线性表当前的元素个数
  4.     int Max_size;//线性表最大能存储的元素个数
  5. }Sqlist;//把该数据类型命名为Sqlist 

该处使用定义结构体的方法 

3.顺序表各种操作的实现(增删改查等)

代码如下(示例):

  1. //线性表的初始化 
  2. void InitList(Sqlist &L){
  3.     L.data=(int*)malloc(sizeof(int)*Max);
  4.     L.length=0;
  5.     L.Max_size=Max;
  6.     if(L.data!=0)
  7.         printf("初始化成功!\n");
  8.     else     
  9.         printf("初始化失败!\n");
  10. }
  11. //逐一插入线性表元素 
  12. void Insert(Sqlist &L){
  13.     printf("请逐个输入你要插入的元素:\n");
  14.     for(int i=0;i<Max;i++){
  15.         scanf("%d",&L.data[i]);
  16.         L.length++;
  17.     }
  18. //按位置插入元素
  19. bool InsertElem(Sqlist &L){
  20.     int i,e;
  21.     printf("请输入插入位置和数据:\n");
  22.     scanf("%d%d",&i,&e);
  23.     if(i<1 || i>L.length+1)
  24.         return false;
  25.     if(L.length==L.Max_size)
  26.         return false;
  27.     for(int j=L.length;j>=i;j--){
  28.         L.data[j]=L.data[j-1];
  29.     }
  30.     L.data[i-1]=e;
  31.     L.length++;
  32.     return true;
  33. //按元素所在位置删除元素
  34. bool DeleElem(Sqlist &L){
  35.     int i;
  36.     printf("请输入你要删除的元素所在位置:\n");
  37.     scanf("%d",&i);
  38.     if(L.length==0){
  39.         printf("当前线性表为空\n");
  40.         return false;
  41.     }
  42.     if(i>L.length){
  43.         printf("超出当前元素个数!\n");
  44.         return false;
  45.     }
  46.     for(int j=i;j<L.length;j++){
  47.         L.data[j-1]=L.data[j];
  48.     }
  49.     L.length--;
  50.     printf("删除第%d个元素成功!\n",i);
  51.     return true;    
  52. }
  53. //清空线性表
  54. void ClearList(Sqlist &L){
  55.     L.length=0;//直接让当前元素个数为零即可 
  56.     printf("清空成功!\n");
  57. //按元素所在位置修改元素
  58. bool AlterElem(Sqlist &L){
  59.     int i,e;
  60.     printf("请输入你要修改的元素所在位置和新元素:\n");
  61.     scanf("%d%d",&i,&e);
  62.     if(L.length==0){
  63.         printf("当前线性表为空\n");
  64.         return false;
  65.     }
  66.     if(i>L.length){
  67.         printf("超出当前元素个数!\n");
  68.         return false;
  69.     }
  70.     L.data[i-1]=e;
  71.     printf("修改成功!\n");
  72.     return true;
  73. //按元素所在位置查询元素 
  74. bool GetElem(Sqlist &L){
  75.     int i;
  76.     printf("请输入你要查询的元素所在位置:\n");
  77.     scanf("%d",&i);
  78.     if(L.length==0){
  79.         printf("当前线性表为空\n");
  80.         return false;
  81.     }
  82.     if(i>L.length){
  83.         printf("超出当前元素个数!\n");
  84.         return false;
  85.     }
  86.     printf("线性表第%d个元素为:%d\n",i,L.data[i-1]);
  87.     return true;
  88. }
  89. /*扩充空间,第一次初始化的线性表的存储空间是有限的,
  90. 通过这个函数可以在空间不够时进行添加存储空间,
  91. 从而加大线性表的存储量,但需要对之前所有元素进行复制,
  92. 会加大时间复杂度 
  93. */ 
  94. void IncreaseL(Sqlist &L){
  95.     int *p,len;
  96.     printf("请输入你要扩充的存储单元数:\n");
  97.     scanf("%d",&len);
  98.     p=L.data;
  99.     L.data=(int*)malloc(sizeof(int)*(Max+len));
  100.     for(int i=0;i<L.length;i++){
  101.         L.data[i]=p[i];
  102.     }
  103.     L.Max_size+=len;
  104.     free(p);
  105.     printf("存储空间扩充成功!\n");
  106.     printf("当前存储空间为:%d\n",L.Max_size);
  107. }
  108. //打印线性表的元素 
  109. bool Print(Sqlist L){
  110.     if(L.length!=0){
  111.         printf("线性表元素:\n");
  112.         for(int i=0;i<L.length;i++){
  113.             printf("%d\t",L.data[i]);
  114.         }
  115.         printf("\n");
  116.         return true;
  117.     }
  118.     else{
  119.         printf("当前线性表为空!\n");
  120.         return false;
  121.     }    
  122. //菜单
  123. void Menu(){
  124.     printf("=================================\n");
  125.     printf("1.打印线性表\n");
  126.     printf("2.删除元素\n");
  127.     printf("3.插入元素\n");
  128.     printf("4.扩充存储空间\n");
  129.     printf("5.按位置查询数据\n");
  130.     printf("6.逐个插入数据\n");
  131.     printf("7.按位置修改数据\n");
  132.     printf("8.清空线性表\n");
  133.     printf("9.初始化\n");
  134.     printf("0.退出系统\n"); 
  135.     printf("请输入你要进行的操作:\n");
  136. }

4.主函数调用实现

代码如下(示例):

  1. int main(){
  2.     Sqlist L;//声明一个线性表
  3.     InitList(L);//线性表的第一次初始化,为线性表分配存储空间 
  4.     int Choice; //定义与菜单相匹配的选择变量Choice 
  5.     while(1){//对菜单栏的打印和用户要做的选择进行循环更新 
  6.         Menu();//打印菜单 
  7.         scanf("%d",&Choice);//从键盘获取用户的选择 
  8.         switch(Choice){        //使用switch函数进行操作匹配 
  9.         case 1:Print(L);break; //打印线性表 
  10.         case 2:DeleElem(L);break;//删除一个元素 
  11.         case 3:InsertElem(L);break;//在指定位置插入元素 
  12.         case 4:IncreaseL(L);break;//增加指定数量的存储空间 
  13.         case 5:GetElem(L);break;//按位置查询线性表元素 
  14.         case 6:Insert(L);break;//按顺序逐个对线性表进行插入 
  15.         case 7:AlterElem(L);break;//修改指定位置元素 
  16.         case 8:ClearList(L);break;//一键清空线性表 
  17.         case 9:InitList(L);break;//对线性表进行初始化操作 
  18.         case 0:exit(0);//退出系统 
  19.         }
  20.     }
  21.     return 0;

该处使用switch()函数对每个函数方法进行调用以实现对应操作。


5.完整代码

代码如下(示例):

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define Max 10
  4. //定义线性表数据类型 
  5. typedef struct{
  6.     int *data;
  7.     int length;
  8.     int Max_size;
  9. }Sqlist;//把该数据类型命名为Sqlist 
  10. //线性表的初始化 
  11. void InitList(Sqlist &L){
  12.     L.data=(int*)malloc(sizeof(int)*Max);
  13.     L.length=0;
  14.     L.Max_size=Max;
  15.     if(L.data!=0)
  16.         printf("初始化成功!\n");
  17.     else     
  18.         printf("初始化失败!\n");
  19. }
  20. //逐一插入线性表元素 
  21. void Insert(Sqlist &L){
  22.     printf("请逐个输入你要插入的元素:\n");
  23.     for(int i=0;i<Max;i++){
  24.         scanf("%d",&L.data[i]);
  25.         L.length++;
  26.     }
  27. //按位置插入元素
  28. bool InsertElem(Sqlist &L){
  29.     int i,e;
  30.     printf("请输入插入位置和数据:\n");
  31.     scanf("%d%d",&i,&e);
  32.     if(i<1 || i>L.length+1)
  33.         return false;
  34.     if(L.length==L.Max_size)
  35.         return false;
  36.     for(int j=L.length;j>=i;j--){
  37.         L.data[j]=L.data[j-1];
  38.     }
  39.     L.data[i-1]=e;
  40.     L.length++;
  41.     return true;
  42. //按元素所在位置删除元素
  43. bool DeleElem(Sqlist &L){
  44.     int i;
  45.     printf("请输入你要删除的元素所在位置:\n");
  46.     scanf("%d",&i);
  47.     if(L.length==0){
  48.         printf("当前线性表为空\n");
  49.         return false;
  50.     }
  51.     if(i>L.length){
  52.         printf("超出当前元素个数!\n");
  53.         return false;
  54.     }
  55.     for(int j=i;j<L.length;j++){
  56.         L.data[j-1]=L.data[j];
  57.     }
  58.     L.length--;
  59.     printf("删除第%d个元素成功!\n",i);
  60.     return true;    
  61. }
  62. //清空线性表
  63. void ClearList(Sqlist &L){
  64.     L.length=0;//直接让当前元素个数为零即可 
  65.     printf("清空成功!\n");
  66. //按元素所在位置修改元素
  67. bool AlterElem(Sqlist &L){
  68.     int i,e;
  69.     printf("请输入你要修改的元素所在位置和新元素:\n");
  70.     scanf("%d%d",&i,&e);
  71.     if(L.length==0){
  72.         printf("当前线性表为空\n");
  73.         return false;
  74.     }
  75.     if(i>L.length){
  76.         printf("超出当前元素个数!\n");
  77.         return false;
  78.     }
  79.     L.data[i-1]=e;
  80.     printf("修改成功!\n");
  81.     return true;
  82. //按元素所在位置查询元素 
  83. bool GetElem(Sqlist &L){
  84.     int i;
  85.     printf("请输入你要查询的元素所在位置:\n");
  86.     scanf("%d",&i);
  87.     if(L.length==0){
  88.         printf("当前线性表为空\n");
  89.         return false;
  90.     }
  91.     if(i>L.length){
  92.         printf("超出当前元素个数!\n");
  93.         return false;
  94.     }
  95.     printf("线性表第%d个元素为:%d\n",i,L.data[i-1]);
  96.     return true;
  97. }
  98. /*扩充空间,第一次初始化的线性表的存储空间是有限的,
  99. 通过这个函数可以在空间不够时进行添加存储空间,
  100. 从而加大线性表的存储量,但需要对之前所有元素进行复制,
  101. 会加大时间复杂度 
  102. */ 
  103. void IncreaseL(Sqlist &L){
  104.     int *p,len;
  105.     printf("请输入你要扩充的存储单元数:\n");
  106.     scanf("%d",&len);
  107.     p=L.data;
  108.     L.data=(int*)malloc(sizeof(int)*(Max+len));
  109.     for(int i=0;i<L.length;i++){
  110.         L.data[i]=p[i];
  111.     }
  112.     L.Max_size+=len;
  113.     free(p);
  114.     printf("存储空间扩充成功!\n");
  115.     printf("当前存储空间为:%d\n",L.Max_size);
  116. }
  117. //打印线性表的元素 
  118. bool Print(Sqlist L){
  119.     if(L.length!=0){
  120.         printf("线性表元素:\n");
  121.         for(int i=0;i<L.length;i++){
  122.             printf("%d\t",L.data[i]);
  123.         }
  124.         printf("\n");
  125.         return true;
  126.     }
  127.     else{
  128.         printf("当前线性表为空!\n");
  129.         return false;
  130.     }    
  131. //菜单
  132. void Menu(){
  133.     printf("=================================\n");
  134.     printf("1.打印线性表\n");
  135.     printf("2.删除元素\n");
  136.     printf("3.插入元素\n");
  137.     printf("4.扩充存储空间\n");
  138.     printf("5.按位置查询数据\n");
  139.     printf("6.逐个插入数据\n");
  140.     printf("7.按位置修改数据\n");
  141.     printf("8.清空线性表\n");
  142.     printf("9.初始化\n");
  143.     printf("0.退出系统\n"); 
  144.     printf("请输入你要进行的操作:\n");
  145. //主函数 
  146. int main(){
  147.     Sqlist L;//声明一个线性表
  148.     InitList(L);//线性表的第一次初始化,为线性表分配存储空间 
  149.     int Choice; //定义与菜单相匹配的选择变量Choice 
  150.     while(1){//对菜单栏的打印和用户要做的选择进行循环更新 
  151.         Menu();//打印菜单 
  152.         scanf("%d",&Choice);//从键盘获取用户的选择 
  153.         switch(Choice){        //使用switch函数进行操作匹配 
  154.         case 1:Print(L);break; //打印线性表 
  155.         case 2:DeleElem(L);break;//删除一个元素 
  156.         case 3:InsertElem(L);break;//在指定位置插入元素 
  157.         case 4:IncreaseL(L);break;//增加指定数量的存储空间 
  158.         case 5:GetElem(L);break;//按位置查询线性表元素 
  159.         case 6:Insert(L);break;//按顺序逐个对线性表进行插入 
  160.         case 7:AlterElem(L);break;//修改指定位置元素 
  161.         case 8:ClearList(L);break;//一键清空线性表 
  162.         case 9:InitList(L);break;//对线性表进行初始化操作 
  163.         case 0:exit(0);//退出系统 
  164.         }
  165.     }
  166.     return 0;
  167. }

总结

以上就是今天要讲的内容,笔者认为,线性表的实现主要是对指针的理解,如果能够理解代码中线性表L中的data指针变量和初始化函数中malloc()函数所开辟的空间之间的关系,那么理解上面的代码将容易很多。本文仅仅简单介绍了顺序表的实现方法,希望对读者朋友有所帮助。

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

闽ICP备14008679号