合并两个顺序表

合并两个顺序表

已知有两个顺序表LA和LB(代码如下所示),并且两个表的储存的两个相邻元素,后者要大于或等于前者。合并这两个表。

LA,LB的初始化
#include <stdio.h>
#define MaxSize 100
typedef struct {
    int data[MaxSize];
    int length;
}Sqlist;
​
int main(){
Sqlist LA, LB;
    LA.data[0] = 1;
    LA.data[1] = 1;
    LA.data[2] = 5;
    LA.data[3] = 7;
    LA.data[4] = 9;
    LA.length = 5;
​
    LB.data[0] = 1;
    LB.data[1] = 4;
    LB.data[2] = 4;
    LB.data[3] = 5;
    LB.length = 4;
    
    return 0;
}

 

1.创建表LC 在LC中和并LA和LB。

1.1算法思想

  设表LC为一个空表,分别用两个指示器i,j指向LA和LB中的元素,如果LA.data[i]>=LB.data[j],就将LB.data[j]插入LC中,反之

就把LA.data[i]插入LC中。如果LA,LB中有一个表全部插入LC中 ,但另外一个表还有剩余,直接将剩余的部分直接插入LC中

1.2算法设计

void mergeList(Sqlist LA,Sqlist LB,Sqlist &LC) 
/*从下标为零开始比较LA,LB中元素的大小,小的先赋值给LC*/
{
    int i, j,k;//分别记录表LA,LB,LC中数据的下标。
    i = 0; j = 0; k = 0;
    while (i <= LA.length - 1 && j <= LB.length - 1) 
    {
        if (LA.data[i] >= LB.data[j]) 
        {
            LC.data[k] = LB.data[j];
            j++;
        }
        else 
        {
            LC.data[k] = LA.data[i];
            i++;
        }
        k++;
    }
​
    while (i <= LA.length-1) 
        /*已经将LB表中的所有值都赋值给 LC  但LA中还有剩余*/
    {
        LC.data[k] = LA.data[i];
        k++;
        i++;
    }
​
    while (j <= LB.length-1)
        /*已经将LA表中的所有值都赋值给 LC  但LB中还有剩余*/
    {
        LC.data[k] = LB.data[j];
        k++;
        j++;
    }
​
    LC.length = LA.length + LB.length;
}

2.在表LB中插入LA的各个元素

2.1算法思想

  分别用两个指示器i,j指向LA和LB中的元素,如果LA.data[i]<=LB.data[j],就将LA.data[i]插入到LB.data[j]之前,反之就比较

LA.data[i+1]和LB.data[j]。如果LA从i个元素开始,后面每个元素都大于LB的最后一个元素,直接将LA剩余的部分直接插入LB的后面。

2.2算法设计

int  InsList(Sqlist& L, int i, int e)
/*插入函数*/
{
    int k;
    for (k = L.length; k >= i; k--)   /*为插入元素而移动位置*/
        L.data[k + 1] = L.data[k];
    L.data[i] = e;
    L.length++;//LB表长+1
    return true;
}
​
​
void    merge(Sqlist LA, Sqlist& LB)
{
    int i, j;
    for (i = 0, j = 0; i < LA.length; j++)
    {
        if (LA.data[i] <= LB.data[j])
        {
            InsList(LB, j, LA.data[i]);//调用函数InsLIst  将LA.data[i]插入到LB.data[j]前
            i++;
        }
        if (j == LB.length - 1)
        {
            //从LA.data[i]开始之后 LA每个元素都大于LB表的最后一个元素
            for (; i < LA.length; i++, j++)
            {
                LB.length++;//LB表长+1
                LB.data[j + 1] = LA.data[i];   //将LA从LA.data[i]开始每个元素都依次插入LB表的最后面
            }
            break;//结束最外层循环
        }
    }
}
posted @   骆宾王  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示