#include <stdio.h>
#include <stdlib.h>
struct Lian
{
int data;
struct Lian *next;
};
struct Lian *Create();
void Shu(struct Lian *head);
struct Lian *Cha(struct Lian *A,struct Lian *B) ;
int main()
{
struct Lian *A,*B,*C;
printf("请输入链表A的结点元素(递增,输入-1回车结束):\n");
A=Create();
printf("链表A创建结果如下:\n");
Shu(A);
printf("请输入链表B的结点元素(递增,输入-1回车结束):\n");
B=Create();
printf("链表B创建结果如下:\n");
Shu(B);
C=Cha(A,B);
printf("链表A,B的差集如下:\n");
Shu(C);
return 0;
}
struct Lian *Create()
{
struct Lian *head=NULL,*p,*p1;
p=(struct Lian *)malloc(sizeof(struct Lian));
scanf("%d",&p->data );
p->next =NULL;
while(p->data !=-1)
{
if(head==NULL)
{
head=p;
p1=p;
}
else
{
p1->next =p;
p1=p;
}
p=(struct Lian *)malloc(sizeof(struct Lian));
scanf("%d",&p->data );
p->next =NULL;
}
return head;
}
void Shu(struct Lian *head)
{
struct Lian *p;
p=head;
while(p!=NULL)
{
printf("%-3d",p->data );
p=p->next ;
}
putchar('\n');
}
/*
这里说的是以同样形式存储,也就是链表,所以我想的就是边比较边创建,因为是递增,所以比较的时候也不用全部比较
再者这里没有要求用原来的存储空间,所以我们另外创建一个链表就行
*/
struct Lian *Cha(struct Lian *A,struct Lian *B)
{
struct Lian *head=NULL,*p,*p1,*a,*b;
a=A;
int sum=0,sta=0;
while(a!=NULL)
{
b=B; //因为A的每个元素都需要跟B的元素比较,所以每次都要从头开始
sta=0; //sta=0表示没有相同的,也就是差集元素,sta=1表示有相同的就不是差集元素
while(b!=NULL&&b->data <=a->data ) //当B当前元素大于A的当前判断元素,因为是递增,所以之后的元素肯定都大于A的当前元素,就不用比较了,跳出循环
{
if(a->data ==b->data )
{
sta=1;
break;
}
b=b->next ;
}
if(sta==0) //表示是差集元素,需要创建链表结点
{
p=(struct Lian *)malloc(sizeof(struct Lian));
p->data =a->data ;
p->next =NULL;
if(head==NULL)
{
head=p;
p1=p;
}
else
{
p1->next =p;
p1=p;
}
sum++;
}
a=a->next ;
}
printf("差集元素:%d个\n",sum);
return head;
}
已知递增有序的单链表 A,B 分别存储了一个集合,请设计算法以求出两个集合 A 和 B 的差集 A-B(即仅由在 A 中出现而不在 B 中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合
于 2022-11-08 17:33:09 首次发布