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<stdio.h>
#include<stdlib.h>
struct Poly_{
int Exp;//指数
int Coeff;//系数
struct Poly_* Next;
};
typedef struct Poly_* Poly;
void PrintPoly(Poly Polynomial);
void InsertPoly(Poly Polynomial1, int Exp, int Coeff);
void PolyAdd(Poly Polynomial1, Poly Polynomial2);//把多项式2的加到多项式一里面
Poly BuildPoly(int Number);
void PolyProduct(Poly Polynomial1, Poly Polynomial2, Poly Zero);
int main()
{
int Number;//非零项个数
scanf("%d", &Number);
Poly Poly1 = BuildPoly(Number);
scanf("%d", &Number);
Poly Poly2 = BuildPoly(Number);
Poly Zero = BuildPoly(0);
PolyProduct(Poly1, Poly2, Zero);
PolyAdd(Poly1, Poly2);
PrintPoly(Zero);
printf("\n");
PrintPoly(Poly1);
}
Poly BuildPoly(int Number)
{
int Exp;
int Coeff;
Poly Head = (Poly)malloc(sizeof(struct Poly_));
Head->Next = NULL;
Poly Last = Head;
for (int i = 0; i < Number; i++)
{
scanf("%d", &Coeff);
scanf("%d", &Exp);
Poly Tmp = (Poly)malloc(sizeof(struct Poly_));
Tmp->Coeff = Coeff;
Tmp->Exp = Exp;
Tmp->Next = NULL;
Last->Next = Tmp;
Last = Last->Next;
}
return Head;//有头链表,返回头指针
}
void PolyAdd(Poly Polynomial1, Poly Polynomial2)//把多项式2的加到多项式一里面
{
Poly Tmp;
Polynomial2 = Polynomial2->Next;
while (Polynomial2)
{
Tmp = Polynomial2->Next;//保存下一个位置
InsertPoly(Polynomial1, Polynomial2->Exp, Polynomial2->Coeff);
Polynomial2 = Tmp;
}
}
void InsertPoly(Poly Polynomial1, int Exp,int Coeff)
{
Poly Before = Polynomial1;
Polynomial1 = Polynomial1->Next;
Poly NewTerm = (Poly)malloc(sizeof(struct Poly_));
NewTerm->Exp = Exp;
NewTerm->Coeff =Coeff;
NewTerm->Next = NULL;
if (Polynomial1)
{
if (NewTerm->Exp > Polynomial1->Exp)
{
Before->Next = NewTerm;
NewTerm->Next = Polynomial1;
}
else if (NewTerm->Exp == Polynomial1->Exp)
{
Polynomial1->Coeff = NewTerm->Coeff + Polynomial1->Coeff;
if (Polynomial1->Coeff == 0)
{
Before->Next = Polynomial1->Next;
}
}
else
{
free(NewTerm);
InsertPoly(Polynomial1, Exp, Coeff);
}
}
else
{
Before->Next = NewTerm;
}
}
void PrintPoly(Poly Polynomial)
{
if (Polynomial->Next == NULL)
{
printf("0 0");
}
else
{
Polynomial = Polynomial->Next;
Poly Next = Polynomial->Next;
while (Next!=NULL)
{
printf("%d ", Polynomial->Coeff);
printf("%d ", Polynomial->Exp);
Polynomial = Polynomial->Next;
Next = Polynomial->Next;
}
printf("%d %d", Polynomial->Coeff, Polynomial->Exp);
}
}
void PolyProduct(Poly Polynomial1, Poly Polynomial2,Poly Zero)
{
Poly Polynomial2Tmp = Polynomial2;
Polynomial1 = Polynomial1->Next;
Polynomial2 = Polynomial2->Next;
while (Polynomial1)
{
while (Polynomial2)
{
InsertPoly(Zero, Polynomial1->Exp + Polynomial2->Exp, Polynomial1->Coeff * Polynomial2->Coeff);
Polynomial2 = Polynomial2->Next;
}
Polynomial2 = Polynomial2Tmp->Next;
Polynomial1 = Polynomial1->Next;
}
}
和同学说起这个好像没思路,实际上最关键的一步就是插入