/******************************************************************************************
2. 编一C程序,它能读入两组整数(每组整数都以-9999为结束标记,个数都不大于1000),
并以从小到大的次序输出在第一组整数中或在第二组整数中的所有整数(同一个整数不能输出两次)。
(输入时,两个相邻的整数用空格隔开)。
******************************************************************************************/
#include "stdlib.h"
#include "stdio.h"
typedef struct link_node_type
{
int data ;
struct link_node_type * next ;
} link_node ;
link_node * create_link()
{
int a ;
link_node * temp1 , * temp2 ;
link_node * link = (link_node *)malloc(sizeof(link_node)) ;
link->next = NULL ;
while(7)
{
scanf("%d" , &a) ;
if(a == -9999) return link ;
temp2 = link ;
while(temp2->next!=NULL&&temp2->next->data < a)
temp2 = temp2->next ;
if(temp2->next!=NULL&&temp2->next->data == a)
continue ;
temp1 = (link_node *)malloc(sizeof(link_node)) ;
temp1->data = a ;
temp1->next = temp2->next ;
temp2->next = temp1 ;
}
}
//求link1与link2的并集
void calc_two_link(link_node * link1 , link_node * link2)
{
int counter = 0 ;
link1 = link1->next ;
link2 = link2->next ;
while(link1!=NULL||link2!=NULL)
{
if(link1!=NULL&&(link2==NULL||link1->data < link2->data))
{
printf("%d " , link1->data) ;
link1 = link1->next ;
counter ++ ;
continue ;
}
if(link2!=NULL&&(link1==NULL||link2->data < link1->data))
{
printf("%d " , link2->data) ;
link2 = link2->next ;
counter ++ ;
continue ;
}
//link2->data == link1->data
printf("%d " , link1->data) ;
counter ++ ;
link1 = link1->next ;
link2 = link2->next ;
}
if(counter == 0)
printf("空集!\n") ;
}
void show_link(link_node * link)
{
if(link->next==NULL)
printf("此集合为空集!") ;
while(link->next!=NULL)
{
printf("%d " , link->next->data) ;
link = link->next ;
}
printf("\n") ;
}
main()
{
link_node * link1 , * link2 ;
printf("请输入第1组数据,以-9999为结束标记:\n") ;
link1 = create_link() ;
show_link(link1) ;
printf("请输入第2组数据,以-9999为结束标记:\n") ;
link2 = create_link() ;
show_link(link2) ;
printf("第1组数据和第2组数据的并集序列为:\n") ;
calc_two_link(link1 , link2) ;
}