任务描述
一元多项式可以通过记录一元多项式各项的指数和系数值,使用按指数升序排列的线性表进行存储。本关使用带头结点升序排列单链表存储一元多项式,并实现两一元多项式的加法和乘法运算。输入n(1<=n<=100),按指数升序顺序输入第一个一元多项式中n项指数和系数,输入m1<=m<=100),按指数升序顺序输入第二个一元多项式中m项指数和系数。然后按照特定格式输入出两一元多项式的和与乘积结果。 例如:第一个一元多项式
第二个一元多项式
则输入为:
3 1 1 2 3 4 5
2 2 2 7 -2
则输出为(输出函数已实现):
和:1x^1+5x^2+5x^4-2x^7
积:2x^3+6x^4+10x^6-2x^8-6x^9-10x^11
相关知识
具有n项的一元多项式可以表达为:a1xb1 +a2xb2 +a3xb3+……+anxbn,其中第i项可以表示为aixbi,即指数为bi,系数为ai。可以定义一个结构体类型,对指数和系数信息进行封装,例如
struct datatype
{
float zhishu;
float xishu;
};
则整个n项的一元多项式,就可以使用包含n个datatype型的元素的线性表来表示,如:{ (a1,b1),(a2,b2),(a3,b3),……,(an,bn)},线性表按指数升序有序。
若使用带头结点的单链表存储以上线性表,则可以先定义链表的结点结构如下:
struct node
{
datatype data;
node* next;
};
该链表的图示表示为:
一元多项式的相关操作包括:
*(1) 一元多项式中加一项addA(node h, datatype t)**
一元多项式中加一项需要考虑三种情况:
情况1:在原一元多项式中,不存在与新增项的指数相同的指数项,则按照指数升序顺序进行项的插入即可。
例如:原一元多项式:
新增项:
情况2:在原一元多项式中,存在与新增项的指数相同的指数项,且相同指数的两项的系数之和不等于零,则修改原有一元多项式中该项的系数为两项之和即可。
例如:原一元多项式:
新增项:
情况3:在原一元多项式中,存在与新增项的指数相同的指数项,且相同指数的两项的系数之和等于零,则删除原有一元多项式中指数相同的项。
例如:原一元多项式:
新增项:
(2) 两一元多项式相加:addS(node* a, node* a)
两个一元多项式a和b相加,结果存于c中,即c=a+b
在实现了一元多项式中加一项的addA()函数后,两个一元多项式的相加算法为:
1)初始化c为带头结点的空链表;
2)循环遍历a中的各项,并根据各项的指数和系数数据,在c多项式中增加项;
3)循环遍历b中的各项,并根据各项的指数和系数数据,在c多项式中增加项;
4)返回c的头指针;
(3) 两一元多项式项相乘:mutiply(node* a, node* a)
两个一元多项式a和b相乘,结果存于c中,即c=a*
b
在实现了一元多项式中加一项的addA()函数后,两个一元多项式的相乘算法为:
1)初始化c为带头结点的空链表;
2)双重循环遍历a和b中的各项,并根据各项的指数和系数数据,计算两多项式中任意两项的乘积(系数相乘,指数相加),并把乘积项通过addA()函数增加到c多项式中;
3)返回c的头指针;
编程要求
本关的编程任务是补全step7/polynomailList.h
文件中的addA()、addS()、multiply()
函数,分别实现一元多项式的加一项、两一元多项式相加、两一元多项式相乘的功能。三个函数的具体说明如下:
// 函数addA:一元多项式加一项
// 参数:h-一元多项式链表表头指针,t-待加项的数据,包含系数和指数
// 返回值:一元多项式链表表头指针
node* addA(node* h, datatype t);
// 函数addS:两个一元多项式相加 // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针 // 返回值:c=a+b多项式链表表头指针 node* addS(node* a, node* b);
// 函数multiply:两个一元多项式相乘 // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针 // 返回值:c=ab一元多项式链表表头指 node multiply(node* a, node* b);
评测说明
本关中包含两个文件分别是: step7/polynomailList.h :此文件为学员文件,包含一元多项式链表的操作函数说明与实现,其中addA() addS() multiply()为学员待实现函数。 step7/test.cpp:此文件为评测文件(含main函数),引用“polynomailList.h”,主要用于输入两一元多项式数据,并进行加法和乘法运算,并输出结果。 (上述两个文件可通过点击在代码取的右上角文件夹中的step7文件夹中查看)
输入输出说明
输入n(1<=n<=100),输入第一个一元多项式n项中各项的指数和系数,输入m(1<=m<=100),输入第一个一元多项式n项中各项的指数和系数,输出两一元多项式的和与积如下所示:(注意:一元多项式的和积的输出函数已经实现,详情请阅读step7文件夹中的文件。)
测试输入: 3 1 1 2 3 4 5 2 2 2 7 -2 预测输出: 和:1x^1+5x^2+5x^4-2x^7 积:2x^3+6x^4+10x^6-2x^8-6x^9-10x^11
测试输入: 2 1 3 2 -2 2 1 -3 3 1 预测输出: 和:-2x^2+1x^3 积:-9x^2+6x^3+3x^4-2x^5
#include "linkList.h" node* addA(node* h, datatype t); node* addS(node* a, node* b); node* multiply(node* a, node* b); // 函数addA:一元多项式加一项 // 参数:h-一元多项式链表表头指针,t-待加项的数据,包含系数和指数 // 返回值:一元多项式链表表头指针 node* addA(node* h, datatype t) { // 请在此添加代码,补全函数addA /********** Begin *********/ node* p = new node; p = h; while (p->next != NULL && p->next->data.zhishu < t.zhishu)//找位置 { p = p->next; } if (p->next == NULL)//新增指数最大则插尾部 { node* n = new node; n->data = t; n->next= NULL; p->next = n; } else { if (p->next->data.zhishu == t.zhishu)//指数相等 { p->next->data.xishu += t.xishu;//系数相加 if (p->next->data.xishu == 0)//系数为0 { node* k = p->next;//删除节点 p->next = k->next; free(k); } } else//不存在相同的指数按升序插入 { node* n = new node; n->data = t; n->next = NULL; node* m = p->next; p->next = n; n->next = m; } } return h; /********** End **********/ } // 函数addS:两个一元多项式相加 // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针 // 返回值:c=a+b多项式链表表头指针 node* addS(node* a, node* b) { // 请在此添加代码,补全函数addS /********** Begin *********/ node* f = new node; f = a; node* p = new node; p = b; node* newq = new node; newq->next = NULL; node* i = new node; i = newq; while (f->next != NULL && p->next != NULL) { while (i->next != NULL) i = i->next; i->next = new node; if (p->next->data.zhishu < f->next->data.zhishu) { i->next->data.xishu = p->next->data.xishu; i->next->data.zhishu = p->next->data.zhishu; i->next->next = NULL; p = p->next; } else if (p->next->data.zhishu > f->next->data.zhishu) { i->next->data.xishu =f->next->data.xishu; i->next->data.zhishu =f->next->data.zhishu; i->next->next = NULL; f = f->next; } else { i->next->data.xishu = (p->next->data.xishu) + (f->next->data.xishu); i->next->data.zhishu = p->next->data.zhishu; i->next->next = NULL; if (i->next->data.xishu == 0) { node* w = i->next; i->next = w->next; free(w); } p = p->next; f = f->next; } } while (p->next != NULL) { while(i->next!=NULL) i = i->next; i->next = new node; i = i->next; i->data.xishu = p->next->data.xishu; i->data.zhishu = p->next->data.zhishu; i->next = NULL; p = p->next; } while (f->next != NULL) { while(i->next!=NULL) i = i->next; i->next = new node; i = i->next; i->data.xishu = f->next->data.xishu; i->data.zhishu = f->next->data.zhishu; i->next = NULL; f = f->next; } return newq; /********** End **********/ } // 函数multiply:两个一元多项式相乘 // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针 // 返回值:c=a*b一元多项式链表表头指针 node* multiply(node* a, node* b) { // 请在此添加代码,补全函数multiply /********** Begin *********/ node* p = new node; p = a; node* f = new node; f = b; node* new1 = new node; new1->next = NULL; node* r1 = new1; while (p->next != NULL) { r1->next = new node; r1 = r1->next; r1->data.xishu = (p->next->data.xishu) * (f->next->data.xishu); r1->data.zhishu = (p->next->data.zhishu) + (f->next->data.zhishu); r1->next = NULL; p = p->next; }//在新链表new1中,pb的第一项已经与pa各项相乘 f = f->next; p = a; while (f->next != NULL) { node* new2 = new node; new2->next = NULL; node* r2 = new2; /*从q的第二项开始,每一项分别与pa的各项相乘,存到new2中,new1,new2相加即可*/ while (p->next != NULL) { r2->next = new node; r2 = r2->next; r2->data.xishu = (p->next->data.xishu) * (f->next->data.xishu); r2->data.zhishu = (p->next->data.zhishu) + (f->next->data.zhishu); r2->next = NULL; p = p->next; } new1 = addS(new1, new2); f = f->next; p = a; } return new1; /********** End **********/ }