(C语言)加法运算实验报告
一元多项式的加法运算
需求分析
程序的基本功能
按照指数升序次序,输入并建立多项式A与B。
计算多项式A与B的和,即建立多项式A+B。
按照指数升序次序,输出多项式A、B、A+B。
输入输出要求:
输入多项式;
确定多项式的项数,按照指数递增的顺序依次输入系数不为0的子项,当输入个数与预期相同时结束输入。
输出多项式:
当链表为空时,链表不为空且只有一个结点并且数据为0时,直接输出0;链表(至少有两个结点)不为空且第一个结点为0时,直接输出第二个结点;当结点存在时,输出结点。输出形式类似于数学表达式。
要求:
系数值为1的非零次项的输出形式中略去系数1;
指数为0的项输出形式中略去指数部分;
多项式的第一项的系数符号为正时,不输出“+”,其他项要输出“+”、“-”符号。
测试数据
①(x+x^3)+(-x-x^3)=0;
②(x+x^100)+(x^100+x^200)= x+x^100+x^200;
③(x+x^2+x^3)+0= x+x^2+x^3;
④(3x^-3-x+4.1x^2-1.2x^9)+(-3x^-3-5.1x^2+7.8x^12)=-x-x^2-1.2x^9+7.8x^12;
概要设计
抽象数据类型的定义:
对于一元n次多项式而言,每一项都由系数和指数两部分组成,因此可将多项式抽象成一个由“系数、指数”构成的线性表,其中多项式的每一个系数非零的子项作为线形表中的一个元素。因此,定义一个带头结点的单链表来表示一元多项式。
主模块的流程及各子模块的主要功能:
①主函数模块:
int main()
{
定义A、B两个链表指针;
链表初始化;
输入A、B;
输出A、B;
输出A+B;
}
②输入模块:
PolyLink input(PolyLink A)
{
按指数递增的顺序,依次输入多项式的各个子项,并插入到多项式链表中;
}
加法模块:
PolyLink add(PolyLink A,PolyLink B)
{
对于两个多项式中指数相同的子项,其系数相加,若系数非零,则构成“和多项式”中的一项;对于指数不同的项,直接构成“和多项式”中的一项;
}
结点输出模块:
void output(PolyNode *p)
{
按照系数为-1、1及其它与指数为0、1及其它分情况输出不同表达形式;
}
链表输出模块:
viod result(PolyLink A)
{
当链表为空时,输出0;链表不为空时,输出第一个结点,之后的结点输出时,在前面加上相应的正负号;
}
链表初始化:
{
对定义的链表申请空间进行初始化;
}
模块之间的层次关系:
详细设计
定义的相关数据类型:
typedef struct pnode
{
float data;
int exp;
struct pnode *next;
}PolyNode,*PolyLink;
函数的调用关系:
调试分析
调试中遇到的问题及对问题的解决方法:
⑴遇到的问题:
①运行加法时出现内存不足导致程序无法进行;
②当链表为空时无法正常输出结果0;
③当链表为0时,做加法时输出结果仍会出现0;
④某些情况下输出的结果不符合数学表达式。
⑵解决方法:
进行链表的初始化,使链表;
当链表为空时,输出0后然后结束程序。无法正常输出结果是因为指令不明确,p=p->next无法执行;
结点输出时分类不全面,增加分类即可;
算法的时间复杂度:
假设两个多项式分别有m项和n项,建立多项式时,时间复杂度为o(m+n),两个多项式相加的循环执行次数最多有m+n次,时间复杂度为o(m+n),因此,时间复杂度为o(m+n)。
使用说明及测试结果
使用说明:
输入第一个多项式的项数并按指数递增的顺序输入;
输入第二个多项式的项数并按指数递增的顺序输入;
程序运行界面如下:
测试结果:
①输入A=x+3x^6-8x^11
输入B=6-3x^6+21x^9
输出A+B=6+x+21x^9-8x^11
②输入A=x+x^3
输入B=-x-x^3
输出A+B=0
③输入A=x+x^100
输入B=x^100+x^200
输出A+B=x+2x^100+x^200
④输入A=x+x^2+x^3
输入B=0
输出A+B=x+x^2+x^3
源程序
#include
#include
typedef struct pnode
{
float data;
int exp;
struct pnode *next;
}PolyNode,*PolyLink;
PolyLink Ini_polynode() //链表的初始化;
{
Pol