1.顺序表
1.1顺序表的概念
顺序表是用一段物理地址连续的存储单元依次存储元素的线性结构,一般情况下存储的是数组,在数组上完成增删查改。顺序表可分为两类。
静态顺序表:是用定常数组来存储数据。
动态顺序表:使用动态开辟的数组元素。通常用malloc函数进行初始化,用realloc进行增容。
1.2顺序表的优缺点
优点:可以随机访问元素。时间复杂度为O(1)。
缺点:1.顺序表会进行空间上的浪费。
2.进行删除与拆入元素的时候需要移动元素。时间复杂度为O(N)。
3.可能会造成空间碎片。
1.3顺序表的空间碎片
为什么顺序表会有空间碎片的产生呢?所谓顺序表,就是把逻辑相邻的元素放在物理地址相连的存储单元上。因为是相连的,存储的时候就需要进行整块的单元存储。将多个大小不同的顺序表按左右相连进行排序。这时,将中间的顺序表进行释放。被释放的顺序表的存储空间会始终留在原地。想要使用这块空间就必须放入比该空间小的存储空间。当放的空间小于该空间的时候,如果空间未完全占用,就会有一块小缝隙未进行使用,那块缝隙因为太小而使用不掉。当程序进行长时间运行时,并以一定的频率产生缝隙,这种小的缝隙越来越多,形成的空间碎片也越来越多。造成空间的浪费。
2.链表
2.1链表的概念
链表是指逻辑上连续,物理空间上不连续、不顺序的线性结构。数据元素的逻辑连续通过链表中的指针链表进行连续的。
2.2链表的优缺点
优点 :1.插入元素与删除元素不需要移动元素。时间上为O(1)。
2.链表是动态数据结构,它可以在运行时通过分配和取消分配内存来增长和缩小。所以可以不用进行初始化
3.链表在运行时可以增加或减少内存,他的内存利用率高。
4.需要更多内存。因为每一个内存都需要分配一个指针指向下一个链表。
缺点:1.不能随机访问元素。
2.遍历困难
链表与顺序表的不同
1.1从物理地址上比较
链表的物理地址是非连续,非顺序的。顺序表的物理地址是顺序的。
1.2从空间与时间上比较
链表在增加元素与删除元素的时候,不需大量的挪动元素,可以直接进行删除,增加,时间上为O(1)。顺序表在增加元素与删除元素的时候,需要进行大量的挪动元素,时间上为O(N)。
链表在访问元素的时候需要进行遍历,时间上为O(N)。顺序表在访问时候可以随机访问下标时间为O(1)。
顺序表的元素查找因为可以直接访问时间上为O(1),链表需要一直进行遍历,比顺序表慢得多。
1.3从数据结构上比较
链表是由一段不连续的地址节点组成的线性表,每个节点可以是一个或多个连续的单元块,分配在堆区上,需要手动开辟与释放。
顺序表的静态顺序表由定长数组组成,在地址上为连续的,分配在栈区上。动态顺序要为动态开辟的空间,分配在堆区上。
3.顺序表与链表的选取
由与顺序表具有随机下标访问的功能,在查找元素方面远远大于链表,所以需要进行元素查找的时候选用顺序表。
链表在对于增删方面,因为不需要遍历,可以直接进行插入或者删除,在时间上为O(1),所以需要进行增删的时候选用链表