算法思想:指针IndexA和IndexB分别指向表A和表B的第一个元素,如果IndexA所指元素小于IndexB所指元素,则移动IndexA的指针指向下一个元素;如果IndexA所指元素大于IndexB所指元素,则移动IndexB的指针指向下一个元素;如果两指针指向元素相等,将共同元素保存后,两指针同时移动指向下一个元素,如果该元素与交集表尾元素不相等,则将其插入交集表中。重复上述步骤,直到A与B其中一条链遍历完成。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int ElemType;
typedef struct SeqList {
ElemType* data;
int length;
}SeqList;
//给定两个升序表A和B,求解A∩B(共同元素只能在交集中出现一次)
/*算法思想:指针IndexA和IndexB分别指向表A和表B的第一个元素,如果IndexA所指元素小于IndexB所指元素,则移动IndexA的指针指向下一个元素;
如果IndexA所指元素大于IndexB所指元素,则移动IndexB的指针指向下一个元素;如果两指针指向元素相等,将共同元素保存后,两指针同时移动指向下一个元素,
如果该元素与交集表尾元素不相等,则将其插入交集表中。重复上述步骤,直到A与B其中一条链遍历完成*/
void intersection(SeqList& La, SeqList& Lb) {//共同元素存放到La中
int IndexA = 0, IndexB = 0;
int comLength = 0;
while (IndexA < La.length && IndexB < Lb.length) {
if (La.data[IndexA] < Lb.data[IndexB]) {
IndexA += 1;
}
else if (La.data[IndexA] > Lb.data[IndexB]) {
IndexB += 1;
}
else {
ElemType num = La.data[IndexA];//保存共同元素
IndexA += 1;//两指针同时后移
IndexB += 1;
if (comLength == 0) {//交集表为空,则直接插入交集表
La.data[comLength++] = num;
}
else if (La.data[comLength - 1] != num) {//若交集表中存在元素,则需要比较是否与表尾元素相同,不相同才能插入
La.data[comLength++] = num;
}
}
}
La.length = comLength;//更新La的长度
}
int main()
{
SeqList La, Lb;
int m, n;
scanf("%d %d", &m, &n);
La.length = m;
Lb.length = n;
La.data = (ElemType*)malloc(sizeof(ElemType) * (m + n));
Lb.data = (ElemType*)malloc(sizeof(ElemType) * n);
//注意输入格式
for (int i = 0; i < La.length; i++) {
scanf("%d", &La.data[i]);
}
for (int i = 0; i < Lb.length; i++) {
scanf("%d", &Lb.data[i]);
}
intersection(La,Lb);
for (int i = 0; i < La.length; i++) {
printf("%d ", La.data[i]);
}
return 0;
}