第二章线性表——2.1:线性表类型定义
线性表可以说是数据结构中最常用和最简单的一种数据结构了。
线性表,可以说类似于 1 2 3 4 5 6这样的排序,这里面有6个元素,所以长度是6,当元素个数为0的时候我们称其为空表。再看,因为2的前面是1,所以1就是2的直接前驱元素,1的后面是2,所以2就是1的直接后驱元素,在上述的线性表中,由于1前面没有元素,所以1没有前驱,同理6没有后驱。
然后读者在掌握最基本线性表的子程序后才能进行下一步学习。
我们在解决线性表的问题的时候经常遇到把两个或两个以上的线性表合成一个表,或者把一个表拆成两个或者两个以上的表。
例2.1我们用线性表LA,LB分别表示集合A,B,然后要求我们把A改成A和B的并集,即A=A∪B。
下面算法的思想就是把所有LB中的不在LA中的元素插入LA(后序的所有算都是以伪码形式表示)
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(!locataelem(la, e, equal)) listinsert(la, ++la_len, e);//locataelem(la, e, equal)是拿e与la中的元素记性比较看la中是否有与e相等的元素,若没有直接在La末尾插入
}
}
2.1的情况是用于线性表无序排列的时候,线性表有序排列情况如下。
例2.2 LA,LB这两个线性表中的元素都是非递减有序排列,我们要把这两个线性表合成一个洗的呢非递减有序排列表LC。
void mergelist(list la, list lb, list& lc)
{
initlist(lc);//构建新表
i = j = 1;
k = 0;
la_len = listlength(la);
lb_len = listlength(lb);//求出两个线性表的长度
while ((i <= la_len) && (lb < +lb_len))
{
getelem(la, i, ai);
getelem(lb, j, bj);
if (ai <= bj)
{
listinsert(lc, ++k, ai);
++i;
}
else
{
listinsert(lc, ++k, bj);
++j;
}
}
while (i <= la_len )
{
getelem(la, i++, ai);
listinsert(lc, ++k, ai);
}
while (j <= lb_len)
{
getelem(lb, j++, bj);
listinsert(lc, ++k, bj);
}
}