数据结构与算法分析(c语言)第三章交集和并集

3.4给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程代码实现

//3.4 L1链表和L2链表做交集
LinkList IntersectList(LinkList L1,LinkList L2,LinkList R) {
    LinkList r, s,t,temp,m;
    int flag,len;
    len = getLen(L2);
    R = (LinkList)malloc(sizeof(Node));
    r = L1->next;
    s = L2->next;
    t = R;
    printf("输出长度%d:\n", len);
    for (; r; r = r->next) {
        for (; s; s = s->next) {
            if (r->data == s->data) {
                flag = 0;
                m = s->next;
                for (;m; m = m->next) {
                    if (r->data == m->data)
                        flag = 1;
                }
                if (!flag) {    
                    temp = (Node*)malloc(sizeof(Node));
                    temp->data = s->data;
                    t->next = temp;
                    t = temp;
                    break;
                }
            }
        }
        s = L2->next;//重置s的指向,让第二重循环每次循环时从L2的下一个结点处开始循环
        m = s->next;
    }
    t->next = NULL;
    return R;
}

m = s->next;
for (;m; m = m->next) {
   if (r->data == m->data)
       flag = 1;
  }

一定不要忘记这一步的判重操作,举个例子来说

L1 = {1,3,5,7},L2 = {1,1,3,5}

如果没有判重操作的话最后输出的结果会是1,1,3,5

因为如果不判重的话L1[0]会在循环中两次跟L2[0],L2[1]匹配即1这个数组被两次匹配到,所以要有第三重循环,当L1中的数据被重复匹配时,则要置flag为1,从而不再把重复的数据输入链表

3.5并集的实现

我的思路是首先定义一个函数,将L1和L2链表合并到一起,再将合并后的链表进行排序,之后进行链表去重,从而得到L1和L2的并集

合并函数代码实现

//链表拼接
LinkList mergeList(LinkList L1, LinkList L2, LinkList P) {
    LinkList r, s;
    Node* t,*m;
    //P = (LinkList)malloc(sizeof(Node));
    m = P;
    r = L1->next;
    s = L2->next;
    while (r) {//将链表L1的值接入P中
        t = (Node *)malloc(sizeof(Node));
        t->data = r->data;
        m->next = t;
        m = t;
        r = r->next;
    }
    m->next = NULL;
    while (s) {
        t = (Node*)malloc(sizeof(Node));
        t->data = s->data;
        m->next = t;
        m = t;
        s = s->next;
    }
    m->next = NULL;
    return P;
}

排序函数代码实现

//链表排序(从小到大)
LinkList sortLikt(LinkList L) {
    LinkList R;
    R = (LinkList)malloc(sizeof(Node));
    Node* p, * q;
    int temp;
    p = L->next;
    q = p->next;
    for (; p; p = p->next) {
        for (; q; q = q->next) {
            if (p->data < q->data) {
                temp = p->data;
                p->data = q->data;
                q->data = temp;
            }
        }
        q = L->next;
    }
    return L;
}

最后进行链表去重,从而实现链表的并集

//3.5L1和L2并集的实现
LinkList UnionList(LinkList L1, LinkList L2, LinkList R) {
    LinkList P,Sort;
    LinkList p,q;
    P = (LinkList)malloc(sizeof(Node));
    R = mergeList(L1, L2,P);//R是合并后的链表
    Sort = sortLikt(R);//Sort是排序后的链表
    p = Sort;
    while (p != NULL && p->next != NULL) {
        if (p->data == p->next->data) {
            p->next = p->next->next;
        }
        else {
            p = p->next;
        }
    }
    return Sort;
}

完整的代码可以参考:http://t.csdn.cn/ylUdO

将上述函数插入即可运行

运行结果图:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值