6.求序列的交集(链表)

问题描述 :
使用带头结点的单链表编程:
有两个序列,分别表示两个集合。
求它们的交集并输出。

输入说明 :
第一行输入序列A的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
第一行输入序列B的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据

输出说明 :
输出交集的元素序列,输出格式见范例。
如果交集为空,则输出“head–>tail”
交集里的元素顺序,依照其在序列A中的顺序。

比如:
序列:
A:5 3 2 7
B:1 3 5 8

则交集为5和3,因为在序列A中,5在3的前面,所以在交集里5也在3的前面。

输入范例 :
4 5 3 2 7
4 1 3 5 8

输出范例 :
head–>5–>3–>tail

#include<iostream>
using namespace std;

struct ListNode {
	int num;
	ListNode *next;
};

ListNode *createByTail(int n) {
	ListNode *head,*p1,*p2;
	int i = 0,num;
	head = new ListNode;
	head->next = NULL;
	p2 = head;
	while(i < n) {
		cin>>num;
		p1 = new ListNode;
		p1->num = num;
		p2->next = p1;
		p2 = p1;
	}
	p2->next = NULL;
	return head;
}

//求A和B的交集
//每遍历一个A中的元素就去B中找出是否有相同的元素,如果有的话,将当前A中指向的元素加入新链表中
ListNode *intersect(ListNode *A,ListNode *B) {
	ListNode *pa = A->next,*pb;
	ListNode *s,*p;
	s = A;	
	A->next = NULL;	//将A置为空链表,使之成为新链表
	while(pa) {
		p = pa;
		pb = B->next;
		while(pb && pb->num != pa->num) {
			pb = pb->next;
		}
		//在B中找到了与pa相同的元素,将其插入新的链表中
		if(pb) {
			s->next = p;
			s = p;
		}
		p = p->next;
		
	}
	s->next = NULL;
	return A;
}

void  displayLink(struct ListNode *head)
{
     struct ListNode *p;
	 p=head->next;
     printf("head-->");
     while(p!= NULL)
     {
         printf("%d-->",p->num);
         p=p->next;

     }
     printf("tail\n");

}

int main(void)
{
	ListNode *A,*B;
	int alen,blen;
	cin>>alen;
	A = createByTail(alen);
	cin>>blen;
	B = createByTail(blen);
	//displayLink(A);
	//displayLink(B);
	A = intersect(A,B);
	displayLink(A);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值