当前位置:   article > 正文

【数据结构】线性表的顺序存储结构_顺序线性表

顺序线性表

     

目录

【线性表的一些基础概念】

【线性表的顺序表示---顺序表】

1、顺序表:

2、顺序表的缺点和优点

优点:

缺点:

【顺序表的实现】

一、顺序表的结构体

二、顺序表初始化

三、打印顺序表

四、寻找指定元素,函数返回值为指定元素的位序

五、尾插法插入元素

六、头插法插入元素

七、在指定位序插入元素

八、寻找该表中最小值以及下标:

九、找到列表最小的值 并且删除它,移动最后一个元素去填充它

十、删除指定位序元素,并用e返回

十一、要求时间复杂度为O(1),空间复杂度为O(n),删除顺序表中所有值为x 的元素



【线性表的一些基础概念】

线性表:是具有相同数据类型的n(>=0)个数据元素的有限序列(序列:先来后到)

位序和下标:位序是1开始,下标是从0开始。

1、第一个元素没有前驱,最后一个元素没有后继

2、其他元素有且只有一个前驱和后继

3、线性表所处理的数据是有限的。

如何去判断一个结构是不是线性表?

1、是否是一对一

2、类型是否相同

3、是否是有限序列?

4、逻辑结构?

补充:关于数据结构中存方式和存方式:

存储方式

四种:顺序存储、链式存储、索引存储、散列存储。

存取方式:

二种:随机存取,顺序存取。

对于线性表而言:有顺序表和链表两种

线性表是属于逻辑结构。

顺序表是采用顺序存储对线性表的实现,是存储结构。

链表是采用链式存储对线性表的实现,是存储结构

这里我们接收线性表的顺序存储结构

【线性表的顺序表示---顺序表】

1、顺序表:

按照逻辑顺序,依次存储到指定位置开始的一块连续存储空间,物理上就是相邻的。 是线性表的顺序存储结构。“数组实现” 地址是连续的。 逻辑相邻的两个元素物理上也相邻

2、顺序表的缺点和优点

线性表的顺序存储结构,也就是顺序表。在存、读取数据时候,不管在哪个位置,时间复杂度都是O(1),而在插入和删除、查找时,时间复杂度都是O(n)

优点:

一、顺序表在查找数据元素的时候时间复杂度为O(1),很方便查找和访问

二、相较于链表而言,存储密度更高。

缺点:

一、在删除和插入元素的时候,需要移动大量的元素,所以时间复杂度为O(n),但是链表时间复杂度为O(1)。

【顺序表的实现】

一、顺序表的结构体

1.静态存储结构

  1. #define MaxSize 50 //规定大小
  2. //顺序表的静态分配
  3. typedef struct{
  4. ElemType data[MaxSize];
  5. int len;
  6. }SqList;

2.动态存储结构

  1. typedef int elemtpye; //对应元素类型需要在这里修改,在我这里面就是int类型
  2. typedef struct {
  3. elemtpye *data;
  4. int len;
  5. int Maxsize;
  6. }Sqlist;

二、顺序表初始化

1.静态存储:只需要将len变为0

  1. void initSqlist(Sqlist &l){
  2. l.len=0;
  3. }

2.动态存储

  1. void init_list(list &l,int initsize) //初始化顺序表
  2. {
  3. l.data = (elemtpye *)malloc(sizeof(elemtpye)*initsize);
  4. l.Maxsize = initsize;
  5. l.len = 0;
  6. }

三、打印顺序表

  1. void print_list(list l) //打印顺序表,不涉及修改不需要引用
  2. {
  3. for(int i=0;i<l.len;i++)
  4. {
  5. cout<<l.data[i]<<" ";
  6. }
  7. cout<<endl;
  8. }

四、寻找指定元素,函数返回值为指定元素的位序

  1. int localElem(list &l,elemtpye a)
  2. {
  3. for (int j=0;j<l.len;j++){
  4. if(l.data[j]==e)
  5. return j+1;
  6. }
  7. return 0;
  8. }

五、尾插法插入元素

  1. bool pushback_list(list &l,elemtpye a)
  2. {
  3. if(l.len == l.Maxsize)
  4. {
  5. cout<<"list is full"<<endl;
  6. return false;
  7. }
  8. else
  9. {
  10. l.data[l.len] = a;
  11. l.len++;
  12. return true;
  13. }
  14. }

六、头插法插入元素

  1. bool popback(list &l,elemtpye e)
  2. {
  3. if(l.len == l.Maxsize)
  4. {
  5. cout<<"list is full"<<endl;
  6. return false;
  7. }
  8. else
  9. {
  10. for(int i =l.len;i>=0;i--)
  11. {
  12. l.data[i] = l.data[i-1];
  13. }
  14. l.data[0] = e;
  15. l.len++;
  16. return true;
  17. }
  18. }

七、在指定位序插入元素

  1. bool insert_list(list &l,int i,elemtpye a)
  2. {
  3. if(i<1 || i>l.len+1||l.len >= l.Maxsize)
  4. {
  5. return false;
  6. }
  7. else
  8. {
  9. for(int j = l.len;j>=i;j--)
  10. {
  11. l.data[j] = l.data[j-1]; //从后开始,将插入位置后面的所有元素都往后移动一位
  12. }
  13. l.data[i-1] = a;
  14. l.len++;
  15. return true;
  16. }
  17. }

八、寻找该表中最小值以及下标:

  1. void find_min(list &l,int &index,elemtpye &target)
  2. {
  3. index = 0;
  4. target = l.data[index]; //一开始假设最小值是第一个元素,往后遍历,找到更小的,就更新index和target
  5. // l.data[index] = target; //最小值
  6. for(int i=1;i<l.len;i++)
  7. {
  8. if(l.data[i]<target)
  9. {
  10. index = i;
  11. target = l.data[i];
  12. }
  13. }
  14. }

九、找到列表最小的值 并且删除它,移动最后一个元素去填充它

  1. bool my_fun(list &l,elemtpye &min) //找到最小值删除它,然后使用最后一个元素去填补它。
  2. {
  3. if(l.len == 0)
  4. {
  5. return false;
  6. }
  7. int index_min =0;
  8. min = l.data[index_min];
  9. for(int i = 1;i<l.len;i++)
  10. {
  11. if(l.data[i]<min)
  12. {
  13. min = l.data[i];
  14. index_min = i;
  15. } //找到最小值
  16. }
  17. l.data[index_min] = l.data[l.len-1];
  18. l.len--;
  19. return true;
  20. }

十、删除指定位序元素,并用e返回

  1. bool ListDelete(SqList &l, int i, ElemType &e)
  2. {
  3. if(l.len<0 || i<1 || i>l.len) return false;
  4. e = l.data[i-1];
  5. for (int j=i;j<l.len;j++) {
  6. l.data[j-1]=l.data[j];
  7. }
  8. l.len--;
  9. return true;
  10. }

十一、要求时间复杂度为O(1),空间复杂度为O(n),删除顺序表中所有值为x 的元素

  1. void deleteValue(Sqlist &l,ElemType x)
  2. {
  3. int i=0,k=0;
  4. while(i<l.len){
  5. if(L.data[i]==x)
  6. k++;
  7. else {
  8. L.data[i-k]=l.data[i];
  9. i++;
  10. l.length-=k;
  11. }
  12. }

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

闽ICP备14008679号