7-2 一元多项式的乘法与加法运算 (20 分)_Beworth1207的博客-程序员秘密

技术标签: 数据结构与算法  

 

 

#include <cstdio>
#include <cstdlib>
// 多项式相乘 相加
// 数据结构设计
typedef struct PolyNode *Polynomial;
struct PolyNode
{
	int coef;
	int expon;
	Polynomial link;
}; 

Polynomial ReadPoly();
void Attach(int c, int e, Polynomial *pRear);
Polynomial Add(Polynomial P1, Polynomial P2);
Polynomial Mult(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);
int Compare(int a, int b);

// 程序框架搭建
int main()
{
	Polynomial P1, P2, PP, PS;
	
	P1 = ReadPoly();
	P2 = ReadPoly();
	PP = Mult(P1, P2);
	PrintPoly(PP);
	PS = Add(P1, P2);
	PrintPoly(PS);
	
	return 0;
} 

// 如何读入多项式
Polynomial ReadPoly()
{
	Polynomial P, Rear, t;
	int c, e, N;
	 
	scanf("%d", &N);
	P = (Polynomial)malloc(sizeof(struct PolyNode));	// 链表头空节点 
	P->link = NULL;
	Rear = P;
	while(N --)
	{
		scanf("%d %d", &c, &e);
		Attach(c, e, &Rear);	// 将当前项插入多项式尾部 
	}
	t = P;
	P = P->link;
	free(t);	// 删除临时生成的头结点 
	return P;
} 

void Attach(int c, int e, Polynomial *pRear)
{
	Polynomial P;
	
	P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->coef = c;	// 对新结点赋值 
	P->expon = e;
	P->link = NULL;
	(*pRear)->link = P;
	*pRear = P;	// 修改pRear的值 
}

int Compare(int a, int b)
{
	if(a > b)	return 1;
	else if(a < b)	return -1;
	else	return 0;
}

// 多项式相加
Polynomial Add(Polynomial P1, Polynomial P2)
{
	Polynomial P, Rear, t, t1, t2;
	t1 = P1; t2 = P2;
	P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->link = NULL;
	Rear = P;
	while(t1 && t2)
	{
		switch(Compare(t1->expon, t2->expon))
		{
			case 1:
				Attach(t1->coef, t1->expon, &Rear);
				t1 = t1->link;
				break;
			case -1:
				Attach(t2->coef, t2->expon, &Rear);
				t2 = t2->link;
				break;
			case 0:
				if(t1->coef + t2->coef)	Attach(t1->coef + t2->coef, t1->expon, &Rear);
				t1 = t1->link;
				t2 = t2->link;
				break;
		}
	}
	for(; t1; t1 = t1->link)	Attach(t1->coef, t1->expon, &Rear);
	for(; t2; t2 = t2->link)	Attach(t2->coef, t2->expon, &Rear);
	Rear->link = NULL;
	t = P;
	P = P->link;
	free(t);
	return P;
} 

// 多项式相乘
Polynomial Mult(Polynomial P1, Polynomial P2)
{
	Polynomial P, Rear, t1, t2, t;
	int c, e;
	
	if(!P1 || !P2)	return NULL;
	
	t1 = P1; t2 = P2;
	P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->link = NULL;
	Rear = P;
	while(t2)
	{
		Attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);
		t2 = t2->link;
	}
	t1 = t1->link;
	 
	while(t1)
	{
		t2 = P2; Rear = P;
		while(t2)
		{
			e = t1->expon + t2->expon;
			c = t1->coef * t2->coef;
			while(Rear->link && Rear->link->expon > e)
				Rear = Rear->link;
			if(Rear->link && Rear->link->expon == e)
			{	// 指数的系数相等 
				if(Rear->link->coef + c)
					Rear->link->coef += c;
				else {
					t = Rear->link;
					Rear->link = t->link;
					free(t);
				}	
			}
			else	// 指数的系数不相等 
			{
				t = (Polynomial)malloc(sizeof(struct PolyNode));
				t->coef = c;
				t->expon = e;
				t->link = Rear->link;
				Rear->link = t;
				Rear = Rear->link;
			}
			t2 = t2->link; 
		}
		t1 = t1->link;
	}
	t2 = P;
	P = P->link;
	free(t2);
	
	return P;
} 

// 如何将多项式输出
void PrintPoly(Polynomial P)
{
	int flag = 0;	// 辅助调整输出格式用 
	
	if(!P)	
	{
		printf("0 0\n");
		return ;
	}
	
	while(P)
	{
		if(!flag)	flag = 1;
		else	printf(" ");
		
		printf("%d %d", P->coef, P->expon);
		P = P->link;
	}
	printf("\n");
} 

  

转载于:https://www.cnblogs.com/mjn1/p/11448325.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Beworth1207/article/details/102291973

智能推荐

什么是Extreme Programming(极限编程,简称XP)_fuweibo的博客-程序员秘密

                                               什么是Extreme Programming(极限编程,简称XP)                                                       来源:chinaxp  http://www.xpchina.org     waltson     Extreme Prog

微信公众号(测试号)消息模板推送_微信接口测试号推送文字限制_Peter Pan 1231的博客-程序员秘密

微信公众号(测试号)消息模板推送源码地址 https://github.com/panjianlong13/Weixin-PushMessage微信测试号配置登录到微信公众平台接口测试账号申请URL,微信扫码登录http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login登录后进入到测试号管理界面,此处appID...

详解Jpa动态复杂条件查询,查询指定字段、并包括sum、count、avg等数学运算,包括groupBy分组_jpa sum查询_天涯泪小武的博客-程序员秘密

Jpa是我一直推荐在Springboot及微服务项目中使用的数据库框架,并由于官方的并不是十分友好和易用的api,导致很多人使用起来并不方便,下面就来展示一下我对api进行了封装后的代码。大大减轻了使用难度。效果展示首先我们直接来看最终的结果:譬如有个entity叫PtActivity,它有一个Repository。public interface PtActivityRepos...

国内首本IntelliJ IDEA软件开发与应用手册,GitHub已收获百万点赞_idea软件开发与应用 pdf_ikt4435的博客-程序员秘密

为什么要写这篇文章?IntelliJ IDEA简称IDEA,是Java语言的集成开发环境,在业界被公认为是最好的Java开发工具之一。IntelliJ IDEA是JetBrains公司的主要产品,除了IntelliJ IDEA之外,像PHPStorm、PyCharm、WebStorm等优秀的开发工具也是这家公司的产品。下面给大家分享一份从阿里大佬手中得到的《IntelliJ IDEA软件开发与应用手册》IntelliJ IDEA软件开发与应用手册第1章Intell

23种设计模式_tianxiaojie_blog的博客-程序员秘密

设计模式设计模式之工厂方法模式不使用工厂方法模式的应用使用工厂方法模式的应用举一个简单的例子:汽车工厂程序源码下所示运行结果设计模式之command模式(命令模式)不使用命令 模式的应用使用命令 模式的应用Command模式可应用于举一个简单的例子:开门程序源代码程序运行结果设计模式之工厂方法模式所谓工厂方法模式,就是在父类提供一个创建接口或者创建抽象函数,然后在子类去实现它,并且返回子类所“...

随便推点

JDK 11 最新 JEP 提案:计划支持 TLS 1.3_redditnote的博客-程序员秘密

(点击上方公众号,可快速关注)转自:开源中国JDK 11 最近有什么消息?我们不妨来看一下它的进展情况,包括最新的 JEP 提案。Java 的新版本发布计划意味着总会有一...

lightgbm错误_小邱ing的博客-程序员秘密

运行lgb的时候出现的错误,网上查到原因可能为两个:1.版本过新(但是我找不到回退版本的方法);2.特征中有特殊符号(但是在同样的情况下我用另外一套lightgbm代码是没问题的)。然后我在运行错误语句之前加了ss = MinMaxScaler()x_train = ss.fit_transform(x_train, y_train)x_test = ss.transform(x_t...

MPAndroidChart的使用_android 导入mpandroidchart default activity not foun_zhenggy_的博客-程序员秘密

MPAndroidChart的使用简介:一个可以拖动缩放的图表库,包含曲线图、直方图、饼状图,其中直方图支持3d效果。项目地址:https://github.com/PhilJay/MPAndroidChartLineChart使用的最简操作:1.新建项目-->导包(资源地址 http://download.csdn.net/detail/ash_zheng/9136061)

CRC-8-SAE J1850 的校验程序_alfslfdsl的博客-程序员秘密

u8 CRC8(u8 *u8_data,u8 u8_len){u8 i, j;u8 u8_crc8;u8 u8_poly;u8_crc8 = 0xFF;u8_poly = 0x1D;for (i = 0; i &lt; u8_len; i++){u8_crc8 ^= u8_data[i];for (j = 0; j &lt; 8; j++){if (u8_crc...

Cactus, 无侵入式Java程序探测工具_NichenFly的博客-程序员秘密

Cactus, 无侵入式程序探测工具已注册程序列表浏览文件在线探测Class更新查看一下应该生成的文件?确认一下正在运行的代码?瞅一眼程序运行需要的文件?检查一下程序运行时各变量正常?需要更新几行代码还不想重启程序?已注册程序列表浏览文件浏览文件,可以对文件进行下载,目录进行打开,对于常见的文件类型,比如图片、shell脚本等,还支持在线查看在线探测在线探测类列表,列表最多展示100个类,如果当前列表中没有需要探测的类,可以使用搜索功能,支持模糊搜索。在列表中展示了当前JV.

推荐文章

热门文章

相关标签