几个线性表的例子

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

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

1.从线性表LB中依次取得每个数据元素; GetElem(LB, i)→e

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

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

void union(List &La, List Lb) {

// 将所有在线性表Lb中但不在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_len1, e); // La中不存在和 e 相同的数据元素,则插入之 } } // union [color=Green]例2-2 已知一个非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素。

void purge(List &La, List Lb) {

// 已知线性表Lb中的数据元素依值非递减有序排列(Lb是有序表),

// 构造线性表La,使其只包含Lb中所有值不相同的数据元素

InitList(LA);

La_len = ListLength(La);

Lb_len =ListLength(Lb); // 求线性表的长度

for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e if(!equal (en, e)) { ListInsert(La, ++La_len, e); en = e; } // La中不存在和 e 相同的数据元素,则插入之 } } // purge [color=Green]例2-3 归并两个“其数据元素按值非递减有序排列的”线性表LA和LB,求得线性表LC也具有同样特性

设 La = (a1, …, ai, …, an)

Lb = (b1, …, bj, …, bm)

Lc = (c1, …, ck, …, cm+n)

则 Ck = k = 1, 2, …, m+n

1.分别从LA和LB中取得当前元素ai和bj;

2.若ai≤bj,则将ai插入到LC中,否则将bj插入到LC中。

void MergeList(List La, List Lb, List &Lc) {

// 已知线性表La和Lb中的元素按值非递减排列。

// 归并La和Lb得到新的线性表Lc,

// Lc的元素也按值非递减排列。

InitList(Lc);

i = j = 1; k = 0;

La_len = ListLength(La);

Lb_len = ListLength(Lb);

while ((i <= La_len) && (j <= Lb_len)) { // La和Lb均非空 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); } } // merge_list