设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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 Node *PtrToNode;
struct Node{
int coefficient;
int index ;
PtrToNode Next;
};
typedef PtrToNode List;
/* 读取函数 */
List Read();
/* 输出函数 */
void Print(List L);
/* 计算一元多项式的加法 */
List Sum(List L1,List L2);
/* 计算一元多项式的乘法 */
List Mul(List L1,List L2) ;
/* 辅助函数,复制值添加新的节点 */
void Attach(int a,int b,List *pn);
int main(void)
{
List L1,L2;
List L3,L4;
L1=Read();
L2=Read();
L3=Mul(L1,L2);
L4=Sum(L1,L2);
Print(L3);
Print(L4);
return 0;
}
List Read()
{
int n;
int x,z;
List p;
p=(List) malloc(sizeof(struct Node));
p->Next=NULL;
List r=p;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&x,&z);
Attach(x,z,&r);
}
List temp=p;
p=p->Next;
free(temp);
return p;
}
void Print(List L)
{
int flag=1;//用来控制输出格式 ,注意记得此格式的使用
List p=L;
if(!p)
{
printf("0 0\n");
return ;
}
while(p)
{
if(flag)
flag=0;
else
printf(" ");
printf("%d %d",p->coefficient,p->index);
p=p->Next;
}
printf("\n");
}
List Sum(List L1,List L2)
{
List t1=L1;
List t2=L2;
List p;
List temp;
p=(List) malloc(sizeof(struct Node));
p->Next=NULL;
List r=p;
while(t1&&t2)
{
if(t1->index>t2->index)
{
Attach(t1->coefficient,t1->index,&r);
t1=t1->Next;
}
else if(t1->index<t2->index)
{
Attach(t2->coefficient,t2->index,&r);
t2=t2->Next;
}
else
{
if(t1->coefficient+t2->coefficient)
Attach((t1->coefficient+t2->coefficient),t1->index,&r);
t1=t1->Next;
t2=t2->Next;
}
}
while(t1)
{
Attach(t1->coefficient,t1->index,&r);
t1=t1->Next;
}
while(t2)
{
Attach(t2->coefficient,t2->index,&r);
t2=t2->Next;
}
r=p;
temp=p;
p=p->Next;
free(temp);
return p;
}
List Mul(List L1,List L2)
{
List p=(List) malloc (sizeof(struct Node));
p->Next=NULL;
List r=p;
List temp;
if (!L1 || !L2)
return NULL;
List q1=L1;
List q2=L2;
while(q2)//创建一个用q1第一项分别乘以q2各项的链表p
{ //它是按从大到小有序排列
Attach((q1->coefficient*q2->coefficient),(q1->index+q2->index),&r);
q2=q2->Next;
}
q1=q1->Next;//让q1不断指向下一个节点
/* 分别让q1的某一项去乘上q2的各项,然后让这一
系列数插入到 创造好的链表p中 */
while(q1)
{
q2=L2;
//各项插入之后,原链表必须改变
//所以不能继续用Attach函数添加了
r=p;
while(q2)
{
int x=(q1->coefficient)*(q2->coefficient);
int z=(q1->index)+(q2->index);
while(r->Next && (r->Next->index>z))//r->Next是因为p的第一个数还没有意义
r=r->Next; //用循环排放新数据在第一个链表的位置
if(r->Next&& r->Next->index==z)//添加值指数等于当前值
{
if(r->Next->coefficient+x)//指数相等,如果系数相加不为零
(r->Next->coefficient)+=x;
else // 如果系数相加零
{ //执行删除节点
temp=r->Next;
r->Next=temp->Next;
free(temp);
}
}
else //添加值指数小于当前值
{
temp=(List)malloc(sizeof(struct Node));
temp->coefficient=x;
temp->index=z;
temp->Next=r->Next;
r->Next=temp;
r=r->Next;
}
q2=q2->Next;
}
q1=q1->Next;
}
temp=p;// 删除p的第一个无效值节点
p=p->Next;
free(temp);
return p;
}
void Attach(int a,int b,List *pn)
{
List n;
n=(List) malloc(sizeof(struct Node));
n->coefficient=a;
n->index=b;
n->Next=NULL;
(*pn)->Next=n;
*pn=n;
}