7-1 两个有序链表序列的交集 (20分)
已知两个非降序链表序列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>
struct List{
int data;
struct List *next;
};
void print(struct List *head){
struct List *p=head;
if(!head){
printf("NULL");
return;
}
printf("%d",p->data);
for(p=p->next;p!=NULL;p=p->next)
printf(" %d",p->data);
}
struct List* creatlist(){
int i;
struct List *head=NULL,*p,*q;
scanf("%d",&i);
if(i==-1)
return head;
head=(struct List*)malloc(sizeof(struct List));
head->data=i;
head->next=NULL;
p=head;
scanf("%d",&i);
for(;i!=-1;scanf("%d",&i)){
q=(struct List*)malloc(sizeof(struct List));
q->data=i;
q->next=NULL;
p->next=q;
p=p->next;
}
return head;
}
struct List *Jiaoji(struct List *list1,struct List *list2){
int a;
struct List *head=NULL,*p=list1,*q=list2,*s;
if(!list1||!list2)
return head;
for(;p&&q;){
for(;p&&q;){
if(p->data==q->data)
break;
else if(p->data>q->data)
q=q->next;
else
p=p->next;
}
if(!p||!q)
break;
if(head==NULL){
head=(struct List*)malloc(sizeof(struct List));
head->data=p->data;
head->next=NULL;
s=head;
}
else{
struct List* temp=(struct List*)malloc(sizeof(struct List));
temp->data=p->data;
temp->next=NULL;
s->next=temp;
s=s->next;
temp=NULL;
}
a=p->data;
p=p->next;
q=q->next;
}
return head;
}
int main(){
struct List *list1,*list2;
list1=creatlist();
list2=creatlist();
print(Jiaoji(list1,list2));
}