浙大版《数据结构(第2版)》题目集-习题3.6 一元多项式的乘法与加法运算 (20分)
程序员文章站
2022-06-10 19:18:07
...
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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<stdio.h>
#include<stdlib.h>
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
void Attach(int c,int e,Polynomial *tail);
void printPoly(Polynomial P);
Polynomial ReadPoly();
Polynomial Mult(Polynomial P1,Polynomial P2);
Polynomial Add(Polynomial P1,Polynomial P2);
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,head,tail;
p=(Polynomial)malloc(sizeof(struct PolyNode));
p->link=NULL;
head=tail=p;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int c,e;
scanf("%d%d",&c,&e);
Attach(c,e,&tail);
}
return head;
}
void Attach(int c,int e,Polynomial *tail)
{
Polynomial p;
p=(Polynomial)malloc(sizeof(struct PolyNode));
p->link=NULL;
p->coef=c;
p->expon=e;
(*tail)->link=p;
*tail=p;
}
void printPoly(Polynomial P)
{
Polynomial t=P;
int flag=0;
if(t->link==NULL)
{
printf("0 0\n");
return;
}
while(t->link)
{
if(!flag)
flag=1;
else
printf(" ");
printf("%d %d",t->link->coef,t->link->expon);
t=t->link;
}
printf("\n");
}
Polynomial Add(Polynomial P1,Polynomial P2)
{
Polynomial t1,t2,p,head,tail;
t1=P1->link;
t2=P2->link;
p=(Polynomial)malloc(sizeof(struct PolyNode));
p->link=NULL;
head=tail=p;
while(t1&&t2)
{
if(t1->expon==t2->expon)
{
int c=t1->coef+t2->coef;
if(c)
{
Attach(c,t1->expon,&tail);
}
t1=t1->link;
t2=t2->link;
}
else if(t1->expon>t2->expon)
{
Attach(t1->coef,t1->expon,&tail);
t1=t1->link;
}
else
{
Attach(t2->coef,t2->expon,&tail);
t2=t2->link;
}
}
for(;t1;t1=t1->link)
{
Attach(t1->coef,t1->expon,&tail);
}
for(;t2;t2=t2->link)
{
Attach(t2->coef,t2->expon,&tail);
}
return head;
}
Polynomial Mult(Polynomial P1,Polynomial P2)
{
Polynomial t1,t2,p,head,tail;
t1=P1->link;
t2=P2->link;
p=(Polynomial)malloc(sizeof(struct PolyNode));
p->link=NULL;
head=tail=p;
if(t1==NULL||t2==NULL)
{
return head;
}
int c,e;
while(t2)
{
c=t1->coef*t2->coef;
e=t1->expon+t2->expon;
Attach(c,e,&tail);
t2=t2->link;
}
t1=t1->link;
while(t1)
{
t2=P2->link;
tail=head;
while(t2)
{
c=t1->coef*t2->coef;
e=t1->expon+t2->expon;
while(tail->link&&tail->link->expon>e)
{
tail=tail->link;
}
if(tail->link&&tail->link->expon==e)
{
if(tail->link->coef+c)
{
tail->link->coef+=c;
}
else
{
p=tail->link;
tail->link=p->link;
free(p);
}
}
else
{
p=(Polynomial)malloc(sizeof(struct PolyNode));
p->coef=c;
p->expon=e;
p->link=tail->link;
tail->link=p;
tail=p;
}
t2=t2->link;
}
t1=t1->link;
}
return head;
}
思路:
这题我是用链表写的,思路是参照浙大数据结构视频所讲解的,细节方面有些不同,我所写的链表是有保留头结点的。然后我在提交的时候出现了个别测试点未通过的情况,后来有参考一位博主的测试样例成功通过4个测试点,这里给出测试样例(下图为博主博客截图)供参考: