当前位置:   article > 正文

数据结构 第二章线性表代码总结——顺序表_数据结构顺序线性表代码

数据结构顺序线性表代码

目录

1.顺序表

1.1 顺序表的实现

1.1.1 静态分配

1.1.2 动态分配

1.1.3 顺序表的特点

1.2 顺序表的基本操作

1.2.1 插入

1.2.2 删除

1.2.3 查找

        1.2.3.1 按位查找

        1.2.3.2 按值查找


相同,有限,序列

注:位序从1开始,数组下标从0开始

传入参数的引用“&”——直接对原参数进行修改,反之是对原参数进行复制后修改

1.顺序表

逻辑上相邻,物理位置上也相邻。

顺序表的表长确定后无法更改。

1.1 顺序表的实现

1.1.1 静态分配

  1. #include <stdio.h>
  2. #define MaxSize 10 //定义最大长度
  3. typedef struct{
  4. int data[MaxSize]; //用静态的“数组”存放数据元素
  5. int length; //顺序表的当前长度
  6. }SqList;
  7. //基本操作——初始化一个顺序表
  8. void InitList(SqList &L){
  9. for(int i=0; i<MaxSize; i++)
  10. L.data[i]=0; //将所有数据元素设置为默认初始值
  11. L.length=0; //顺序表初始长度为0
  12. }
  13. int main(){
  14. SqList L; //声明一个顺序表
  15. InitList(L); //初始化顺序表
  16. //... 后续操作
  17. return 0;
  18. }

1.1.2 动态分配

  1. #include <stdlib.h> //malloc,free函数的头文件
  2. #define InitSize 10 //默认的最大长度
  3. typedef struct{
  4. int *data; //指示动态分配数组的指针
  5. int MaxSize; //顺序表的最大容量
  6. int length; //顺序表的当前长度
  7. }SqList;
  8. void InitList(SqList &L){
  9. //用malloc函数申请一片连续的存储空间
  10. L.data=(int *)malloc(InitSize*sizeof(int));
  11. L.length=0;
  12. L.MaxSize=InitSize;
  13. }
  14. //增加动态数组的长度
  15. void IncreaseSize(SeqList &L, int len){
  16. int *p=L.data;
  17. L.data=(int *)malloc(L.MaxSize+len)*sizeof(int));
  18. for(int i=0; i<L.length; i++){
  19. L.data[i]=p[i]; //将数据复制到新区域(时间开销大)
  20. }
  21. L.MaxSize=L.MaxSize+len; //顺序表最大长度增加len
  22. free(p);
  23. }
  24. int main(){
  25. SqList L; //声明一个顺序表
  26. InitList(L); //初始化顺序表
  27. //...往顺序表中随便插入几个元素
  28. IncreaseSize(L,5);
  29. return 0;
  30. }

1.1.3 顺序表的特点

  1. 随机访问,可以在O(1)时间内找到第i个元素。代码实现为data[i],动态分配和静态分配都一样。
  2. 存储密度高,每个节点只存储数据元素。
  3. 拓展容量不方便(即使采用动态分配的方式实现,拓展长度的时间复杂度也比较高)。
  4. 插入、删除操作不方便,需要移动大量元素。

1.2 顺序表的基本操作

注:本节代码建立在顺序表的“静态分配”实现方式之上,“动态分配”也雷同

1.2.1 插入

时间复杂度:

最好——O(1)

最坏——O(n)

平均——O(n)

  1. #define MaxSize 10 //定义最大长度
  2. typedef struct{
  3. int data[MaxSize]; //用静态的“数组”存放数据元素
  4. int length; //顺序表的当前长度
  5. }SqList; //顺序表的类型定义
  6. void ListInsert(SqList &L,int i,int e){ //基本操作:在L的位序i处插入元素e
  7. if(i<1||i>L.length+1) //判断i的范围是否有效
  8. return false;
  9. if(L.length>=MaxSize) //当前存储空间已满,不能插入
  10. return false;
  11. for(int j=L.length; j>=i;j--) //将第i个元素及以后的元素后移
  12. L.data[j]=L.data[j-1];
  13. L.data[i-1]=e; //在位置i处放入e
  14. L.length++; //长度加1
  15. return true;
  16. }
  17. int main(){
  18. SqList L; //声明一个顺序表
  19. InitList(L); //初始化顺序表
  20. //... 此处省略一些代码,插入一些元素
  21. }

1.2.2 删除

时间复杂度同插入

  1. bool ListDelete(SqList &L,int i,int &e){
  2. if(i<1||i>L.length) //判断i的范围是否有效
  3. return false
  4. e=L.data[i-1]; //将被删除的元素赋值给e
  5. for(int j=i;j<L.length;j++) //将第i个位置的元素前移
  6. L.data[j-1]=L.data[j] //从前面的元素依次移动
  7. L.length--;
  8. return true;
  9. }
  10. int main(){
  11. SqList L; //声明一个顺序表
  12. InitList(L) //初始化顺序表
  13. //... 此处省略,插入几个元素
  14. int e=-1; //用变量e把删除的元素“带回来”
  15. if (ListDelete(L,3,e))
  16. printf("已删除第3个元素,删除元素值为=%d\n",e);
  17. else
  18. printf("位序i不合法,删除失败\n");
  19. return 0;
  20. }

1.2.3 查找

1.2.3.1 按位查找

时间复杂度:O(1)[随机存取]

  1. #define InitSize 10 //顺序表的初始长度
  2. typedef struct{
  3. ElemType *data; //指示动态分配数组的指针
  4. int MaxSize; //顺序表的最大容量
  5. int length; //顺序表的当前长度
  6. }SeqList; //顺序表的类型定义(动态分配方式)
  7. ElemType GetElem(SeqList L, int i){
  8. return L.data[i-1];
  9. }

1.2.3.2 按值查找

时间复杂度:同插入

补:C语言中,结构体的比较不能直接用“==”,可以比较结构体内的成员。

  1. #define InitSize 10        //顺序表的初始长度
  2. typedef struct{
  3. ElemType *data; //指示动态分配数组的指针
  4. int MaxSize; //顺序表的最大容量
  5. int length; //顺序表的当前长度
  6. }SeqList; //顺序表的类型定义(动态分配方式)
  7. //在顺序表L中查找第一个元素的值等于e的元素,并返回其位序
  8. int LocateElem(SeqList L,ElemType e){
  9. for(int i=0;i<L.length;i++)
  10. if(L.data[i]==e)
  11. return i+1; //数组下标为i的元素值等于e,返回其位序i+1
  12. return 0; //退出循环,说明查找失败
  13. }

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

闽ICP备14008679号