6-2 顺序表(有序表)的合并(并集)*

已知顺序表的结构定义如下:

typedef struct
{
    int size, length;
    long long *element;
} LIST;

说明:参数 dst 为指示目标顺序表的指针,src1 和 src2 分别为指示两个源顺序表的指针。函数将 src1 和 src2 所指两个源顺序表合并到 dst 所指目标顺序表中。目标顺序表中保存两个源顺序表中的所有元素,但不重复。

函数原型

void Add(LIST *dst, const LIST *src1, const LIST *src2);

说明:参数 dst 为指示目标顺序表的指针,src1 和 src2 分别为指示两个源顺序表的指针。函数将 src1 和 src2 所指两个源顺序表合并到 dst 所指目标顺序表中。

裁判程序

int main()
{
    LIST a, b, c;
    Create(&a);
    Create(&b);
    Create(&c);
    Input(&a);
    Input(&b);
    Add(&c, &a, &b);
    Output(&c);
    putchar('\n');
    Destroy(&c);
    Destroy(&b);
    Destroy(&a);
    return 0;
}

说明:Create 函数用于创建顺序表,Destroy 函数用于销毁顺序表。Input 函数用于输入顺序表:首先输入元素个数,然后输入这些数据元素。Output 函数用于输出顺序表,数据元素之间以空格间隔。

输入样例

5
1 3 4 6 7
7
1 2 3 5 6 8 9

输出样例

1 2 3 4 5 6 7 8 9

完整代码: 

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int size;
    int length;
    long long* element;
} LIST;

void Create(LIST *lst)
{
    lst->size = 10;
    lst->length = 0;
    lst->element = (long long *)malloc(lst->size * sizeof(long long));
}

void Input(LIST *lst,int n)
{
    if (n > lst->size)
    {
        printf("输入的元素个数超过链表大小,请重新输入。\n");
        return;
    }

    for (int i = 0; i < n; i++)
    {
        scanf("%lld", &lst->element[i]);
    }
}

void Output(LIST *lst,int m)
{
    for (int i = 0; i <lst->length; i++)
    {
        printf("%d ", lst->element[i]);
    }
    printf("\n");
}

void Add(LIST *src1, LIST *src2,  LIST *dst)
{
    int i, j = 0;
    int k=0;
    for (i = 0; i < src1->length; i++)
    {
        for (j = 0; j < dst->length; j++) //找出相同元素的位置
        {
            if (src1->element[i] == dst->element[j])
                break;
        }
        if (j == dst->length) //当dst没有scr1的元素时,将scr1的元素插入到dst表中
        {
            dst->element[k++] = src1->element[i];
            dst->length++;//不要忘记dst的长度以改变
        }
    }

    for (i = 0; i < src2->length; i++)
    {
        for (j = 0; j < dst->length; j++)
        {
            if (src2->element[i] == dst->element[j])
                break;
        }
        if (j == dst->length)
        {
            dst->element[k++] = src2->element[i];
            dst->length++;
        }
    }
}

void bubble_sort(LIST *dst, int n) {//冒泡排序
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (dst->element[j] > dst->element[j + 1]) {//交换位置
                int temp = dst->element[j];
                dst->element[j] = dst->element[j + 1];
                dst->element[j + 1] = temp;
            }
        }
    }
}

void Destroy(LIST *lst)
{
    free(lst->element);
}

int main()
{

    LIST a, b, c;
    int x,h;
    Create(&a);
    Create(&b);
    Create(&c);
    printf("请输入链表a的元素个数:");
    int n;
    scanf("%d", &n);
    a.length=n;
    Input(&a,n);
    Output(&a,n);
    printf("请输入链表b的元素个数:");
    scanf("%d", &x);
    b.length=x;
    Input(&b,x);
    Output(&b,x);
    Add(&a, &b, &c);
    h=c.length;
    printf("合并后的链表为:");
     bubble_sort(&c,h);
    Output(&c,h);
    Destroy(&a);
    Destroy(&b);
    Destroy(&c);
    return 0;
}

答案代码: 

//两个源列表 src1 和 src2 以及一个目标列表 dst。
void Add(LIST *src1, LIST *src2,  LIST *dst)
{
//其中 i 和 j 用于循环.
//而 k 用于跟踪目标列表 dst 的当前长度。
    int i, j = 0;
    int k=0;
//遍历源列表 src1。
    for (i = 0; i < src1->length; i++)
    {
//对于每个源列表中的元素,遍历目标列表 dst 以查找是否有相同的元素。
        for (j = 0; j < dst->length; j++)
        {
//如果找到相同的元素,则跳出内层循环。
            if (src1->element[i] == dst->element[j])//注意i和j的区分
                break;
        }
//检查是否遍历了整个目标列表而没有找到相同的元素。
        if (j == dst->length)
        {
//如果上述条件满足,则将源列表中的元素添加到目标列表中,并增加目标列表的长度。
            dst->element[k++] = src1->element[i];
            dst->length++;//不要忘记dst的长度已改变
        }
    }
//用相同的方法处理表2
    for (i = 0; i < src2->length; i++)
    {
        for (j = 0; j < dst->length; j++)
        {
            if (src2->element[i] == dst->element[j])
                break;
        }
        if (j == dst->length)
        {
            dst->element[k++] = src2->element[i];
            dst->length++;
        }
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值