美文网首页
(一)线性表

(一)线性表

作者: Theodore_Pratt | 来源:发表于2018-07-05 22:26 被阅读21次

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

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

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

    算法示例:

    • 1. 有两个线性表LA和LB,合并两个线性表LA=LA U LB(无重复元素)。
      伪代码:
    // 获取长度
    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中进行查询对比,若不存在,则插入之。

    • 2. 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列
      如:
    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)循环语句只执行一个循环体。

    相关文章

      网友评论

          本文标题:(一)线性表

          本文链接:https://www.haomeiwen.com/subject/lgnyuftx.html