一元多项式的乘法加法C语言实现
时间: 2023-12-24 22:24:34 浏览: 112
顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。.docx
5星 · 资源好评率100%
以下是一元多项式的乘法和加法的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int coef; // 系数
int exp; // 指数
struct node *next;
} Node, *PtrToNode;
// 创建一个新节点
PtrToNode CreateNode(int coef, int exp) {
PtrToNode p = (PtrToNode)malloc(sizeof(Node));
p->coef = coef;
p->exp = exp;
p->next = NULL;
return p;
}
// 将一个多项式插入到链表中
void InsertList(PtrToNode head, int coef, int exp) {
PtrToNode p = head;
PtrToNode q;
// 找到合适的位置插入节点
while (p->next != NULL && p->next->exp > exp) {
p = p->next;
}
// 如果该指数已经存在,则将系数相加
if (p->next != NULL && p->next->exp == exp) {
p->next->coef += coef;
if (p->next->coef == 0) {
// 如果系数为0,则删除该节点
q = p->next;
p->next = p->next->next;
free(q);
}
} else {
// 新建节点插入
q = CreateNode(coef, exp);
q->next = p->next;
p->next = q;
}
}
// 多项式相加
PtrToNode AddList(PtrToNode poly1, PtrToNode poly2) {
PtrToNode p = poly1->next;
PtrToNode q = poly2->next;
PtrToNode result = CreateNode(0, 0);
PtrToNode r = result;
while (p != NULL && q != NULL) {
if (p->exp > q->exp) {
r->next = CreateNode(p->coef, p->exp);
p = p->next;
} else if (p->exp < q->exp) {
r->next = CreateNode(q->coef, q->exp);
q = q->next;
} else {
int coef = p->coef + q->coef;
if (coef != 0) {
r->next = CreateNode(coef, p->exp);
}
p = p->next;
q = q->next;
}
r = r->next;
}
while (p != NULL) {
r->next = CreateNode(p->coef, p->exp);
p = p->next;
r = r->next;
}
while (q != NULL) {
r->next = CreateNode(q->coef, q->exp);
q = q->next;
r = r->next;
}
return result;
}
// 多项式相乘
PtrToNode MultiplyList(PtrToNode poly1, PtrToNode poly2) {
PtrToNode p = poly1->next;
PtrToNode q = poly2->next;
PtrToNode result = CreateNode(0, 0);
while (p != NULL) {
while (q != NULL) {
InsertList(result, p->coef * q->coef, p->exp + q->exp);
q = q->next;
}
q = poly2->next;
p = p->next;
}
return result;
}
// 输出多项式
void PrintList(PtrToNode head) {
PtrToNode p = head->next;
int isFirst = 1;
while (p != NULL) {
if (isFirst) {
printf("%dX^%d", p->coef, p->exp);
isFirst = 0;
} else {
if (p->coef >= 0) {
printf("+%dX^%d", p->coef, p->exp);
} else {
printf("%dX^%d", p->coef, p->exp);
}
}
p = p->next;
}
printf("\n");
}
int main() {
PtrToNode poly1 = CreateNode(0, 0);
PtrToNode poly2 = CreateNode(0, 0);
InsertList(poly1, 2, 3);
InsertList(poly1, 3, 2);
InsertList(poly1, 1, 0);
InsertList(poly2, 1, 2);
InsertList(poly2, -1, 1);
InsertList(poly2, 2, 0);
printf("P1(X)=");
PrintList(poly1);
printf("P2(X)=");
PrintList(poly2);
PtrToNode sum = AddList(poly1, poly2);
printf("P1(X)+P2(X)=");
PrintList(sum);
PtrToNode product = MultiplyList(poly1, poly2);
printf("P1(X)*P2(X)=");
PrintList(product);
return 0;
}
```
这段代码中,我们使用了链表来存储多项式。每个节点包含了一个系数和一个指数。为了方便,我们在链表的头节点中设置了一个系数和指数都为0的节点。
在插入节点时,我们需要遍历链表找到合适的位置。如果该指数已经存在,则将系数相加。如果系数为0,则需要删除该节点。
在多项式相加和相乘时,我们使用了两个指针p和q分别指向两个多项式的节点。我们遍历这两个多项式,根据指数的大小关系进行加法或乘法运算,并将结果插入到结果链表中。最后返回结果链表。
阅读全文