• 求序列的交集(链表)


    问题描述 :

    使用带头结点的单链表编程:

    有两个序列,分别表示两个集合。

    求它们的交集并输出。

    输入说明 :

    第一行输入序列A的信息:

    第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据

    第一行输入序列B的信息:

    第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据

    输出说明 :

    输出交集的元素序列,输出格式见范例。

    如果交集为空,则输出“head-->tail”

    交集里的元素顺序,依照其在序列A中的顺序。

    比如:

    序列:

    A:5 3 2 7

    B:1 3 5 8

    则交集为5和3,因为在序列A中,5在3的前面,所以在交集里5也在3的前面。

    输入范例 :

    4 5 3 2 7
    4 1 3 5 8

    输出范例 :

    head-->5-->3-->tail

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    struct student
    {
        int  num;
        struct student* next;
    };
    struct student* createByTail(int size)
    {
        struct student* head;
        struct student* p1, * p2;
        int n;
        n = 0;
        p1 = p2 = (struct student*)malloc(sizeof(struct student));
        scanf("%d", &p1->num);
        head = NULL;  //首先置链表为空链表
        while (p1->num != -1)    //num为-1,意味着用户输入结束
        {
            n = n + 1;
            if (n == 1)            //创建第一个结点
                head = p1;
            else
                p2->next = p1;
            p2 = p1;            //p2始终指向最后一个结点(即尾指针)
            if (size == n)break;
            p1 = (struct student*)malloc(sizeof(struct student)); //p1指向新结点
            scanf("%d", &p1->num);
        }
        p2->next = NULL;  //切记:最后一个结点的next赋值为NULL
        return head;
    }
    //输出链表中的信息(num)
    void  displayLink(struct student* head)
    {
        struct student* p;
        p = head;
        printf("head-->");
        while (p != NULL)
        {
            printf("%d-->", p->num);
            p = p->next;
        }
        printf("tail
    ");
    }
    //求L1 L2的交集 按L1的顺序排
    //对于L1的每个元素 如果L2没有则删除 
    struct student* intersection(struct student* L1, struct student* L2)
    {
        struct student* pl2 , * pl1=L1, * q, * pl1_pre=NULL;
        while (pl1)
        {
            pl2 = L2;
            while (pl2&& pl2->num != pl1->num)
                pl2 = pl2->next;
            if (pl2 && pl2->num == pl1->num)//L2中有
            {
                pl1_pre = pl1;
                pl1 = pl1->next;
            }
            else//L2中没有 则删除
            {
                if (pl1 == L1)//是头
                {
                    q = pl1;
                    L1 = pl1->next;
                    free(q);
                    pl1_pre = NULL;
                    pl1 = L1;
                }
                else//不是头
                {
                    q = pl1;
                    pl1_pre->next = pl1->next;
                    free(q);
                    pl1 = pl1_pre->next;
                }
            }
        }
        return L1;
    }
    int main()
    {
        struct student* headA, * headB;
        int i = 0, n;
        scanf("%d", &n);
        headA = createByTail(n);
        //displayLink(headA);
        scanf("%d", &n);
        headB = createByTail(n);
        //displayLink(headB);
        displayLink(intersection(headA, headB));
        return 0;
    }
  • 相关阅读:
    移动端前端开发调试
    webkit图片滤镜
    ruby安装sass报错解决办法
    mongodb的查询语句学习摘要
    signedCookies
    [cookie篇]从cookie-parser中间件说起
    node.js下mongoose简单操作实例
    在ExpressJS中设置二级域名跨域共享Cookie
    Node.js开发工具、开发包、框架等总结
    hibernate框架学习笔记4:主键生成策略、对象状态
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13190735.html
Copyright © 2020-2023  润新知