7-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<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct
{
int coef;
int expn;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
typedef LinkList Polynomial;
Status InitPolyn(Polynomial &P)
{
P = (Polynomial)malloc(sizeof(LNode));
if(!P)
exit(OVERFLOW);
P->next = NULL;
return OK;
}
void PrintPolyn(Polynomial P)
{
LinkList ptr = P->next;
int flag=0;
if(!ptr)
{
printf("0 0\n");
return ;
}
while(ptr)
{
if(!flag)
{
printf("%d %d",ptr->data.coef,ptr->data.expn);
flag++;
}
else
printf(" %d %d",ptr->data.coef,ptr->data.expn);
ptr = ptr->next;
}
printf("\n");
}
Status ReadPolyn(Polynomial &P)
{
Polynomial ptr = P;
int n;
scanf("%d",&n);
while(n--)
{
ElemType e;
scanf("%d %d",&e.coef,&e.expn);
LinkList pNew = (LinkList)malloc(sizeof(LNode));
if(!pNew)
exit(OVERFLOW);
pNew->data = e;
pNew->next = NULL;
ptr->next = pNew;
ptr=ptr->next;
}
return OK;
}
int Compare(ElemType e1,ElemType e2)
{
if(e1.expn>e2.expn)return -1;
else if(e1.expn==e2.expn)return 0;
else return 1;
}
void Attach(int coef,int expn,Polynomial &p) //添加指定项到链表尾部,并使p指向尾部
{
Polynomial pNew = (Polynomial)malloc(sizeof(LNode));
if(!pNew)
exit(OVERFLOW);
pNew -> data.coef = coef;
pNew -> data.expn = expn;
pNew -> next = NULL;
p -> next = pNew;
p = p->next;
}
void AddPolyn(Polynomial Po1,Polynomial Po2,Polynomial result)
{
Polynomial p1 = Po1->next;
Polynomial p2 = Po2->next;
Polynomial p = result;
ElemType a,b;
int sum;
while(p1&&p2)
{
a = p1->data;
b = p2->data;
switch(Compare(a,b))
{
case -1: //1中指数大
Attach(p1->data.coef,p1->data.expn,p);
p1 = p1->next;
break;
case 0: //指数相等
sum = p1->data.coef + p2->data.coef;
if(sum) //系数和不为0
Attach(sum,p1->data.expn,p);
p1 = p1->next;
p2 = p2->next;
break;
case 1: //2中的系数大
Attach(p2->data.coef,p2->data.expn,p);
p2 = p2->next;
}
}
while(p1) //1中有剩余
{
Attach(p1->data.coef,p1->data.expn,p);
p1 = p1->next;
}
while(p2) //2中有剩余
{
Attach(p2->data.coef,p2->data.expn,p);
p2 = p2->next;
}
}
void DestoryPolyn(Polynomial &P)
{
Polynomial ptr = P;
while(ptr)
{
Polynomial tmp = ptr->next;
free(ptr);
ptr = tmp;
}
P = NULL;
}
void MultiPolyn(Polynomial Po1,Polynomial Po2,Polynomial &result)
{
Polynomial p1 = Po1->next;
// Polynomial p = result;
Polynomial tmp1 = NULL;
Polynomial tmp2 = NULL;
InitPolyn(tmp1);
while(p1)
{
InitPolyn(result);
InitPolyn(tmp2);
Polynomial p2 = Po2->next;
Polynomial tp2 = tmp2;
while(p2) //计算Po1中当前项乘以Po2整个链表的结果,存储在临时链表tmp2中
{
Attach(p1->data.coef * p2->data.coef,p1->data.expn + p2->data.expn,tp2);
p2 = p2->next;
}
AddPolyn(tmp1,tmp2,result);
DestoryPolyn(tmp1);
tmp1 = result; //将本次计算结果转存到tmp1
result = NULL;
DestoryPolyn(tmp2);
p1 = p1->next;
}
result = tmp1;
}
int main()
{
Polynomial Po1,Po2;
Polynomial AddResult,MultiResult;
InitPolyn(Po1);
InitPolyn(Po2);
InitPolyn(AddResult);
//InitPolyn(MultiResult);
ReadPolyn(Po1);
ReadPolyn(Po2);
AddPolyn(Po1,Po2,AddResult);
MultiPolyn(Po1,Po2,MultiResult);
PrintPolyn(MultiResult);
PrintPolyn(AddResult);
return 0;
}