欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进阶实验2-3.3 两个有序链表序列的交集 (20分)

程序员文章站 2022-06-07 19:13:46
...

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1

输出样例:
2 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
typedef struct Node{
    int data;
    struct Node *next;
}node;
int len;
node *Function()
{
    node *head = NULL;
    int data;
    scanf("%d",&data);
    while(data != - 1)
    {
        len ++;
        node *p = (node*)malloc(sizeof(node));
        p -> data = data;
        p -> next = head;
        head = p;
        scanf("%d",&data);
    }
    return head;
}
void function(node *p , int str[])
{
    int k = 0;
    while(p)
    {
        str[k ++] = p -> data;
        p = p -> next;
    }
}
int cmp(const void *a , const void *b)
{
    return *(int *)a - *(int *)b;
}
void Free(node *p)
{
    while(p)
    {
        node *temp = p;
        p = p -> next;
        free(temp);
    }
}
int place_str , place_array;
int Find(int str[] , int array[])
{
    int sum_str = 0 , sum_array = 0 , num = str[place_str];
    while(1)
    {
        if(str[place_str] == num)
        {
            sum_str ++;
            place_str ++;
        }
        else break;
    }
    while(1)
    {
        if(array[place_array] == num)
        {
            sum_array ++;
            place_array ++;
        }
        else if(array[place_array] < num) place_array ++;
        else break;
    }
    int sum = (sum_array < sum_str) ? sum_array : sum_str;
    return sum;
}
int main()
{
    node *p = Function();
    int n1 = len;
    len = 0;
    node *q = Function();
    int n2 = len;
    if(n1 == 0 || n2 == 0)
    {
        printf("NULL\n");
        return 0;
    }
    int str[n1] , array[n2] , cnnt = 0;
    function(p , str);
    function(q , array);
    Free(p);
    Free(q);
    qsort(str , n1 , 4 , cmp);
    qsort(array , n2 , 4 , cmp);
    while(1)
    {
        int data = str[place_str] , i;
        int sum = Find(str , array);
        for(i = 0 ; i < sum ; i ++)
        {
            if(cnnt ++)
            {
                printf(" ");
            }
            printf("%d",data);
        }
        if(place_str == n1) break;
    }
    if(!cnnt) printf("NULL\n");
    system("pause");
    return 0;
}

进阶实验2-3.3 两个有序链表序列的交集 (20分)

相关标签: 链表 c语言