408考研笔记之数据结构(二):线性表之顺序存储

本文仅为复习时所记笔记,如有错误与不足还请指正。

  1. 线性表:是具有相同数据元素类型的n(n≥0)个数据元素的有限序列。如果n=0为空表。【注意:①相同数据类型,即数据元素所占存储空间一样大。②位序是从1开始的而数组下标是从0开始。】

  2. 线性表是一种逻辑结构。(我理解的是,元素与元素之间是一对一的线性关系,就像食堂排队买饭一样。)

  3. 线性表的存储方式:包括顺序存储和链式存储。
    3.1 线性表的顺序存储——顺序表。(用顺序存储的方式实现线性表的村粗,也就是让逻辑上相邻的元素物理上也相邻。)
    3.2 由于是顺序存储且数据元素类型相同,所以可以计算出元素的地址。(设起始地址为Loc(L),则第n个元素的地址为:[Loc(L)+sizeof(ElemType)*n].【其中sizeof(ElemType)是用来计算一个数据元素类型的大小,ElemType为数据元素类型,如int型。】
    3.3 顺序表的实现包括静态分配和动态分配。
    3.3.1 静态分配是以静态的“数组”存放数据元素。
    ①定义顺序表
    此时在内存中开辟的是一段连续的存储空间,这只是定义的格式,数组中的数据类型可以自己定义,如int型。
    此时在内存中开辟的是一段连续的存储空间,这只是定义的格式,数组中的数据类型可以自己定义,如int型。
    ②初始化顺序表
    在这里插入图片描述
    注:这里L.data[i]=0是设置初始值,如果不设置初始值则有可能返回任何奇怪的数据(因为系统中可能有脏数据)。但这一步也可以省略,因为令length等于0后,就不可能返回后面的值了。
    ③静态分配的缺点:如果内存满了就不行了,顺序表的长度从刚开始定义就无法更改。
    为了解决这个弱点,从而引入动态分配方式。定义及各种操作如下:
    ①定义在这里插入图片描述
    ②初始化
    在这里插入图片描述
    ③增加元素前需要增加长度
    在这里插入图片描述
    注:这里是重新申请一片一片连续空间,而不是直接在后面继续开一片空间。
    ④顺序表的基本操作——插入

    在这里插入图片描述
    注:顺序表插入一个元素,需要将该位置以及后面的元素往后移,给该元素腾位置。其中i值需要合法:1≤i≤length+1,所以必须先判断i是否合法,才能进行插入操作。
    时间复杂度:最好情况(插入表位)为O(1);最坏情况(插入表头)为O(n);平均情况为O(n)【插入每个位置的概率为1/(n+1),所以(1+2+…+n)*[1/(n+1)]=n/2】
    ⑤顺序表的基本操作——删除在这里插入图片描述
    注:与插入相同,需要先判断i是否合法。先将该元素赋值给e,用e返回需要删除的值。而后利用循环将i后面每一个元素的值赋值给前一个,便实现了删除操作。【我觉得可以理解成,顺序表的空间是固定的,但是元素却是流动的,我无法更改空间,但我可以通过赋值操作实现插入和删除】
    时间复杂度:最好情况(删除表尾,不需移动)O(1);最坏情况(删除表头)O(n);平均情况O(n)【计算方法同插入操作】
    ⑥顺序表的基本操作——按值查找与按位查找

    在这里插入图片描述
    此为按位查找,时间复杂度为O(1),体现了线性表随机存取的特点。由于线性表的各个数据元素在内存中连续存放,且为相同数据类型,所以可以根据起始地址和数据元素大小立即找到某个位置的元素。
    在这里插入图片描述
    此为按值查找。时间复杂度:最好情况(在表头):O(1);最坏情况(在表尾):O(n);平均情况:O(n)。
    ⑦顺序表的基本操作——改变元素的值
    该操作基于查找操作,找到后更改即可,故不详细讲述。

  4. 总结
    顺序表的实现方式:①静态分配(使用静态“数组”实现,大小一旦确定无法更改)。②动态分配(使用“动态数组”实现,当顺序表存满的时候,使用malloc函数动态扩展顺序表的最大容量,但需要将数组元素复制到新的空间,而不是直接在后面加,并且需要free函数释放原来的空间)。
    顺序表的特点:①随机存取,也就是可以在O(1)时间内找到第i个元素。②存储密度高,每个结点都只存储数据元素(而链表还需要存放指针)。③但扩展容易不方便(静态分配不能扩容,动态分配扩展长度的时间复杂度极高)。④插入、删除操作不太方便。
    顺序表的存储结构:逻辑上相邻的元素物理上也相邻。

发布了2 篇原创文章 · 获赞 3 · 访问量 63

猜你喜欢

转载自blog.csdn.net/qq_38652677/article/details/105330487
今日推荐