您的位置:首页 > 其它

02-线性结构2 一元多项式的乘法与加法运算 (20分)

2016-10-27 23:38 549 查看
设计函数分别求两个一元多项式的乘积与和。

输入格式: 输入分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 *Polynomial;
struct Node {
int coef;
int exp;
Polynomial Next;
};

Polynomial Read();
void Print(Polynomial P);
Polynomial Mult(Polynomial P1, Polynomial P2);
Polynomial Add(Polynomial P1, Polynomial P2);
void attach(int c, int e, Polynomial *Pr);
void pempty(Polynomial P);

int main()
{
Polynomial P1, P2, Pa, Pm;
P1 = Read();
P2 = Read();
Pm = Mult(P1, P2);
Pa = Add(P1, P2);
Print(Pm);
Print(Pa);
return 0;
}

Polynomial Read() {
Polynomial Pn, p;
int n, c, e;
Pn = (Polynomial)malloc(sizeof(struct Node));
Pn->Next = NULL;
p = Pn;
scanf("%d", &n);
while (n--) {
scanf("%d%d", &c, &e);
attach(c, e, &p);
}
return Pn;
}

void Print(Polynomial P) {
int flag = 0;
if (P->Next == NULL)
printf("0 0");
else {
while (P->Next) {
if (flag)
printf(" ");
else
flag = 1;
P = P->Next;
printf("%d %d", P->coef, P->exp);
}
}
printf("\n");
}

void attach(int c, int e, Polynomial *Pr){
Polynomial Prear;
Prear = (Polynomial)malloc(sizeof(struct Node));
Prear->coef = c;
Prear->exp = e;
Prear->Next = NULL;
(*Pr)->Next = Prear;
(*Pr) = Prear;
}

Polynomial Add(Polynomial P1, Polynomial P2){
Polynomial Pa, p1, p2, p;
Pa = (Polynomial)malloc(sizeof(struct Node));
p = Pa;
p1 = P1->Next;
p2 = P2->Next;
while (p1 && p2)
{
if (p1->exp > p2->exp) {
attach(p1->coef, p1->exp, &p);
p1 = p1->Next;
}
else if (p1->exp < p2->exp) {
attach(p2->coef, p2->exp, &p);
p2 = p2->Next;
}
else {
if((p1->coef + p2->coef) != 0)
attach(p1->coef + p2->coef, p1->exp, &p);
p1 = p1->Next;
p2 = p2->Next;
}
}
while (p1) {
attach(p1->coef, p1->exp, &p);
p1 = p1->Next;
}
while (p2) {
attach(p2->coef, p2->exp, &p);
p2 = p2->Next;
}
return Pa;
}

Polynomial Mult(Polynomial P1, Polynomial P2) {
Polynomial Pm, p1, p2, p, pt, ptf;
Pm = (Polynomial)malloc(sizeof(struct Node));
Pm->Next = NULL;
p1 = P1->Next;
p2 = P2->Next;
if (!p1 || !p2) {
return Pm;
}
while (p1) {
ptf = (Polynomial)malloc(sizeof(struct Node));
p2 = P2->Next;
if (ptf == NULL)
printf("malloc error");
pt = ptf;
while (p2) {
attach(p1->coef * p2->coef, p1->exp + p2->exp, &pt);
p2 = p2->Next;
}
Pm = Add(Pm, ptf);
p1 = p1->Next;
pempty(ptf);
free(ptf);
}
return Pm;
}

void pempty(Polynomial P) {
Polynomial pr, pt;
pr = P->Next;
while (pr) {
pt = pr;
pr = pr->Next;
free(pt);
}
P->Next = NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: