c语言数据结构之顺序线性表的合并、并集

//#include "list_test.c"

//#include "link_list_test.c"

#include "List.h"
#include "LinkList.h"
#include "utils.c"


void MergeList(const List * l1,const List * l2,List * l3);
void list_union(List * l1,List * l2,List * l3);

void print(int data);

int main() {

//    list_test();
//    link_list_test();
    List l1,l2,l3;
    InitList(&l1);
    InitList(&l2);
    InitList(&l3);

    insert(&l1,3);
    insert(&l1,5);
    insert(&l1,8);
    insert(&l1,11);

    ListTraverse(&l1,print);
    printf("\n");
    insert(&l2,2);
    insert(&l2,6);
    insert(&l2,8);
    insert(&l2,9);
    insert(&l2,11);
    insert(&l2,15);
    insert(&l2,20);

    ListTraverse(&l2,print);
    printf("\n");

    MergeList(&l1,&l2,&l3);

    ListTraverse(&l3,print);
    printf("\n");

    DestroyList(&l3);
    InitList(&l3);
    list_union(&l1,&l2,&l3);
    ListTraverse(&l3,print);
    printf("\n");
    return 0;
}


void print(int data)
{
    printf("%d ",data);

}
/**
 * l1l2合并为l3
 * @param l1
 * @param l2
 * @param l3
 */
void MergeList(const List * l1,const List * l2,List * l3)
{

    int i=0,j=0;

    int data1,data2;
    while(i<l1->length && j<l2->length)
    {
        data1 = *GetElem(l1, i);
        data2 = *GetElem(l2,j);
        if(data1 <= data2)
        {
            insert(l3,data1);
            insert(l3,data2);
        }else{
            insert(l3,data2);
            insert(l3,data1);
        }

        i++,j++;
    }

    while(i<l1->length)
    {
        insert(l3,*GetElem(l1,i));
        i++;
    }

    while(j<l2->length)
    {
        insert(l3,*GetElem(l2,j));
        j++;
    }
}


//并集操作
void list_union(List * l1,List * l2,List * l3)
{
    int i=0,j=0,n=0;

    int data1,data2;
    while(i<l1->length && j<l2->length)
    {
        data1 = *GetElem(l1, i);
        data2 = *GetElem(l2,j);
        if(data1 < data2)
        {
            insert(l3,data1);
            insert(l3,data2);
            n+=2;
        }else if(data1 == data2){
            insert(l3,data1);
            n++;
        }
        else{
            insert(l3,data2);
            insert(l3,data1);
            n+=2;
        }

        i++,j++;
    }

    while(i<l1->length)
    {
        if(*GetElem(l3,n-1) == *GetElem(l1,i))
        {
            i++;
            continue;
        }
        insert(l3,*GetElem(l1,i));
        n++;
        i++;
    }

    while(j<l2->length)
    {
        if(*GetElem(l3,n-1) == *GetElem(l2,j))
        {
            j++;
            continue;
        }
        insert(l3,*GetElem(l2,j));
        n++;
        j++;
    }
}


运行结果:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值