目录
线性表的定义
线性表(List):零个或多个数据元素的有限序列。首先它是一个序列。元素之间是有顺序的。 若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。数据元素之间的关系是一对一的关系。其次,线性表强调是有限的。线性表元素的个数n(n≥0)定义为线性表的长度,当n=0时,成为空表。
线性表的两种存储结构
顺序存储方式
线性表的顺序存储结构,指的是用一段地址连续的存储单元以此存储线性表的数据元素。也被称作“静态数据结构(Static Data Structure)”,它在编译时就给相关的变量分配好内存空间。例如数组类型就是一种典型的静态数据结构。
优点 | 缺点 | |
顺序存储 | 1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间。 2.可以快速地存储表中任一位置的元素。 | 1.插入和删除操作需要移动大量元素。 2.当线性表长度变化较大时,难以确定存储空间的容量。 3.造成存储空间的“碎片”。 |
链式存储方式
为了解决顺序存储在插入和删除时需要移动大量元素的缺点,于是就有了链式存储方式。
它使用不连续的内存空间存储具有线性表特性的数据。也被称作“动态数据结构(Dynamic Data Structure)”,它的基本精神就是:让内存的使用根据弹性,可在程序执行期间根据用户的设置与需求,适当给变量分配所需要的内存空间。
在顺序存储结构中,每个数据元素只需要存数据元素信息就可以了。但在链式存储结构中,除了要存数据元素信息之外,还要存储它的后继元素的存储地址。我们把存储数据元素信息的域成为数据域,把存储直接后继位置的域成为指针域(C、C++的指针)。指针域中存储的信息被称做指针或链。这两部分信息组成数据元素的存储映像,成为节点(Node)。n个节点链结成一个链表,即为线性表的链式存储结构。
优点 | 缺点 | |
链式存储 | 1.数据的插入和删除都相对方便,不需要移动大量数据。 2.因为动态数据结构的内存分配是在程序执行时才进行分配的,所以不需要事先声明,这样能充分节省内存。 | 1.设计数据结构时比较麻烦。 2.在查找数据时,也无法像静态数据一样随机读取,必须按顺序找到该数据为止。 |
顺序存储和链式存储两种方式的相关比较
顺序存储(静态分配内存) | 链式存储(动态分配内存) | |
内存分配 | 编译阶段 | 运行阶段 |
内存释放 | 不需要释放,程序结束时自动归还给系统 | 程序结束前必须释放分配的内存空间,否则造成内存“泄露”(Memory Leak) |
程序运行性能 | 较高。(程序编译阶段已确定所需分配的内存容量)。 | 较低。(因为所需内存要到程序执行时才能分配) |
指针遗失 | 没有此问题 | 若指向动态分配空间的指针在未释放该地址空间之前,又指向了别的内存空间时,则原本所指向的内存空间将无法被释放,而造成内存“泄露”。 |