给定两个升序表A和B,求解A∩B(共同元素只能在交集中出现一次)

算法思想:指针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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值