第二章 线性表
线性结构是一个数据元素的有序(次序)集
线性结构的基本特征:
1,集合中必存在唯一的一个”第一元素”;
2,集合中必存在唯一的一个”最后元素”;
3,除最后元素在外,均有唯一的后继;
4,除第一元素之外,均有唯一的前驱。
2.1线性表的类型定义(抽象数据类型)
基本操作中 的ListEmpty(L),ListLength(L),PriorElem(L.cur_e,&pre_e),NextElem(L.cur_e, &next_e),GetElem(L,i,&e),LocateElem(L,e,compare()),ListTraverse(L.visit ())为引用型操作,特点为操作结果不改变线性表原有结构。
ClearList(&L),PutElem(L,i,&e),ListInsert(&L,i,e),ListDelete(&L,i,&e)为加工型操作,特点为操作结果改变线性表原有结构。
2.2线性表类型的实现(顺序、链式)
--顺序映象:用一组地址连续的存储单元依次存放线性表中的数据元素(数据元素之间的存储关系是隐含的)。
LOC(ai)=LOC(ai-1)+C(一个数据元素所占存储量)
=LOC(a1)+(i-1)*C (所有元素的存储位置均取决于第一个数据元素的存储位置)
(基地址)
顺序映像的C语言描述中的三个要素:存储空间基址,当前长度,当前分配的存储容量。
插入和删除的期望值各为(n+1)/2,(n-1)/2,时间复杂度O(ListLength(L))
优点:可对每个数据元素进行随机存取,表长为显值
缺点:在进行插入或删除元素时,要进行元素的移动,每进行一次元素的插入或删除大至要移动整个表的一半的元素。
2.3线性表类型的实现
--链式映象
一,单链表(线性链表):用一组地址任意的存储单元存放线性表中的数据元素。
以元素(数据元素的映象)+指针(指示后继元素存储位置)=结点(表示数据元素)
以”结点的序列”表示线性表--链表
二,结点和单链表的C语言描述
三,单链表操作的实现
用指向头结点的指针表示单链表(即用第一个数据元素的地址作为基地址)实现线性表的操作时,存在的问题: 时间复杂度O(ListLength(L))
1,单链表的表长是一个隐含的值;
2,在单链表的最后一个元素最后插入元素时,需遍历整个链表;
3,在链表中,元素的“位序”概念淡化,结点的“位置”概念强化。
为克服上述问题,改进链表的设置:
1,增加“表长”,“表尾指针”和“当前位置的指针”三个数据域;
2,将基本操作由位序改为指针;
四,其它形式的链表
1,双向链表:结点结构:数据域;指向前驱的指针域;指向后驱的指针域。(空链表时,前驱,后驱指针均为空)(双循环链表为空时前驱,后驱指针均指向第一个结点)
2,循环链表:尾指针指向第一个结点(头结点)。
2.4一元多项式的表示(用线性表存储一元多项式的系数和和系数相应的指数)
一般来说,如果线性表的元素之间结构关系变化不大时,用顺序表,如线性表使用情况中结构关系经常发生变化,就用链表比较好。