线性表的类型定义
线性表是最简单、也是最基本的一种线性数据结构。它有两种存储表示方法:顺序表和链表,它的主要基本操作是插入、删除和查找。
线性表是n(n>=0)个数据元素的有限序列,表中各个数据元素具有相同特性,即属同一数据对象,表中相邻的数据元素之间存在“序偶”关系。通常将线性表记做
(a1,a2, …,ai-1,ai,ai+1,…,an-1,an)
则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱.
线性表中的个数n(n>=0)定义为线性表的长度,n=0时称为空表。在非空表中每个数据元素都有一个确定的位置,如用ai表示数据元素,则i称为数据元素ai在线性表中的位序。
特征:
1.集合中必存在唯一的一个“第一元素”。
2.集合中必存在唯一的一个 “最后元素” 。
3.除最后一个元素之外,均有唯一的后继(后件)。
4.除第一个元素之外,均有唯一的前驱(前件)。
线性表的基本操作
在应用程序中经常会用到线性表,每一个具体的应用所涉及的线性表的操作不尽相同。综合各种情况,对线性表经常进行的基本操作有:
基本操作实例
现在我们举三个栗子来练习一下这些基本操作:
1、假设利用两个线性表 La 和 Lb 分别表示两个集合 A 和 B(线性表中的数据元素即为集合中的成员),求一个新的集合 A=AUB。
具体的操作步骤为:
(1)从线性表 Lb 中取得一个数据元素;
(2)依该数据元素的值在线性表 La 中进行查访;
(3)若线性表 La 中不存在和其值相同的数据元素,则将从 Lb 中删除的这个数据元素插人到线性表 La 中;重复以上操作直至 Lb 为空表止。
void union (List &La, List &Lb)
{
// 将线性表 Lb 中所有在 La 中不存在的数据元素插人到 La 中
// 算法执行结束后,线性表 Lb 不再存在
La_len= Listlength (La) ;// 求线性表 La 的长度
while (!ListEmpty (Lb)) // Lb 表的元素尚未处理完
{
ListDelete(Lb,1, e) ;// 从 Lb 中删除第一个数据元素赋给 e
if (!LocateElem(La, e))
ListInsert (La,++La_len,e) ;
// 若 La 中不存在值和 e 相等的数据元素
// 则将它插入在 La 中最后一个数据元素之后
}// while
DestroyList (Lb) ;// 销毁线性表 Lb
)// union
2、已知一个非纯集合 B(即集合 B 中可能有相同元素),试构造一个纯集合 A,使A 中只包含 B 中所有值各不相同的成员。
具体操作步骤为:
(1)构造一个空的线性表 La;
(2)从线性表 Lb 中取得一个数据元素;
(3)依该数据元素的值在线性表 La 中进行查访;
(4)若线性表 La 中不存在和其值相同的数据元素,则将从 Lb 中删除的这个数据元素插入到线性表 La 中:重复(2)至(4)的操作直至Lb 为空表止。
void purge(List &La,List &Lb)
{
// 构造线性表 La,使其只包含 Lb 中所有值不相同的数据元素,
//操作完成后,线性表 Lb 不再存在
InitList(La); 创建一个空的线性表La
La_len=0;
while(!ListEmpty(Lb))//Lb表的元素尚未处理完
{
ListDelete(Lb,1,e)//从Lb中删除第一个数据元素赋给e
if (!LocateElem(La, e))
ListInsert (La,++La_len,e) ;// 若 La 中不存在值和 e 相等的数据元素,则插入进去
}//while
DestroyList (Lb) ;// 销毁线性表 Lb
}//purge
3、判别两个集合 A 和 B 是否相等
两个集合相等,指的是这两个集合中包含的成员相同。当以线性表表示集合时,则要求分别表示这两个集合的线性表 La 和 Lb 不仅长度相等,所含数据元素也必须一一对应。值得注意的是,两个“相同”的数据元素在各自的线性表中的“位序”不一定相同。
具体操作步骤为:先构造一个和线性表 La 相同的线性表 Lc,然后对 Lb 中每个数据元素,在 Lc 中进行查询,若存在则从 Lc 中删除之,显然,当 Lb 中所有元素检查完毕时,“Lc 为空”是两个集合相等的标志。上述算法中构造的线性表 Lc 是一个辅助结构,它的引入是为了在程序执行过程中不破坏原始数据 La,因此在算法的最后应销毁 Lc 这个辅助结构。
bool isequal (List La, List Lb)
{
// 若线性表 La 和 Lb 不仅长度相等,且所含数据元素也相同,则返回 TRUE
// 否则返回 FALSE
La_len= ListLength (La) ;
Lb_len= ListLength (Lb) ; //求表长
if (La_len != Lb_len)
return FALSE;
else
{
InitList (Lc) ;// 构造空线性表 Lc
for (k= 1; k< = La_len; k++) // 生成线性表La的“复制品”Lc
(
GetElem(La,k,e) ;
ListInsert (Lc,k,e) ;
)//for
found=TRUE;
for(k=1;k<=Lb_len;k++)
{
GetElem(Lb,k,e);//取Lb中第k个元素
i=LocateElem(Lc,e);//在Lc中进行查询
if(i==0)
found=FALSE; La中不存在和该数据元素相同的元素
else
ListDelete(Lc,i,e); 从 Lc中删除该数据元素
}//for
if(found&&ListEmpty(Lc))
return TRUE;
else
return FALSE;
}//else
}//isequal