数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章线性表
2.1.1 线性表的定义
特性:设 A=(a1, a2, ... , ai -1, ai , ai+1, …, an )是一线性表 线性表的数据元素可以是各种各样的,但同一线性表中的元素必须是同一类型的;
在表中 ai-1 领先于ai ,ai 领先于ai+1 ,称ai-1 是ai 的直接前驱,ai+1 是ai 的直接后继;
在线性表中,除第一个元素和最后一个元素之外,其他元素都有且仅有一个直接前驱,有且仅有一个直接后继,具有这种结构特征的数据结构称为线性结构。线性
表是一种线性数据结构;
线性表中元素的个数n 称为线性表的长度,n=0 时称为空表;
ai是线性表的第i 个元素,称i 为数据元素ai 的序号,每一个元素在线性表中的位置,仅取决于它的序号;
【例2-3 】已知一个非纯集合B(即集合B中可能有相同元素),试构造一个纯集合A,使A中只包含B中所有值各不相同的成员。
【分析】假设仍以线性表表示集合,则此问题和例2-2类似,即构造线性表La,使其只包含线性表Lb中所有值不相同的数据元素。所不同之处是,操作实施之前,线性表La不存在,则操作的第一步首先应该构造一个空的线性表,之后的操作步骤和例2-2相同。
【具体步骤】
(1)构造一个空的线性表La;
(2)从线性表Lb中取得一个数据元素;
(3)依该数据元素的值在线性表La中进行查访;
(4)若线性表La中不存在和其值相同的数据元素,则从Lb中删除的这个数据元素插入到线性表La中。
(5)重复(2)至(4)的操作直至Lb为空表为止。
【具体算法】___运行后Lb仍保持原先的值
void purge (List &La, List &Lb)
{
InitList (La); La_len = 0; //创建一个空的线性表La
Lb_len = ListLength (Lb); //求线性表Lb的长度
for (i = 1; i <= Lb_len; i++) //Lb表中的元素尚未处理完
{
GetElem (Lb, i, &e); //从Lb中取出第i个元素,并将其值赋给e
if (!LocateElem(La, e)) //La中不存在值为e的数据元素
ListInsert (La, ++La_len, e); //将该元素e插入到La中最后一个元素后
}
}
2.2 线性表的顺序表示和实现
线性表的顺序存储结构,就是用一组连续的内存单元依次存放线性表的数据元素。
说明:1. 在顺序存储结构下,线性表元素之间的逻辑关系,通过元素的存储顺序反映(表示)出来;
·2. 假设线性表中每个数据元素占用 t 个存储单元,那么,在顺序存储结构中,线性表的第i个元素的存储位置与第1个元素的存储位置的关系是:
Loc(ai ) = Loc( a1 )+ ( i – 1) t
SqList :类型名,
SqList类型的变量是结构变量,它的四个域分别是:
*elem:存放线性表元素的一维数组基址;其存储空间在初始化操作(建空表)时动态分配; length:存放线性表的表长;
listsize:用于存放当前分配(存放线性表元素)的存储空间的大小。
incrementsize:约定增补空间量(当线性表空间不够时)
1.初始化操作
功能:构造一个空的顺序表。
方法:首先要按需为其动态分配一个存储区域,然后设其当前长度为0。
2.查找元素操作
功能:在顺序表L中查找其值与给定值e相等的数据元素的位序,如果未找到,则返回0。方法:从第一个元素起,依次和e相比较,直到找到一个其值与e相等的数据元素,则返回它在线性表中的“位序”;或者查遍整个顺序表都没有找到其值和e相等的元素后返回0。3.插入元素操作
功能:在顺序表L 中的第 i ( 1≦i≦L.length+1)个数据元素之前插入一个新元素x。
插入前线性表为:
(a1, a2, a3,…, ai-1 ,ai,,… an )
插入后,线性表长度为L.length+1, 线性表为:
(a1, a2, a3,…, ai-1 , x, ai,,… an )
一般情况下,在顺序表L中第i个元素之前插入一个新的元素时,首先需将L.elem[L.length-1]至L.elem[i-1]依次往后移动一个位置。显然,此时顺序表的长度应该小于数组的最大容量;否则,在移动元素之前,必须先为顺序表“扩大数组容量”。
一般情况下,当插入位置i=L.length+1时,for循环的执行次数为0,即不需要移动元素;反之,若i=1,则需将顺序表中全部(n个)元素依次向后移动。然而,当顺序表中数据元素已占满空间时,不论插入位置在何处,为了扩大当前的数组容量,都必须移动全部数据元素,因此,从最坏的情况考虑,顺序表插入算法的时间复杂度为O(n),其中n为线性表的长度。
4.删除元素操作
功能:在顺序表L 中删除第 i ( 1≦i≦L.length)个数据元素。
删除前线性表为:
(a1, a2, a3,…, ai-1 ,ai, ai+1,… an )
删除后,线性表长度为L.length-1, 线性表为:
(a1, a2, a3,…, ai-1 , ai+1,,… an )
一般情况下,从顺序表L中删除第i个元素时,需将L.elem[i]至L.elem[L.length-1]的元素依次往前移动一个位置。
删除算法的主要步骤:
1)若i 不合法或表L空,算法结束,并返回 0;否则转2)
2)将第i个元素之后的元素(不包括第i个元素)依次向前移动一个位置;
3)表长 - 1
和插入的情况相类似,当删除的位置i=L.length时,算法中for循环的执行次数为0,即不需要移动元素;反之,若i=1,则需将顺序表中从第2个元素起至最后一个元素(共n个元素)依次向前移动一个位置。因此,顺序表删除元素算法的时间复杂度也为O(n),其中n 为线性表的长度。