进阶实验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;
}
上一篇: OCP题库笔记1z0-052