PTA 一元多项式的乘法与加法运算 思路分析及代码解析 v0.93

一、前导

1. 需要掌握的知识

  1. 链表
  2. 一元多项式

2. 题目信息

  1. 题目来源:PTA / 拼题A
  2. 题目地址: 一元多项式的乘法与加法运算

二、解题思路分析

1. 题意理解

  1. 输入数据
4 3 4 -5 2  6 1  -2 0  //第一个一元多项式:首数字4表示多项式非零项的个数,随后以指数递降的方式,输入多项式非零项系数和指数
3 5 20  -7 4  3 1	//第二个一元多项式
  1. 输出数据
    结尾不能有多余空格,另外,如果运算结果为0,输出 0 0
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 //两个多项式加法运算的结果
  1. 题意
    编程进行一元多项式的乘法和加法运算并打印结果

2. 思路分析(重点)

本题锻炼链表的基本使用:创建和插入,插入函数是AC的重点

三、具体实现

1. 弯路和bug

  1. 通过链表存储数据和操作数据时,需要更细致一些,避免指向错误的位置

2. 代码框架(重点)

2.1 采用的数据结构

链表:解法选择了表头不存储数据

#define Null -1
typedef struct polynomial *PtrPoly;
struct polynomial //一元多项式按指数递降的方式进行存储
{
   
   
	int coefficient; //系数
	int exponent; //指数
	PtrPoly next; //多项式的下一个非零项
};

2.2 程序主体框架

               程序伪码描述
int main()
{
   
   	
	0.根据录入数据形成两个链表
	1.将运算结果看成一个空链表,将数据逐项插入到这个空链表中
	2.多项式乘法可以看做两层循环,分别执行系数相乘、指数相加
	3.多项式加法较简单,若指数相等则系数相加
	4.打印输出
}

2.3 各分支函数

  1. Insert( ) 核心函数,本题的核心就是考察’将数据插入到链表的合适位置’。对于一元多项式,插入时分为三种情况:
    (1)插入数据的指数 相较 当前链表指向数据的指数 小
    (2)插入数据的指数 大
    (3)插入数据的指数 相等
    由于是按指数递降的方式存储,当插入数据的指数较小时,说明还未找到合适位置,链表指向需要向后移动,直到满足插入数据的指数 大于等于 当前链表指向数据的指数。这里需要仔细想一下
PtrPoly Insert(PtrPoly result,PtrPoly Element) 
{
   
   
	PtrPoly head,tmp,a; //a 是 插入数据 Element的拷贝 
	head = result; //result 是运算结果,head记录链表的头元素
	
	a=(PtrPoly)malloc(sizeof(struct polynomial));
	a->coefficient=Element->coefficient;
	a->exponent=Element->exponent;
	a->next=NULL; 
	
	while( result->next && a->exponent < result->next->exponent ) //插入数据的指数小,执行循环。直到result->next为空 或者 插入数据的指数较大或相等
		result=result->next;	
	
	if(!result->next) 
	{
   
   
		a->next=result->next;
		result->next=a;	
	}
	else
	{
   
   			
		if(a->exponent > result->next->exponent) //插入数据的指数大,找到位置 
		{
   
   
			a->next=result->next;
			result->next=a;
		}
		else if(a->exponent==result->next->exponent) //插入数据的指数相等 
		{
   
   
			result->next->coefficient=result->next->coefficient + a->coefficient;
			if(!result->next->coefficient) 
			{
   
   
				tmp=result->next;
				result->next=tmp->next;
				free(tmp);
			}
		}
	}
	return head;
	
}
  1. CreatePolynomial( ) 根据录入数据存储一元多项式并形成链表。锻炼创建链表的基本功
#define Null -1
PtrPoly CreateNode() //创建一个结点
{
   
   
	PtrPoly tmp;
	tmp=(PtrPoly)malloc(sizeof(struct polynomial));
	tmp->coefficient=Null;
	tmp->exponent=Null;
	tmp->next=NULL;
	return tmp
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值