02-线性结构1 一元多项式的乘法与加法运算 (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>
#include <stdio.h>
#include <stdlib.h>
#define N 1000
using namespace std;
///1307
typedef struct node
{
int xi;
int eop;
struct node * next;
} Node;
void display(Node *p)
{
Node *pt=NULL,*pr=NULL,*ps=NULL;
if (p->next==NULL)
{
printf("0 0\n");
}
else
{
for (pt=p->next; pt!=NULL; pt=pt->next)
{
printf("%d %d",pt->xi,pt->eop);
if (pt->next==NULL)
{
printf("\n");
}
else
{
printf(" ");
}
}
}
}
int main()
{
int i,numA,numB,x,e;
Node *a=NULL,*b=NULL,*sum=NULL,*mul=NULL;
Node *pt=NULL,*pr=NULL,*ps=NULL;
Node *pa=NULL,*pb=NULL;
scanf("%d",&numA);
for (i=0; i<numA; i++)
{
scanf("%d %d",&x,&e);
if (x==0)
{
continue;
}
pt = (Node *)malloc(sizeof(Node));
pt->xi=x;
pt->eop=e;
pt->next=NULL;
if (a==NULL)
{
a=pt;
pr=pt;
}
else
{
pr->next=pt;
pr=pt;
}
}
if (a==NULL)
{
pt = (Node *)malloc(sizeof(Node));
pt->xi=0;
pt->eop=0;
pt->next=NULL;
a=pt;
}
scanf("%d",&numB);
for (i=0; i<numB; i++)
{
scanf("%d %d",&x,&e);
if (x==0)
{
continue;
}
pt = (Node *)malloc(sizeof(Node));
pt->xi=x;
pt->eop=e;
pt->next=NULL;
if (b==NULL)
{
b=pt;
pr=pt;
}
else
{
pr->next=pt;
pr=pt;
}
}
if (b==NULL)
{
pt = (Node *)malloc(sizeof(Node));
pt->xi=0;
pt->eop=0;
pt->next=NULL;
b=pt;
}
///================
mul =(Node *)malloc(sizeof(Node));
mul->next=NULL;
for (pa=a; pa!=NULL; pa=pa->next)
{
// printf("11");
for (pb=b; pb!=NULL; pb=pb->next)
{
pt = (Node *)malloc(sizeof(Node));
pt->next=NULL;
pt->xi=pa->xi*pb->xi;
pt->eop=pa->eop+pb->eop;
if (mul->next==NULL)
{
mul->next=pt;
pr=mul;
}
else
{
for (ps=mul->next,pr=mul; ps!=NULL; ps=ps->next,pr=pr->next)
{
if (pt->eop>ps->eop)
{
pt->next=ps;
pr->next=pt;
break;
}
else if (pt->eop==ps->eop)
{
ps->xi+=pt->xi;
if (ps->xi==0)
{
pr->next=ps->next;
free(ps);
}
else
{
free(pt);
}
break;
}
}
if (ps==NULL)
{
pr->next=pt;
}
}
}
}
for (pt=mul->next,pr=mul; pt!=NULL; pt=pt->next,pr=pr->next)
{
if (pt->xi==0)
{
pr->next=pt->next;
ps=pr->next;
free(ps);
}
}
display(mul);
///=================================================
pt=a;
sum =(Node *)malloc(sizeof(Node));
sum->next=NULL;
for (pa=a,pb=b; pa!=NULL&&pb!=NULL;)
{
pt = (Node *)malloc(sizeof(Node));
pt->next =NULL;
if (pa->eop > pb->eop)
{
pt->eop =pa->eop;
pt->xi =pa->xi;
pa =pa->next;
}
else if (pa->eop < pb->eop)
{
pt->eop =pb->eop;
pt->xi =pb->xi;
pb =pb->next;
}
else
{
pt->eop =pa->eop;
pt->xi =pa->xi+pb->xi;
pb =pb->next;
pa =pa->next;
}
if (sum->next==NULL)
{
sum->next=pt;
pr=sum->next;
}
else
{
pr=pr->next=pt;
}
}
if (pa!=NULL)
{
pr->next=pa;
}
else
{
pr->next=pb;
}
for (pt=sum->next,pr=sum; pt!=NULL; pt=pt->next,pr=pr->next)
{
if (pt->xi==0)
{
pr->next=pt->next;
ps=pr->next;
free(ps);
}
}
display(sum);
// cout << "Hello world!" << endl;
return 0;
}