前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >02-线性结构2 一元多项式的乘法与加法运算

02-线性结构2 一元多项式的乘法与加法运算

作者头像
废江_小江
发布2022-09-05 11:14:37
4960
发布2022-09-05 11:14:37
举报
文章被收录于专栏:总栏目

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例: 15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1 5 20 -4 4 -5 2 9 1 -2 0

过程都在代码的注释里

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
//这里我用链表存储数据,我想了想,要写的函数有
//插入函数,输出函数,合并函数,以及相乘函数
typedef struct lnode{
	int coefficient;//顺便学一波英语,coefficient(系数),exponent(指数) 
	int exponent;
	struct lnode *link;
}sqlist;
//后来我想了想应该用尾插法,头插法最后的数据就是倒着的了 
//void insertlist(sqlist*&l,int x,int y){
//	//为了节约时间,初始化直接写在插入函数里面
//	 sqlist*s;//这个是头节点的下一个节点 
//	 l=(sqlist*)malloc(sizeof(sqlist));//这个是头节点 
//	 l->link=NULL;
//	 s=(sqlist*)malloc(sizeof(sqlist));//为接下来的节点开辟一个内存
//	 s->coefficient=x;
//	 s->exponent=y;
//	 s->link=l->link;
//	 l->link=s; 
//}
//-------------------------------------------------------------
//这里我发现用尾插法,头节点可以不需要,后面反而碍事,于是我试着把它去掉 
//-------------------------------------------------------------
void insertlist(sqlist*&l,int n){
	int x,y;
	sqlist*s,*r;
	l=(sqlist*)malloc(sizeof(sqlist));
	r=l;
	for(int i=0;i<n;i++){
//	r->link=NULL;
	s=(sqlist*)malloc(sizeof(sqlist));
	cin>>x>>y;
	s->coefficient=x;
	s->exponent=y;
	r->link=s;
	r=s;
	}
	r->link=NULL;
	//如果必须要头节点,那最后我们可以给头节点删除了
	sqlist*t;
	t=l;
	l=l->link;
	free(t);
}
//---------------------------------------------------
//我最终是终于明白了,所谓必要的头结点是为了寻址而必要的,当我给头结点一开始就删除后,
//用自己作为头结点的话,因为自身本身就是在不断调用,这样链表虽然没有断,却无法用传递参数
//来表示头结点了, 
//之后我发现去掉头节点,只能读入一组数据了,莫名其妙的我也找不出bug 
//----------------------------------------------------- 
//void insertlist(sqlist*&l,int n){ 
//	int x,y;
//	sqlist*r;//这里需要一个指针来作为中介
//	r=(sqlist*)malloc(sizeof(sqlist));//这里加了初始化,但是发现还是不行,链表好像断了 
//	for(int i=0;i<n;i++){
//		l=(sqlist*)malloc(sizeof(sqlist));
//		cin>>x>>y;
//		l->coefficient=x;
//		l->exponent=y;
//		r->link=l;
//		r=l;
//	}
//	r->link=NULL; 
//	l=r->link;
//	free(r);
//}
void displist(sqlist*l){
	sqlist*p=l;
	while(p!=NULL&&p->coefficient<1000000){
		cout<<p->coefficient<<" "<<p->exponent<<" ";
		p=p->link;
	}
	cout<<endl;
}
sqlist* combinelist(sqlist*l,sqlist*p){//conbine(合并) 
	sqlist*q,*r;
	sqlist*s;//头节点 
	s=(sqlist*)malloc(sizeof(sqlist));
	r=s;
	sqlist*t1=l,*t2=p;
	while(t1&&t2){//当t1和t2都不空的时候 
		if(t1->exponent==t2->exponent){
			q=(sqlist*)malloc(sizeof(sqlist));//这里我应该写一个单个值的插入函数,为了省事,就只能让代码遭罪了 
			q->coefficient=t1->coefficient+t2->coefficient;
			q->exponent=t1->exponent;
			r->link=q;
			r=q;
			t1=t1->link;
			t2=t2->link;
		}
		else if(t1->exponent>t2->exponent){
			q=(sqlist*)malloc(sizeof(sqlist));
			q->coefficient=t1->coefficient;
			q->exponent=t1->exponent;
			r->link=q;
			r=q;
			t1=t1->link;
		}
		else{
			q=(sqlist*)malloc(sizeof(sqlist));	
			q->coefficient=t2->coefficient;
			q->exponent=t2->exponent;
			r->link=q;
			r=q;
			t2=t2->link;
		}
	}
	while(t1){
			q=(sqlist*)malloc(sizeof(sqlist));
			q->coefficient=t1->coefficient;
			q->exponent=t1->exponent;
			r->link=q;
			r=q;
			t1=t1->link;
	}
	while(t2){
			q=(sqlist*)malloc(sizeof(sqlist));	
			q->coefficient=t2->coefficient;
			q->exponent=t2->exponent;
			r->link=q;
			r=q;
			t2=t2->link;
	}
	r->link=NULL;
	//如果必须要头节点,那最后我们可以给头节点删除了
	sqlist*t;
	t=s;
	s=s->link;
	free(t);
	return s;
}
//这里我的想法是,每乘一个数,放入一个新的链表中,然后要做的事情是排序,合并同类项
//我又想了想,发现排序根本不可能,于是我想到在插入的时候就应该排序好,并且遍历一遍寻找同类项 
//sqlist* multiply(sqlist*l,sqlist*p){//multiply(相乘)
//	bool bl;
// 	sqlist *t1=l,*t2=p;
// 	sqlist *s,*r;
// 	//这里我还是用尾插法
//	sqlist *head;
//	head=(sqlist*)malloc(sizeof(sqlist));
//	r=head;
//	int coefficient,exponent;
//	while(t1){
//		while(t2){
//			r->link=NULL;
//			coefficient=t1->coefficient*t2->coefficient;
//			exponent=t1->exponent+t2->exponent;
//			//这里开始我们的插入时排序,和插入时合并
//			while(head){
//				//先判断合并
//				bl=1;
//				if(head->exponent==exponent){
//					head->coefficient+=coefficient;//这里有种难ban的情况就是head->cofficient可能会变成0,我先不考虑 
//					bl=0;
//					break;
//				}
//				if(exponent<head->exponent){
//					s=(sqlist*)malloc(sizeof(sqlist));
//					s->coefficient=coefficient;
//					s->exponent=exponent;
//					s->link=head->link;
//					head->link=s;
//					bl=0;
//					break;
//				}
//				head=head->link;	
//			}
//			if(bl){
//				s=(sqlist*)malloc(sizeof(sqlist));
//				s->coefficient=coefficient;
//				s->exponent=exponent;
//				r->link=s;
//				r=s;
//			}
//			t2=t2->link;
//		}
//		t1=t1->link;
//	}
//	r->link=NULL;
//}
sqlist* multiply(sqlist* L1,sqlist* L2){
	sqlist* tmpL1 = L1;
	sqlist* tmpL2 = L2;
	sqlist* mul=(sqlist*)malloc(sizeof(sqlist));
	mul->link = NULL;
	sqlist* head = mul;
	sqlist* t;
	for(;tmpL1;tmpL1=tmpL1->link)
		for(tmpL2 = L2;tmpL2;tmpL2=tmpL2->link){
			t = (sqlist*)malloc(sizeof(sqlist));
			t->coefficient = tmpL1->coefficient* tmpL2->coefficient;  // 系数相乘
			t->exponent = tmpL1->exponent + tmpL2->exponent;  // 指数相加
			t->link = NULL;
			head = combinelist(t,mul);  // 将新增结点和之前已经排好序的结点排序 
			mul = head; // 重新确定开头 
		}
	return head;
}
int main(){
	sqlist *l ,*p;
	int n;
	cin>>n;
	insertlist(l,n);
	cin>>n;
	insertlist(p,n);
//	displist(l);
//	displist(p);
	sqlist *s;
	s=combinelist(l,p);
	displist(s);
	sqlist *m;
	m=multiply(l,p);
	displist(m);
}

很遗憾的是,这个代码我没有写出相乘的操作==

废江博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 转载请注明原文链接:02-线性结构2 一元多项式的乘法与加法运算

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-01),如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 过程都在代码的注释里
  • 很遗憾的是,这个代码我没有写出相乘的操作==
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档