#include<stdio.h>
//求递增有序的顺序表A与B的交集C,时间复杂度为O(m+n)
//本程序的缺陷是输入AB数组时,输入多个空格后按enter无法结束输入,除非继续输入数字后按回车才可以结束
#define MAXLENGTH 100 //顺序表初始分配空间
typedef struct{
int ar[MAXLENGTH];
int length;
}SqList; //定义顺序表
int main(void)
{
int i, indexa = 0, indexb = 0, indexc = 0; //index为序列A、B、C指针
SqList A, B, C;
printf("请输入递增有序顺序表A,长度小于%d,回车结束输入\nA = ", MAXLENGTH);
for(i = 0; i < MAXLENGTH; ++i)
{
scanf("%d", &A.ar[i]);
A.length = i + 1;
if(getchar() == '\n')
break;
} //输入顺序表A,以回车键结束
//printf("A.length = %d\n", A.length);
printf("请输入递增有序顺序表B,长度小于%d,回车结束输入\nB = ", MAXLENGTH);
for(i = 0; i < MAXLENGTH; i++)
{
scanf("%d", &B.ar[i]);
B.length = i + 1;
if(getchar() == '\n')
break;
} //输入顺序表B,以回车键结束
while(indexa < A.length && indexb < B.length)
{
while(indexa + 1 < A.length && A.ar[indexa] == A.ar[indexa + 1])
++indexa; //跳过A中相同元素
while(indexb + 1 < B.length && B.ar[indexb] == B.ar[indexb +1 ])
++indexb; //跳过B中相同元素
if(A.ar[indexa] == B.ar[indexb])
{
C.ar[indexc++] = A.ar[indexa];
C.length = indexc;
indexa ++;
indexb ++;
} //查找A与B中相等的元素,添加到C中
else if(A.ar[indexa] < B.ar[indexb])
++indexa;
else
++indexb;
}
printf("A与B的交集为:\nC = ");
for(i = 0; i < C.length; i++)
{
printf("%d ", C.ar[i]);
} //打印交集C
printf("\n");
return 0;
}
C语言 求有序递增集合A与B的交集C,时间复杂度为O(m+n)
最新推荐文章于 2024-09-14 17:18:21 发布