线性结构包含:线性表、堆栈、队列、字符串、数组等,下面着重讲线性表
定义:线性表是一种线性结构,是具有相同特性的n(n>=0)个数据元素组成的有穷序列
特点:1.一对一的关系,只有一个首节点和尾节点
2.除了首尾节点外,其他节点只有一个直接前驱和一个直接后继
基本操作 :初始化,求表长,读元素,定位,插入,删除
ADT List {
数据对象:D={ ai | ai ElemSet, i=1,2,…n, n0 }
数据关系: R={ <ai-1,ai> | ai-1,ai D, i=2,3,…n}
基本运算:
InitList(&L); //初始化线性表,构造空线性表
DestroyList(&L); //销毁线性表
Length(L); //求线性表长度
GetElem(L,i,&e); //获得线性表中第i个元素
LocateElem(L,e,compare()); //查找线性表中和e满足关系”compare”的元素
InsertElem(&L,i,e); //在线性表的位置i插入一个元素e
DeleteElem(&L,i,&e); //删除线性表位置i的元素,被删除元素的值放到e中
} ADT List
线性表的存储结构分为顺序存储和链式存储
顺序表:将表中的节点依次存放在计算机内存中一组连续的存储结构
插入操作:例如将e插入到a4和a5之间的操作
(1)元素a7向后移动一个位置
(2)元素a6向后移动一个位置
(3)元素a5向后移动一个位置
(4)将元素e插入到空位置上
删除操作:例如将a5从表中删除
(1)判断参数是否合理
(2)在存储空间上找到删除的为位置
(3)删除a5,将后面的元素位置依次向前移动
(4)把表的长度减1
效率分析:以删除运算为例
算法执行时间主要消耗在删除后元素的移动上,而移动元素的个数与删除位置i有关
最好情况: 在表尾删除,不移动元素,T(n)=O(1)
最坏情况: 在表头删除,移动n-1个元素,T(n)=O(n)
平均复杂度:T(n)=O(n)
算法空间复杂度不需要额外空间:S(n) = O(1)
顺序表的优缺点
优点:
不需要额外的存储空间来表示元素间的逻辑关系
可以随机地存取表中的任意一个元素
缺点:
插入和删除元素时要移动大量的元素
必须事先进行空间分配,表的容量不易扩充
链式表:包括单链表,循环链表和双向循环链表。指用任意的存储单元存放线性表中的元素,每个元素与其直接前驱和(或)直接后继之间的关系用指针来存储。
单链表:链表中,如果每个结点中只包含一个指针域,则称之为线性链表或单链表。
插入操作:第i个位置上插入新的结点
(1)找到第i-1个元素所在节点
(2)申请一个结点s并填入e值
(3)修改s的指针域指向p的下一个节点
(4)修改p的指针域指向s
删除操作:第i个位置上删除结点
(1)找到第i-1个元素所在节点
(2)增设临时指针q指向p的下一结点(待删除的结点)
(3)修改结点p的指针域,指向第i+1个结点
(4)删除结点q,释放内存空间。
链表的优缺点
优点:
插入、删除时无须移动元素,只需修改指针
根据需要申请存储空间,且不要求连续的存储空间
缺点:
对表中的元素只能进行顺序访问
用指针指示元素之间的逻辑关系(直接前驱、后继),存储空间利用率低
循环链表和双链表:
总结: