#includetypedef int Datatype;
//定义链表的节点
typedef struct LNode{
Datatype data;
LNode *next;
}LNode,*LinkList;
bool InitLink(LinkList &L) //初始化链表
{
L =(LinkList)malloc(sizeof(LNode));
if(L==NULL){
return false;
}
L->next=NULL;
return true;
}
bool InsertData(LinkList &L,Datatype data) //向链表中插入数据
{
LinkList pa=L;
while(pa->next!=NULL){
pa=pa->next;
}
LinkList p=(LinkList)malloc(sizeof(LNode));//新建数据节点
if(p==NULL){
printf("插入数据失败\n");
return false;
}
p->data=data;
p->next=NULL;
if(pa==NULL){
pa=p;
}else{
pa->next=p;
}
return true;
}
void createLink(LinkList &L)
{
printf("请输入要插入的数据,以0结束!\n");
Datatype data;
scanf("%d",&data);
while(data!=00){
InsertData(L,data);
scanf("%d",&data);
}
}
void printLink(LinkList L)//打印链表
{
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool merger(LinkList La,LinkList Lb,LinkList &Lc)//两个链表求并集,并将结果存放在Lc中
{
LinkList pa,pb;
pb=Lb->next; //用于循环
pa=La->next;
while(pa!=NULL){ //以La为基础链,若B中的数据在A链中不存在,则插入到Lc中
InsertData(Lc,pa->data);
pa=pa->next;//pos表示la链中最后一个数据节点,用于插入数据
}
bool flag=false;
while(pb!=NULL){
pa=La->next;
flag=false; //用于判断B中的数据是否在A中存在
while(pa!=NULL){
if(pa->data==pb->data){
flag=false;
break; //如果存在,则本次循环结束
}
else{
flag=true;
}
pa=pa->next; //pa向后移动
}
if(flag){
/*LinkList p=(LinkList)malloc(sizeof(LNode)); //注释的代码是用于将A和B合并之后存放在A中
if(p==NULL){
printf("插入数据失败\n");
return false;
}
p->data=pb->data;
p->next=NULL;
pos->next=p;
pos=p;*/
InsertData(Lc,pb->data); //将B中的数据插入到Lc中
}
pb=pb->next;
}
return true;
}
bool Intersection(LinkList La,LinkList Lb,LinkList &Lc)//两个链表求交集,结果存放在Lc中
{
LinkList pa,pb;
pb=Lb->next;
while(pb!=NULL){
pa=La->next;
while(pa!=NULL){
if(pa->data==pb->data){ //求交集时,只需找到两个链中共同的数据,插入到Lc中即可
InsertData(Lc,pa->data);
}
pa=pa->next;
}
pb=pb->next;
}
return true;
}
int main()
{
LinkList La,Lb,Lc;
if(!InitLink(La)){
printf("初始化链表失败");
exit(1);
}
if(!InitLink(Lb)){
printf("初始化链表失败");
exit(1);
}
if(!InitLink(Lc)){
printf("初始化链表失败");
exit(1);
}
printf("创建第一条链表\n");
createLink(La);
printf("创建第二条链表\n");
createLink(Lb);
printf("链表中的数据为\n");
printf("La: ");
printLink(La);
printf("Lb: ");
printLink(Lb);
printf("链表求并集\n");
merger(La,Lb,Lc);
printf("合并之后链表中的数据为\n");
printLink(Lc);
printf("链表求交集\n");
if(!InitLink(Lc)){
printf("初始化链表失败");
exit(1);
}
Intersection(La,Lb,Lc);
printf("求交之后链表中的数据为\n");
printLink(Lc);
return(0);
}