(一)线性表

2018-07-05  本文已影响21人  Theodore_Pratt

线性表(linear_list):n个数据元素的有限序列。如字母表、成绩表、价目表,图书索引表等。

  • 线性表中的元素可以是各种各样,但是同一线性表中的元素必定有相同特性,即属于同一数据对象,相邻元素之间存在着序偶关系。
  • 可以理解为多个点用线连起来
    o------o------o------o------o------o------o

线性表是一个相当灵活的数据结构,它的长度可根据需要增长或缩短,即对线性表的数据元素不进可以进行访问,还可以插入删除。

算法示例:

// 获取长度
la_len = ListLength(La); 
lb_len = ListLength(Lb);
for (i = 1; i <= lb_len; i++) {
  GetElem(Lb, i, e); // 取Lb中的第i个元素赋给e
  // La中不存在相同的元素就插入到La中
  if (!LacateElem(La, e, equal)) ListInsert(La, ++la_len, e)
}

思路:遍历线性表LA,依次取得元素,从线性表LB中依次取得每个元素,并依值在线性表LA中进行查询对比,若不存在,则插入之。

LA = (3, 5, 8, 11);
LB = (2, 6, 8, 9, 11, 15, 20);
则
LC = (2, 3, 5, 6, 8, 8, 9, 11, 15, 20);

思路:先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。为使LC中元素按值非递减有序排列,可设两个指针ij分别指向LA和LB中某个元素,若设i当前所致的元素为a,j档期所致的元素为b,则当应插入到LC中的元素C为:

a <= b 时,c = a
a > b 时,c = b

显然,指针ij的初始值为1,在所指元素插入LC之后,在LA或LB中顺序后移,上诉归并算法如下所示:

InitList(Lc); // 初始化Lc
i = j = 1, k = 0;
// 获取la和lb的长度
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 (i <= lb_len) {
    GetElem(Lb, j, bj); 
    ListInsert(Lc, ++k, bj);
}

算法中含有3个(while)循环语句,但只有当i和j均指向表中实际存在的元素时,才能取得数据元素的值并进行比较;并且当其中一个线性表的元素均已插入到线性表LC中后,只要将另一个线性表中剩余元素依次插入即可。因此,对于每一组具体的输入(LA或LB),后两个(while)循环语句只执行一个循环体。

上一篇下一篇

猜你喜欢

热点阅读