zoukankan      html  css  js  c++  java
  • 求有序序列的交集(链表)

    问题描述 :

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

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

    求它们的交集并输出。

    注意:这里要利用到“有序”的特性。

    输入说明 :

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

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

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

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

    注:两个序列输入时保证有序

    输出说明 :

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

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

    输入范例 :

    4 1 3 5 7
    4 1 4 5 8

    输出范例 :

    head-->1-->5-->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 L2有序
    struct student* intersection(struct student* L1, struct student* L2)
    {
        struct student* res = NULL, * tail = NULL, * p1 = L1, * p2 = L2;
        while (p1 && p2)
        {
            if (p1->num == p2->num)
            {
                if (!res)
                {
                    res = p1;
                    tail = p1;
                }
                else
                {
                    tail->next = p1;
                    tail = p1;
                }
                p1 = p1->next;
                p2 = p2->next;
            }
            else if (p1->num < p2->num)
                p1 = p1->next;
            else
                p2 = p2->next;
        }
        if(tail)tail->next = NULL;
        return res;
    }
    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;
    }
  • 相关阅读:
    陪伴
    休假
    I'm back
    Mysql程序
    Mysql 行转列
    Struts2 设置--Myelipse
    struts2 严重: Error filterStart 原因
    廉价药
    在linux下用tomcat部署java web项目的过程与注意事项
    创建表格式
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13219649.html
Copyright © 2011-2022 走看看