用线性表实现有序表的合并

#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
typedef int ElemType;
typedef struct
{
    ElemType* elem;
    int length;
    int real_len;
}SqList;
//initial
int SqL_INIT(SqList* L)
{
    L->elem = (int*)malloc(sizeof(int) * SIZE);
    if (!L->elem)
    {
        printf("fail to create this memory>");
        return 0;
    }
    L->real_len = SIZE;
    L->length = 0;
    return 1;
}

int SqL_len(SqList L)
{
    return L.length;
}

int IsEmpty(SqList L)
{
    if (L.length == 0)
    {
        printf("this is empty>");
        return 0;
    }
    return 1;
}

//创建元素
void SqL_input(SqList *L)
{
    int i = 0;
    int j = 0;
    printf("输入你要插入的元素个数>");
    scanf("%d", &i);
    L->real_len=L->length = i;
    for (j; j < L->length; j++)
    {
        printf("输入第%d个元素的值", j+1);
        scanf("%d",&L->elem[j]);
        printf("\n");
    }
}
//合并元素
void MergeList(SqList* M, SqList* N, SqList* R)
{
    int* p, *p_lat, *q, *q_lat,*r;
    p = M->elem;
    p_lat = M->elem + M->length-1;
    q = N->elem;
    q_lat = N->elem + N->length-1;
    r = R->elem;
    while ((p<=p_lat) && (q<=q_lat))
    {
        *r = (*p < *q) ? (*p) : (*q);//使用的是三目运算符,我自己比较倾向于理解这种
        //r接受了谁的值,谁的指针就移动
       if (*r == *p)//r
        {
            p++;
        }
        else
        {
            q++;
        }
        r++;//移动r
        R->length++;//记录c中的元素个数,因为初始化的时候c=0;
    }
//分别讨论p/q到达结尾之前的情况
    while (p<=p_lat)
    {
        *r++ = *p++;
        R->length++;//记录c中的元素个数,因为初始化的时候c=0;
    }
    while (q<=q_lat)
    {
        *r++ = *q++;
        R->length++;//记录c中的元素个数,因为初始化的时候c=0;
    }
}
//打印元素
void PRINT(SqList L)
{
    int i = 0;
    if (L.length == 0)
    {
        printf("this list is empty");
        exit(EXIT_FAILURE);
    }
    for (i = 0; i < L.length; i++)
    {
        printf("%d\n", L.elem[i]);
    }
}
int main()
{
    SqList a, b, c;
    SqL_INIT(&a);
    SqL_INIT(&b);
    SqL_INIT(&c);
    SqL_input(&a);
    SqL_input(&b);
//因为开辟的空间很大,所以这里就没有考虑c空间溢出的情况
    MergeList(&a, &b, &c);
    PRINT(c);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值