已知两个单链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放于A链表中。
程序员文章站
2024-02-03 16:53:40
...
Input
多实例测试,每组测试数据有两行。
第一行有一个整数m,代表链表A中元素个数,接着是m个整数,代表链表A中的m个元素
第一行有一个整数n,代表链表B中元素个数,接着是n个整数,代表链表A中的n个元素
Output
每组测试输出一行,代表链表A和链表B中元素的交集,如果交集为空则输出none
Sample Input
5 2 5 8 9 20
3 5 9 10
6 1 2 3 12 56 87
7 2 8 12 38 56 78 87
Sample Output
5 9
2 12 56 87
#include<stdio.h>
#include<malloc.h>
#define ElemType int //假设数据元素均为整型
//顺序表的表示与实现
//变长型顺序表存储结构定义
#define LIST_INIT_SIZE 50
#define LIST_INCREMENT 10
typedef struct{
ElemType *data;//data指向分配的空间首地址
int Length;//顺序表的长度,表中元素个数
int Listsize;//顺序表存储空间数
}SqList;
//顺序表基本操作
//初始化顺序表
void InitSqList(SqList *L)
{
L->data=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)) ;//分配空间
L->Length=0; //初始化时,L中没有元素
L->Listsize =LIST_INIT_SIZE;//初始化时L的空间数为 LIST_INIT_SIZE
}
//在最后插入元素 e,插入超过返回1,否则返回0
int ListInsert(SqList *L,ElemType e)
{
//空间的判断,空间已满,增加空间
if(L->Length==L->Listsize)
{
L->data=(ElemType*)realloc(L->data,(L->Listsize+LIST_INCREMENT)*sizeof(ElemType));
if(L->data==NULL)
return 0;
L->Listsize=L->Listsize+LIST_INCREMENT;
}
L->data[L->Length]=e;//将e放入到最后位置
L->Length++;//顺序表长度增1
return 1;
}
int main(void)
{
int n,m,i,e,j,b=0,c=0;
SqList La,Lb;
//while循环,以EOF结束
while(scanf("%d",&m)!=EOF)
{
//初始化La,lb
InitSqList(&La); InitSqList(&Lb);
// 向单链表la中插入m个元素
for(i=1;i<=m;i++)
{
scanf("%d",&e);
ListInsert(&La,e);
}
scanf("%d",&n);
// 向单链表lb中插入n个元素
for(i=1;i<=n;i++)
{
scanf("%d",&e);
ListInsert(&Lb,e);
}
for(i=0;i<n;i++)
{
for(j=0;j<La.Length;j++)
{
if(La.data[j]==Lb.data[i])
c=1;
}
//la中是否有与Lb.data[i]相同的元素
if(c==1)
{
printf("%d ",Lb.data[i]);
//标记是否有交集
b=1;
}
//重置标记
c=0;
}
//如果交集为空
if(b==0)
printf("none");
//不管为不为空都需要换行
printf("\n");
}
return 0;
}
推荐阅读
-
已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。
-
已知两个单链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放于A链表中。
-
已知两个链表A和B分别表示两个集合, 其元素递增排列. 设计一个算法, 求出A与B的交集, 并存放在C链表中
-
已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A与B的交集,并存放在A链表中。
-
已知两个链表A和B分别表示两个集合, 其元素递增排列. 设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合), 结果存放在链表A中, 同时返回所求差集中元素的个数