欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

已知两个单链表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;
 }