线性结构2 一元多项式的乘法与加法运算 浙大pat
02-线性结构2 一元多项式的乘法与加法运算(20 分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
#include <iostream>
using namespace std;
typedef struct PolyNode *Polynomial; //定义一元多项式结构体
struct PolyNode{
int coef;
int index;
Polynomial next;
};
int compare(int c,int e) //比较指数大小
{
if (c > e) return 1; //作为switch情况
else if (c < e) return -1;
else return 0;
}
Polynomial ReadPoly() //
{
int N;
cin>>N;
Polynomial head = new struct PolyNode;
Polynomial rear = head;
for(int i = 0;i < N;i++) //尾插法建立单链表(带头结点)
{
int c,e;
cin>>c>>e;
Polynomial s = new struct PolyNode; //申请一个空结点
s->coef = c;
s->index = e;
rear->next = s; //尾插法
rear = s;
}
rear->next = NULL;
return head;
}
Polynomial Add(Polynomial P1,Polynomial P2) //其实仔细想想很简单,草稿纸上画好草图就很容易出来啦!
{
Polynomial p1 = P1->next; //因为写的链表带头结点,所以比较时要初始化工作指针到开始结点,再比较两多项式指数大小;
Polynomial p2 = P2->next;
Polynomial head = new struct PolyNode;
Polynomial rear = head; //尾插法生成 Polynomial add_P1_P2 前建立一个带有头指针和尾指针的空结点;
while(p1 && p2)
{
Polynomial s = new struct PolyNode;
switch(compare(p1->index,p2->index))
{
case -1:
s->index = p2->index;
s->coef = p2->coef;
rear->next = s;
rear = s;
p2 = p2->next;
break;
case 1:
s->index = p1->index;
s->coef = p1->coef;
rear->next = s;
rear = s;
p1 = p1->next;
break;
case 0:
s->coef = p1->coef + p2->coef;
s->index = p1->index;
rear->next = s;
rear = s;
p1 = p1->next;
p2 = p2->next;
break;
}
}
rear->next = p1?p1:p2;
return head;
}
void PrintPoly(Polynomial P)
{
int flag = 0; //辅助变量,刚输入多项式第一项时,flag=0,代表第一项
Polynomial q = P->next;
if(q==NULL)
{
cout<<"0 0"<<endl;
return;
}
while(q)
{
if(flag==0) flag = 1;
else
{
cout<<" "<<q->coef<<" "<<q->index; //后面无空格,相当于:空格 系数 指数 空格 系数 指数 输出
q = q->next;
}
}
cout<<endl;
}
Polynomial Mult(Polynomial P1,Polynomial P2)
{
Polynomial p1,p2,rear;
Polynomial head = new struct PolyNode;
rear = head;
p1 = P1->next;
p2 = P2->next;
if(!p1||!p2) return NULL; //判空
while(p2) //先用P1多项式的第一项乘以P2的每一项,再用尾插法建立链表储存
{
Polynomial s = new struct PolyNode;
s->coef = p1->coef * p2->coef;
s->index = p1->index + p2->index;
rear->next = s; //尾插法
rear = s;
p2 = p2->next;
}
p1 = p1->next;
while(p1) //将P1第二个结点与P2的每一项相乘再加到前面的多项式中
{
p2 = P2->next; //P2循环比较乘一次后,工作指针p2回到开始结点。
rear = head;
while(p2)
{
int c = p1->coef * p2->coef;
int e = p1->index + p2->index;
while(rear->next && rear->next->index > e) //这时应该分3种情况:1.相乘后指数 <
rear = rear->next;
if(rear->next&&rear->next->index == e) // 2.指数 =
{
if(rear->next->coef + c) // 这里有个细节:需要判断系数相加是否为0,不为0,系数相加后保存,指数不变。
rear->next->coef += c;
else //若指数相加为0,则删除该结点并将rear更新
{
Polynomial t = rear->next;
rear->next = t->next;
delete t;
}
}
else // 3.指数 > 则插入。
{
Polynomial z = new struct PolyNode;
z->coef = c;
z->index = e;
z->next = rear->next;
rear->next = z;
rear = rear->next;
}
p2 = p2->next;
}
p1 = p1->next;
}
return head;
}
int main()
{
Polynomial P1 = ReadPoly();
Polynomial P2 = ReadPoly();
PrintPoly(P1);
PrintPoly(P2);
Polynomial add_P1_P2 = Add(P1,P2);
Polynomial mul_P1_P2 = Mult(P1,P2);
PrintPoly(mul_P1_P2);
PrintPoly(add_P1_P2);
}