上一篇《数据结构和算法之时间复杂度和空间复杂度》中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明。这一篇主要介绍线性表。html
线性表属于数据结构中逻辑结构中的线性结构。回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构、几何结构、树形结构和图形结构四大结构。其中,线性表就属于线性结构。剩余的三大逻辑结构从此会一一介绍。算法
线性表(List):由零个或多个数据元素组成的有限序列。windows
注意:数组
1.线性表是一个序列。数据结构
2.0个元素构成的线性表是空表。数据结构和算法
3.线性表中的第一个元素无前驱,最后一个元素无后继,其余元素有且只有一个前驱和后继。工具
4.线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。post
若将线性表记为(a1,…,ai-1,ai,ai+1,…an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。优化
InitList(*L): 初始化操做,创建一个空的线性表L。 url
ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,不然返回false。
ClearList(*L): 将线性表清空。 GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e。
LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,若是查找成功,返回该元素在表中序号表示成功;不然,返回0表示失败。
ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e。
ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。
ListLength(L): 返回线性表L的元素个数。
对于不一样的应用,线性表的基本操做是不一样的,上述操做是最基本的。
对于实际问题中涉及的关于线性表的更复杂操做,彻底能够用这些基本操做的组合来实现。
咱们知道,数据结构分为逻辑结构和物理结构,逻辑结构分为集合结构、线性结构、树形结构和图形结构四大类。物理结构分为顺序存储结构和链式存储结构。我在以前写的《数据结构和算法》中已经介绍过。
线性表是线性结构的一种,那么线性表固然也有物理结构,也就是说,线性表有两种,分别是顺序结构的线性表(叫作顺序表)和链式结构的线性表(叫作链表)。
顺序表是指顺序存储结构的线性表,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
顺序表表如今物理内存中,也就是物理上的存储方式,事实上就是在内存中找个初始地址,而后经过占位的形式,把必定的内存空间给占了,而后把相同数据类型的数据元素依次放在这块空地中。注意,这块物理内存的地址空间是连续的。
举 个例子,好比C语言中的基本变量的存储就是连续的存储在内存中的,好比声明一个整数i,在64位系统中整数i在内存中占8字节,那么系统就会在内存中为这 个整型变量分配一个长度为8个字节的连续的地址空间,而后把这个i的二进制形式从高地址向低地址存储,长度不足时候,最高位用0补齐。
#define MAXSIZE 20 // 顺序表的最大存储容量 typedef int ElemType; // 顺序表存储的数据类型 typedef struct { ElemType data[MAXSIZE]; // 用数组表示顺序表 int length; // 线性表当前长度 } SqList;
经过上面用结构体定义顺序表,咱们能够看出顺序表的封装须要三个属性:
代码实现:
思路以下:
1.若是插入位置不合理,抛出异常;
2.若是线性表长度大于等于数组长度,则抛出异常或动态增长数组容量;
3.从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
4.将要插入元素填入位置i处;
5.线性表长+1。
代码实现:
思路以下:
由以上代码能够看出:
前面咱们讲的线性表的顺序存储结构,它最大的缺点就是插入和删除时须要移动大量元素,这显然就须要耗费时间。
那咱们能不能针对这个缺陷或者说遗憾提出解决的方法呢?要解决这个问题,咱们就得考虑一下致使这个问题的缘由!
为何当插入和删除时,就要移动大量的元素?
缘由就在于相邻两元素的存储位置也具备邻居关系,它们在内存中的位置是紧挨着的,中间没有间隙,固然就没法快速插入和删除。
线性表的链式存储结构的特色是用一组任意的存储单元存储线性表的数据元素,这组存储单元能够存在内存中未被占用的任意位置。
链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。
也就是说除了存储其自己的信息外,还需存储一个指示其直接后继的存储位置的信息。
咱们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。
指针域中存储的信息称为指针或链。
这两部分信息组成数据元素称为存储映像,或称为结点(Node)。
n个结点连接成一个链表,即为线性表(a1, a2, a3, …, an)的链式存储结构。
由于此链表的每一个结点中只包含一个指针域,因此叫作单链表。
对于线性表来讲,总得有个头有个尾,链表也不例外。咱们把链表中的第一个结点的存储位置叫作头指针,最后一个结点指针为空(NULL)。
单链表是线性表中最具表明性的一种,下一篇文章中,本人将会拿出一章来介绍单链表,敬请期待!
图片来源参考自:鱼C工做室。感谢鱼C工做室贡献出了这么好的图片。
如非特别说明,笔者全部文章都是原创文章。若是您喜欢这篇文章,转载请注明出处。若是您对数据结构感兴趣,请关注我,后续会更新大量精品文章供你们参考!
PS:本篇文章在简书也有同步更新,你们也能够移步简书关注本人,后续会更新更多精品文章!
简书地址:http://www.jianshu.com/users/93131dfba96a/latest_articles