C语言实现两个一元多项式乘法代码
时间: 2023-06-02 22:02:33 浏览: 70
```
#include <stdio.h>
#include <stdlib.h>
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
Polynomial ReadPoly();
Polynomial Add(Polynomial P1, Polynomial P2);
Polynomial Multiply(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);
int main()
{
Polynomial P1, P2, PP, PS;
P1 = ReadPoly();
P2 = ReadPoly();
PP = Multiply(P1, P2);
PrintPoly(PP);
return 0;
}
Polynomial ReadPoly()
{
int N, c, e;
Polynomial P, Rear, Tmp;
scanf("%d", &N);
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while (N--) {
scanf("%d %d", &c, &e);
Tmp = (Polynomial)malloc(sizeof(struct PolyNode));
Tmp->coef = c;
Tmp->expon = e;
Tmp->link = NULL;
Rear->link = Tmp;
Rear = Tmp;
}
Tmp = P; /* 删除多余的头结点 */
P = P->link;
free(Tmp);
return P;
}
Polynomial Add(Polynomial P1, Polynomial P2)
{
Polynomial Front, Rear, Temp;
int sum;
Rear = (Polynomial)malloc(sizeof(struct PolyNode));
Front = Rear;
while (P1 && P2) {
if (P1->expon == P2->expon) {
sum = P1->coef + P2->coef;
if (sum) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = sum;
Temp->expon = P1->expon;
Rear->link = Temp;
Rear = Rear->link;
}
P1 = P1->link;
P2 = P2->link;
} else if (P1->expon > P2->expon) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P1->coef;
Temp->expon = P1->expon;
Rear->link = Temp;
Rear = Rear->link;
P1 = P1->link;
} else {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P2->coef;
Temp->expon = P2->expon;
Rear->link = Temp;
Rear = Rear->link;
P2 = P2->link;
}
}
while (P1) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P1->coef;
Temp->expon = P1->expon;
Rear->link = Temp;
Rear = Rear->link;
P1 = P1->link;
}
while (P2) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P2->coef;
Temp->expon = P2->expon;
Rear->link = Temp;
Rear = Rear->link;
P2 = P2->link;
}
Rear->link = NULL;
Temp = Front;
Front = Front->link;
free(Temp);
return Front;
}
Polynomial Multiply(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, Tmp, t1, t2;
int c, e;
if (!P1 || !P2) return NULL;
t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
Rear = P;
while (t2) { /* 先用P1的第1项乘以P2,得到P */
c = t1->coef * t2->coef;
e = t1->expon + t2->expon;
if (c) {
Tmp = (Polynomial)malloc(sizeof(struct PolyNode));
Tmp->coef = c;
Tmp->expon = e;
Rear->link = Tmp;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
while (t1) { /* P1的第2项开始分别乘以P2,得到各项插入P中 */
t2 = P2; Rear = P;
while (t2) {
c = t1->coef * t2->coef;
e = t1->expon + t2->expon;
while (Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e) {
if (Rear->link->coef + c)
Rear->link->coef += c;
else {
Tmp = Rear->link;
Rear->link = Tmp->link;
free(Tmp);
}
} else {
Tmp = (Polynomial)malloc(sizeof(struct PolyNode));
Tmp->coef = c;
Tmp->expon = e;
Tmp->link = Rear->link;
Rear->link = Tmp;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
Tmp = P; P = P->link; free(Tmp);
return P;
}
void PrintPoly(Polynomial P)
{
int flag = 0;
if (!P) {
printf("0 0\n");
return;
}
while (P) {
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d", P->coef, P->expon);
P = P->link;
}
printf("\n");
}
```