线性表的合并 算法2.2

算法2.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, 11, 15, 20)

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
using namespace std;
#define LIST_INIT_SIZE 100//线性表存储空间初始分配量
#define LISTINCREMENT  10 //线性表存储空间的分配增量
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define MAX_SIZE 100
#define List int
typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType *elem;//存储空间基址
    int length;    //当前长度
    int listsize;  //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
//初始化线性表
Status InitList(SqList &L)
{
    //构造一个空的线性表L
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
    {
        printf("分配失败!\n");
        return ERROR;//内存分配失败
    }
    L.length = 0; //空表长度为0
    L.listsize = LIST_INIT_SIZE;//初始存储容量
    return OK;
}
//获取线性表的长度
Status ListLength(SqList L)
{
    if(L.elem)
    {
        return L.length;
    }
    return ERROR;
}
//获取第i个元素的值
Status GetElem(SqList L, int i, int &e)
{
    if(L.elem && i >= 1 && i <= L.length)
    {
        e = *(L.elem + i - 1);
        return OK;
    }
    return ERROR;
}
//将元素e插入到第i个位置
Status ListInsert(SqList &L, int i, ElemType e)
{
    ElemType *newbase, *q, *p;
    if(i<1 || i>L.length+1)
    {
        return ERROR;
    }
    if(L.length >= L.listsize)
    {
        newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
        {
            return ERROR;
        }
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    q = L.elem + i -1;
    for(p = L.elem+L.length-1; p>=q; --p)
    {
        *(p+1) = (*p);
    }
    *q = e;
    ++L.length;
    return OK;
}
//遍历列表
Status ListTraverse(SqList L, void (*vi)(ElemType*))
{
    ElemType *p;
    int i;
    p = L.elem;
    for(i = 1; i <= L.length; i++)
    {
        vi(p++);
    }
    printf("\n");
    return OK;
}
//输出元素
void Print(ElemType *e)
{
    printf("%d ", *e);
}
//根据题目要求,合并数组到Lc
void MergeList(SqList La, SqList Lb, SqList &Lc)
{
    InitList(Lc);
    int i = 1, j = 1;
    int k = 0;
    int La_len = ListLength(La);
    int Lb_len = ListLength(Lb);
    int ai, bj;
    while((i<=La_len)&&(j<=Lb_len))
    {
        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), i++;
    }
    while(j <= Lb_len)
    {
        GetElem(Lb, j, bj);
        ListInsert(Lc, ++k, bj), j++;
    }
}
int main()
{
    SqList La;
    SqList Lb;
    int j;
    if(InitList(La) == 1) /* 创建空表La成功 */
    {
        printf("请输入La中的元素\n");
        for(j = 1; j < 5; j++) /* 在表La中插入4个元素 */
        {
            int n;
            scanf("%d", &n);
            ListInsert(La, j, n);
        }
    }
    if(InitList(Lb) == 1) /* 创建空表Lb成功 */
    {
        printf("请输入Lb中的元素\n");
        for(j = 1; j < 8; j++) /* 在表Lb中插入个元素 */
        {
            int n;
            scanf("%d", &n);
            ListInsert(Lb, j, n);
        }
    }
    SqList Lc;
    MergeList(La, Lb, Lc);/* 合并La、Lb到Lc */
    printf("Lc= "); /* 输出表Lc的内容 */
    ListTraverse(Lc, Print);
    return 0;
}
//例如LA=(3, 5, 8, 11),
//    LB=(2, 6, 8, 9, 11, 15, 20),
//则  LC=(2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20)
//3 5 8 11
//2 6 8 9 11 15 20

对于顺序表的合并 

void MergeList(SqList La, SqList Lb, SqList &Lc)
{
    InitList(Lc);
    int *pa, *pb;
    pa = La.elem, pb = Lb.elem;
    Lc.listsize = Lc.length = La.length + Lb.length;
    int *pc;
    pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
    if(!pc)
    {
        printf("存储分配失败!\n");//pc即Lc.elem
    }
    int *pa_last, *pb_last;
    pa_last = La.elem + La.length - 1;//elem:存储空间基址
    pb_last = Lb.elem + Lb.length - 1;
    while((pa <= pa_last) && (pb <= pb_last))//归并
    {
        if(*pa <= *pb)
        {
            *pc++ = *pa++;
        }
        else
        {
            *pc++ = *pb++;
        }
    }
    while(pa <= pa_last)//插入剩余La中元素
    {
        *pc++ = *pa++;
    }
    printf("%d %d\n", *pb, *pb_last);
    while(pb <= pb_last)//插入剩余Lb中元素
    {
        *pc++ = *pb++;
        printf("%d %d\n", *pb, *pc);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值