目录
一.线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结
构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。
数组形式存储图示:
链表形式存储图示:
二.顺序表
1概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。
1.1 静态顺序表:使用定长数组存储。
静态顺序表的经典模型如下:typedef N 1000struct SeqList{int data[N];size_t size;}这里N是这个顺序表能存储的数据个数,size用来记录已存有效数据的个数。
它的空间是静态开辟的,不可调整,这就带来一个致命的问题:这个空间给大了浪费,给少了又不够用,所以实际情况中,我们大多使用的是动态顺序表。
1.2动态顺序表:使用动态开辟的数组存储。
动态顺序表的经典模型如下:struct SeqList{int* data;size_t size;size_t capacity;}这里 size同样记录这个顺序表已存有效数据的个数,数据data所占的空间都是动态开辟的额。capacity记录容量。
2顺序表的接口实现:
现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下 面我们实现动态顺序表。
3顺序表自身结构存在的缺点
①头上/中间插入数据的时间复杂度是O(N),效率不高。
②增容时如果后边的空间不够,需要拷贝数据,释放旧空间,会有不小的消耗。
③每次增容时,空间变为原来的二倍(这里时自己定义的修改方式,因人而异),空间存在一定的浪费,例如,已经存了100个数据,现在需要再增加五个数据,这样就有95个空间浪费了掉了。
那么有没有一种结构能够弥补上述的缺陷呢?接下来我们就将介绍一种新的类型的线性表->链表
三.链表
1 链表的概念及结构
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。
结构:链表一般由个结构体组成,每个结构体可以包含数据和结构体指针两部分,指针部分通过存储下一个结点的地址来将其链接成表。
链表的种类很多,按是否带有头节点分:有头链表和无头链表,
按是否存在循环分:循环链表和无头链表
按是否存有上一结点地址分:单向链表和双向链表
2 链表的实现
3链表的缺点
①每个结点都是malloc开辟的,会产生较多的内存碎片(留下的整块的可用空间少)。
②每个结点比顺序表需要多使用八个字节用来存放下一个结点的指针。
③单链表尾删的话需要遍历找到前一个结点,时间复杂度是O(N)。
④不支持随机访问。
⑤缓存命中率低,寄存器的运行速度特别快,空间小,每次获取数据时,会先在寄存器里找,如果找不到,才会去主存中去找,它每次读数据时,会多读几个数据(取决于寄存器的长度),这就导致链表结构被读到的有效数据相比顺序表较少,命中率低。