数据结构最简单的表述形式:线性表又称线性结构

线性表是一种最简单的数据结构,是一种特定关系的数据元素的逻辑结构:线性结构。如26个英文字母组成的字母表(A、B、C、...、Z)就是线性结构,线性表的一种直观理解。

线性表的逻辑定义和基本特征

线性表在逻辑上的定义为:由n(n≧0)个数据元素(结点)组成的有限序列。线性表的长度是所含结点的个数。空表是表长为0的线性表。

线性表的基本特征。因为线性表是一组数据元素的有序集,所以线性表(线性结构)具有如下特征:

-集合中必然存在一个唯一的“第一元素”,它没有直接前驱元素,且有且只有一个直接后继元素;

-集合中必然存在一个唯一的“最后元素”,它没有直接后继元素,且有且只有一个直接后继元素;

-除“第一元素”和“最后元素”外,其余的结点都有且只有一个直接的前驱元素和一个直接的后继元素。

上述线性表的定义及特征与我们此前文章中介绍到的数组定义及特征相似,所以我们也可以说数组是一个顺序排列的线性表。

线性表的类型定义

线性表:线性表是n个元素的有序序列,是最常用且最简单的一种数据结构。其逻辑结构如下:

如文中前述26个英文字母(A、B、C、...、Z)组成的英文字母表中,数据元素都是同类型(字母),元素之间的关系是线性关系。

如下表例子:

上表中数据元素都是相同类型(记录),元素间的关系是线性关系。同一线性表中的元素必定具有相同特性。

综合上述两个例子我们可以得出:线性表中的数据元素可以是各种各样的,但同一个表中的元素必须具有相同的特性;相邻数据元素之间存在序偶关系;线性表中每一个元素都有确定的位置,如a1是第一个数据元素,ai是第i个数据元素。

抽象数据类型的线性表定义

ADT List {

数据对象:

D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 }

{称 n 为线性表的表长; 称 n=0 时的线性表为空表。}

数据对象:

R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }

{设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序。}

基本操作:

结构初始化操作

结构销毁操作

饮用型操作

加工型操作

} ADT List

下面分别介绍一下定义当中的名词

初始化操作:InitList( &L ),操作结果:构造一个空的线性表L。

销毁操作:DestroyList( &L ),初始条件:线性表L已存在,操作结果:销毁线性表 L

引用型操作: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 );ListInsert( &L, i, e );ListDelete(&L, i, &e);

我们利用上述定义的线性表可以实现以下操作:

例一:假设:有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合A=A∪B。

上述问题可演绎为要求对线性表作如下操作:扩大线性表 LA,将存在于线性表LB 中而不存在于线性表 LA 中的数据元素插入到线性表 LA 中去。

操作步骤:

-从线性表LB中取出一个数据元素;GetElem(LB, i)→e

-依值在线性表LA中进行查访;LocateElem(LA, e, equal( ))

-若不存在,则插入之。ListInsert(LA, n+1, e)

-重复上述过程,直到访问到LB中所有元素。

void union(List &La, List Lb) {

La_len = ListLength(La); // 求线性表的长度

Lb_len = ListLength(Lb);

for (i = 1; i <= Lb_len; i++) {

GetElem(Lb, i, e);

// 取Lb中第i个数据元素赋给e

if (!LocateElem(La, e, equal( )) )

ListInsert(La, ++La_len, e);

// La中不存在和 e 相同的数据元素,则插入之

}

} // union

例二:已知一个非纯集合 B,试构造一个纯集合 A,使 A中只包含 B 中所有值各不相 同的数据元素。仍选用线性表表示集合。

从集合 B 取出物件放入集合 A要求集合A中同样物件不能有两件以上,因此,算法的策略应该和例一相同。

void union(List &La, List Lb) {

InitList(La);

// 构造(空的)线性表LA

La_len=ListLength(La); Lb_len=ListLength(Lb);

for (i = 1; i <= Lb_len; i++) {

GetElem(Lb, i, e);

// 取Lb中第 i 个数据元素赋给 e

if (!LocateElem(La, e, equal( )) )

ListInsert(La, ++La_len, e);

// La中不存在和 e 相同的数据元素,则插入之

}

} // union

这篇文章是从定义入手,介绍了线性表以及线性表的基础应用,下一篇文章将通过顺序映像和链式映像对线性表做进一步的介绍。

知识无限,小编在文章编辑过程中难免出现不尽人意的地方,欢迎大家批评指正,小编也将不断积累完善自己,让我们共同进步。

举报
评论 0