合并顺序表

发布时间 2023-09-09 10:27:55作者: DawnTraveler

例2.3

有两个顺序表LA和LB,其元素均为非递减有序排列,编写算法,将它们合并成一个顺序表LC,要求LC也是非递减有序排列。
例如,LA=(2,2,3),LB=(1,3,3,4),则LC=(1,2,2,3,3,3,4)。

【算法思想】设表LC是一个空表,为使LC也是非递减有序排列,可设两个指针i、j分别指向表LA和LB中的元素,若LA.elem[i]>LB.elem[j],则当前先将LB.elem[j]插入到表LC
中,若LA.elem[i]≤LB.elem[j],则当前先将LA.elem[]插入到表LC中,如此进行下去,直到其中一个表被扫描完毕,然后再将未扫描完的表中剩余的所有元素放到表LC中。

我的代码:

#include <stdio.h>
#define MAX 100
typedef struct
{
    int element[MAX];
    int last;
} SeqList;

void initSeqList(SeqList *list)
{
    list->last = -1;
}

void insertList(SeqList *list, int value)
{
    if (list->last <= MAX - 1)
    {
        list->last++;
        list->element[list->last] = value;
    }
    else
        printf("顺序表已满,无法继续存储");
}

void printList(SeqList list)
{
    if (list.last == -1)
        printf("顺序表为空");
    else
    {
        printf("该表元素为:");
        for (int i = 0; i <= list.last; i++)
            printf("%d ", list.element[i]);
    }
}

void mergeList(SeqList LA, SeqList LB, SeqList *LC)
{
    int j = 0, k = 0;
    LC->last = LA.last + LB.last + 1;
    for (int i = 0; i <= LC->last; i++)
    {   
        
        if (LA.element[j] < LB.element[k])
            LC->element[i] = LA.element[j++];
        else
            LC->element[i] = LB.element[k++];
    }
}

int main()
{
    SeqList LA, LB, LC;
    initSeqList(&LA);
    initSeqList(&LB);
    initSeqList(&LC);
    insertList(&LA, 2);
    insertList(&LA, 2);
    insertList(&LA, 3);
    insertList(&LB, 1);
    insertList(&LB, 3);
    insertList(&LB, 3);
    insertList(&LB, 4);
    mergeList(LA, LB, &LC);
    printList(LC);
    return 0;
}

结果错误:

原因:

未考虑到当某个顺序表被遍历完之后,之后存取的随机数依旧小于另一个顺序表的情况。
增加判断:

void mergeList(SeqList LA, SeqList LB, SeqList *LC)
{
    int j = 0, k = 0;
    LC->last = LA.last + LB.last + 1;
    for (int i = 0; i <= LC->last; i++)
    {

        if (j <= LA.last && k <= LB.last)
        {
            if (LA.element[j] < LB.element[k])
                LC->element[i] = LA.element[j++];
            else
                LC->element[i] = LB.element[k++];
        }

        else
        {
            if (j <= LA.last)
                LC->element[i] = LA.element[j++];
            else
                LC->element[i] = LB.element[k++];
        }
    }
}

总结:

1.这里比较关键的一点是理解LC->last = LA.last + LB.last + 1;

可以理解为在LA顺序表的基础上加上了LB元素的个数,元素个数=下标+1

2.注意这里你设置的是MAX 100,所以实际上你定义这些数组时,这些对应的存储空间都存上了随机数

而不是说只有你自己存进去的数,所以要限制遍历顺序表元素的个数