【oj刷题记】【考研写法】【1295】【两重循环遍历链表】【一元多项式的乘法】

 

 

 

 

#include <bits/stdc++.h>
using namespace std;
int n,m;
struct Node
{
	int expn;
	int coef;
	Node *next;
	Node(){}
	Node(int key1,int key2):expn(key1),coef(key2),next(NULL){}
}; 


void init(Node* &l,int n)
{
	Node *p=l;
	for(int i=1;i<=n;i++)
	{
		int expn,coef;
		cin>>coef>>expn;
		Node *now=new Node(expn,coef);
		
		while(p->next && (p->next->expn < now->expn))
		{
			p=p->next;
		}
		
		if(p->next&&p->next->expn==now->expn)  //如果指数相同 
		{
			p->next->coef+=now->coef;
		}
		else   //如果指数不同 
		{
			now->next=p->next;
			p->next=now;
		}
	}
}


//实现链表的二重for循环 
Node* mult(Node* &la,Node* &lb)
{
	//定义答案链表
	Node *h=new Node();
	h->next=NULL; 
	
	
	//两重循环实现la链表与lb链表的相乘
	Node *p1=la->next,*p2=lb->next; 
    for(Node *p1=la->next;p1;p1=p1->next)  //枚举第一项 
    for(Node *p2=lb->next;p2;p2=p2->next)  //枚举第二项 
	{
	    int ex1,ex2;
		int cep1,cep2;
		ex1=p1->expn;
		cep1=p1->coef;
		ex2=p2->expn;
		cep2=p2->coef;
		
		//cout<<ex1<<" "<<cep1<<"---"<<ex2<<" "<<cep2<<endl;
		
		//实现两项相乘合并为一个项,把该项存起来 
		int ex=ex1+ex2;    //指数相加 
		int cep=cep1*cep2;  //系数相乘 
		Node* now=new Node(ex,cep);
		
		
		//两项已经合并为一项了,看看放在答案链表的哪一项 
		Node *p=h;  //找要找节点的前一个节点 ,所以不是 p=h->next
		while(p->next&&p->next->expn>now->expn)
		{
			p=p->next;
		}
	
		if(p->next&&p->next->expn==now->expn)  
		{
			p->next->coef+=now->coef; 
		}
		else
		{
			now->next=p->next;
			p->next=now;
		}
	}

	
	return h;
}


void traverse(Node *h)
{
	for(Node *p=h->next;p;p=p->next)
	{
		cout<<p->coef<<" "<<p->expn<<" ";
	}
	cout<<endl;
}

int main()
{
	Node *la=new Node(),*lb=new Node();
	la->next=NULL;
	lb->next=NULL;
	cin>>n;
    init(la,n); 
	cin>>m; 
	init(lb,m);
	
	Node *h=mult(la,lb);
	traverse(h);
	
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值