已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A与B的交集,并存放在A链表中。(语言C++:)

通过第三个链表来保存交集的值。最终的是指针的理解和运用。

 

#include<iostream> 
using namespace std;

//创建结构体 
typedef struct PNode{  
    int val;  	//指数 
    struct PNode  *next;	//指针域 
}PNode,*lb; 

//创建链表及链表内容递增排序 
void CreateList(lb &P,int n){
	lb s,pre,q;
	P=new PNode;
	P->next=NULL;
	for(int i=1;i<=n;++i)
	{
		s=new PNode;
		cin>>s->val;
		pre=P;
		q=P->next;
		while(q&&q->val<s->val){
			pre=q;
			q=q->next; 
		} 
		s->next=q;
		pre->next=s;
		
	}
}
//输出每个链表内容 
void declare(lb L){
	PNode *p;
	p=L->next;
	cout<<":";
	while(p){			//循环输出链表 
	cout<<p->val<<" ";
	p=p->next;
	}
}
//求公共交集部分 
void publiclist(lb &LA,lb &LB,lb &LC)				//链表A和链表B,链表C保存交集再赋值给链表A 
{
    PNode *pa;PNode *pb;PNode *pc;PNode *p;			//定义四个指针 
    pa=LA->next;									//把链表A的初值赋给指针pa 
	pb=LB->next;									//把链表B的初值赋给指针pa 
    LC=LA;											//把链表A赋给链表C 
    pc=LC;											//链表C的初值赋给指针pc 
    while(pa&&pb)									//pa和pb不能为空 
    {
        if(pa->val==pb->val)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
            pb=pb->next;
        }
        else if (pa->val<pb->val)
            pa=pa->next;
        else
            pb=pb->next;
    }
    pc->next=NULL;
    LA=LC;
    delete LB;
}
 
int main()
{
	lb LA;lb LB;lb LC;int n;	//定义结构指针变量A,B,C(变量C是保存公共部分) 
	cout<<"请输入创建的A集合元素的个数:"<<endl;
	cin>>n;						//输入链表A包含的个数 
	cout<<"请依次存入的数据:"<<endl;
	CreateList (LA,n);			//输出链表B的内容 
 
 
	cout<<"请输入创建的B集合元素的个数:"<<endl;
	cin>>n;						//输入链表B包含的个数 
	cout<<"请依次存入的数据:"<<endl;
	CreateList (LB,n);			//输出链表B的内容 
 
 
	cout<<"集合A为:";
	declare(LA);			//输出链表A 
	cout<<"集合B为:";
	declare(LB);			//输出链表B 
 
	publiclist(LA,LB,LC);		//公共部分交集 
	cout<<"二者的交集为:";
 
	declare(LA);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值