求有序序列的交集(链表)

问题描述 :

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

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

求它们的交集并输出。

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

输入说明 :

第一行输入序列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\n");
}
//求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;
}

 

posted @ 2020-07-01 15:49  lancelee98  阅读(433)  评论(0编辑  收藏  举报