//单链表求并集,不开辟新空间
//思路,每取一个b中的元素,就跟a中所有元素进行比较,用pc接入与a中元素不同的b中元素
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType; //根据实际问题,定义数据类型
typedef struct node
{
ElemType data; //数据域
struct node * next;//指针域
}slink;//单链表类型名
void print(slink *head);
slink *creatslink(int n) //创建单链表
{
int i;
slink *head,*p,*s;
p=head=(slink *)malloc(sizeof(slink));//头结点
for(i=1;i<=n;i++) //输入数据
{
s=(slink *)malloc(sizeof(slink));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;//尾指针置空
return head;
}
slink *bring(slink *a,slink *b)//两个单链表求并集
{
slink *pa,*pb,*pc,*c;
pb=b->next;
c=pc=b;
while(pb!=NULL)
{
pa=a->next;
while(pa!=NULL&&pa->data!=pb->data) //对a链表的元素进行一一匹配
pa=pa->next;
if(pa==NULL)//如果两个元素不相等
{
pc->next=pb;
pc=pb;
}
pb=pb->next;
}
pa=a->next;
while(pa!=NULL)//把a接到链表c中
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
pc->next=NULL;
return c;
}
void print(slink *head)
{
slink *p;
p=head->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
slink *a,*b,*c;
c=(slink *)malloc(sizeof(slink));
a=creatslink(5);
printf("链表a:");
print(a);
b=creatslink(5);
printf("链表b:");
print(b);
c=bring(a,b);
printf("a,b求并集集得链表c:");
print(c);
return 0;
}