当前位置:   article > 正文

数据结构之顺序表_求顺序表的长度

求顺序表的长度

目录

存储结构

操作实现

类型定义

初始化

判空

求长

插入

查找

删除

测试

存储结构

顺序表在内存中以一段连续的地址存储,具有随机性,顺序性,动态性:

随机性,即首地址随机生成;

顺序性,即各元素地址满足等距相邻;

动态性,即存储空间可在程序运行时动态生成。

操作实现

  • 类型定义

结构体类型,定义一个动态数组存储数据,定义表长和当前长度。

  1. typedef struct //顺序表结构体
  2. {
  3. int *base; //动态数组
  4. int length; //顺序表当前长度
  5. int listsize; //顺序表最大长度
  6. }List;

  • 初始化

函数参数设成引用传递地址,以改变顺序表;

然后申请动态数组空间;

定义表长,初始化当前长度;

  1. void initList (List &L) //参数设成引用,地址传递;
  2. {
  3. L.base=(int)malloc(100*sizeof(int)); //申请空间
  4. if(!L.base) return; //申请失败则返回
  5. L.length=0; //当前长度赋为零
  6. L.size=100; //为顺序表赋长度
  7. }

  • 判空

不需改变顺序表的数据,因此值传递即可;

访问当前长度,为零则空,否则不空。

  1. int listempty(List L) //不需改变实参,值传递即可
  2. {
  3. if(L.length==0) return 1; //当前长度为零即为空
  4. return 0; //否则返回零
  5. }

  • 求长

直接访问顺序表结构体的当前长度。

  1. int listlength(List L) //无需改变实参,值传递即可
  2. {
  3. return L.length; //返回当前表长
  4. }

  • 插入

这里写的是在第i个元素之前插入。

应先判断i的合法性;

再判断空间是否不足,不足则申请更长的空间;

之后倒序右移i后元素;

最后插入元素。

  1. void ListInsert(List &L,int i,int e)
  2. {
  3. if(i>L.length+1||i<1) return ; //i非法则返回
  4. if(L.length+1>L.listsize) //空间不足则先申请空间
  5. { (int*)realloc(L.base,(L.listsize+listcrement)*sizeof(int));
  6. L.listsize+=listcrement;
  7. }
  8. for(int j=L.length-1;j>=i-1;j--) //倒序右移i后元素
  9. L.base[j+1]=L.base[j];
  10. L.base[i-1]=e; //插入e
  11. L.length++; //长度加一
  12. }

  • 查找

遍历顺序表,到头或遇目标值跳出;

i到头则返回-1;

否则返回位置;

  1. int Locatelem(List L,int e)
  2. {
  3. int i=0;
  4. while(i<L.length&&L.base[i]!=e) //跳出条件
  5. i++;
  6. if(i<L.length)
  7. return i+1; //返回位置
  8. }

  • 删除

判断i的合法性;

正序左移i前元素;

长度减一;

  1. void Delete(List &L,int i)
  2. {
  3. if(L.length<i) return; //i非法
  4. for(int j=i;j<L.length;j++) //正序左移
  5. L.base[j-1]=L.base[j];
  6. L.length--; //长度减一
  7. }

测试

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define listSize 100
  4. #define listcrement 10
  5. int a;
  6. typedef struct //类型定义
  7. { int *base;
  8. int length;
  9. int listsize;
  10. }List;
  11. void initList(List &L) //初始化
  12. { L.base=(int*)malloc(listSize*sizeof(int));
  13. if(!L.base) return;
  14. L.length=0;
  15. L.listsize=listSize;
  16. }
  17. int listempty(List L) //判空
  18. { if(L.length==0) return 1;
  19. return 0;
  20. }
  21. int listlength(List L) //求长度
  22. {
  23. return L.length;
  24. }
  25. int getelement(List &L,int i) //取元素
  26. { if(i<1||i>L.length) return -1;
  27. int e=L.base[i-1];
  28. return e;
  29. }
  30. int Locatelem(List L,int e) //查位序
  31. { int i=0;
  32. while(i<L.length&&L.base[i]!=e)
  33. i++;
  34. if(i<L.length)
  35. return i+1;
  36. }
  37. void ListInsert(List &L,int i,int e) //i前插入
  38. { if(i>L.length+1||i<1) return ;
  39. if(L.length+1>L.listsize)
  40. { (int*)realloc(L.base,(L.listsize+listcrement)*sizeof(int));
  41. //if(!newbase) return;
  42. //L.base=newbase;
  43. L.listsize+=listcrement;
  44. }
  45. for(int j=L.length-1;j>=i-1;j--)
  46. L.base[j+1]=L.base[j];
  47. L.base[i-1]=e;
  48. L.length++;
  49. }
  50. void Delete(List &L,int i) //删除
  51. { if(L.length<i) return;
  52. for(int j=i;j<L.length;j++)
  53. L.base[j-1]=L.base[j];
  54. L.length--;
  55. }
  56. int main()
  57. { List ll;
  58. initList(ll);
  59. ll.base[0]=1;
  60. ll.length++;
  61. ListInsert(ll,1,2);
  62. ListInsert(ll,1,3);
  63. ListInsert(ll,1,4);
  64. ListInsert(ll,2,5);
  65. cout<<ll.length<<"\n";
  66. for(int i=0;i<=4;i++)
  67. cout<<ll.base[i]<<" ";
  68. cout<<"\n";
  69. Delete(ll,1);
  70. for(int i=0;i<ll.length;i++)
  71. cout<<ll.base[i]<<" ";
  72. cout<<"\n";
  73. cout<<Locatelem(ll,2);
  74. }

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

闽ICP备14008679号