按照升幂排列的一元多项式P n (x)=p 1 x+p 2 x 2 +⋯+p n x n 可以用线性表来表示P=(p 1 ,p 2 ,…,p n ),对于一元多项式各种操作,实际上可以利用线性表来处理。若多项式的非零项指数很高并且非零项很少称之为稀疏多项式,此时使用链式存储结构较为方便。设计一个程序,实现一元稀疏多项式简单计算器。
时间: 2024-03-14 19:45:17 浏览: 144
实现一元稀疏多项式简单计算器的基本思路是,使用链式存储结构存储多项式,然后实现加法、减法、乘法等基本计算操作。
具体实现可以参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int coef; // 系数
int exp; // 指数
struct _node* next; // 指向下一个节点的指针
} Node;
void print_poly(Node* head) {
// 打印多项式
Node* p = head->next;
while (p) {
printf("%d*x^%d", p->coef, p->exp);
p = p->next;
if (p) {
printf(" + ");
}
}
printf("\n");
}
Node* create_poly() {
// 创建多项式
Node* head = (Node*)malloc(sizeof(Node));
head->next = NULL;
return head;
}
void insert_term(Node* head, int coef, int exp) {
// 插入单项式
if (coef == 0) {
return; // 系数为0,不需要插入
}
Node* p = head;
// 找到合适的插入位置
while (p->next && p->next->exp > exp) {
p = p->next;
}
if (p->next && p->next->exp == exp) {
// 指数相同,合并同类项
p->next->coef += coef;
if (p->next->coef == 0) {
// 合并后系数为0,删除该项
Node* tmp = p->next;
p->next = tmp->next;
free(tmp);
}
} else {
// 插入新项
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->coef = coef;
tmp->exp = exp;
tmp->next = p->next;
p->next = tmp;
}
}
Node* add_poly(Node* a, Node* b) {
// 多项式加法
Node* c = create_poly();
Node* p = a->next, * q = b->next;
while (p && q) {
if (p->exp == q->exp) {
insert_term(c, p->coef + q->coef, p->exp);
p = p->next;
q = q->next;
} else if (p->exp > q->exp) {
insert_term(c, p->coef, p->exp);
p = p->next;
} else {
insert_term(c, q->coef, q->exp);
q = q->next;
}
}
// 处理剩余项
while (p) {
insert_term(c, p->coef, p->exp);
p = p->next;
}
while (q) {
insert_term(c, q->coef, q->exp);
q = q->next;
}
return c;
}
Node* sub_poly(Node* a, Node* b) {
// 多项式减法
Node* c = create_poly();
Node* p = a->next, * q = b->next;
while (p && q) {
if (p->exp == q->exp) {
insert_term(c, p->coef - q->coef, p->exp);
p = p->next;
q = q->next;
} else if (p->exp > q->exp) {
insert_term(c, p->coef, p->exp);
p = p->next;
} else {
insert_term(c, -q->coef, q->exp);
q = q->next;
}
}
// 处理剩余项
while (p) {
insert_term(c, p->coef, p->exp);
p = p->next;
}
while (q) {
insert_term(c, -q->coef, q->exp);
q = q->next;
}
return c;
}
Node* mul_poly(Node* a, Node* b) {
// 多项式乘法
Node* c = create_poly();
Node* p = a->next;
while (p) {
Node* q = b->next;
while (q) {
insert_term(c, p->coef * q->coef, p->exp + q->exp);
q = q->next;
}
p = p->next;
}
return c;
}
void destroy_poly(Node* head) {
// 销毁多项式
Node* p = head;
while (p) {
Node* tmp = p;
p = p->next;
free(tmp);
}
}
int main() {
Node* a = create_poly();
Node* b = create_poly();
insert_term(a, 2, 3);
insert_term(a, 3, 2);
insert_term(a, 4, 0);
insert_term(b, 1, 4);
insert_term(b, 5, 2);
insert_term(b, 2, 0);
printf("a = ");
print_poly(a);
printf("b = ");
print_poly(b);
Node* c = add_poly(a, b);
printf("a + b = ");
print_poly(c);
Node* d = sub_poly(a, b);
printf("a - b = ");
print_poly(d);
Node* e = mul_poly(a, b);
printf("a * b = ");
print_poly(e);
destroy_poly(a);
destroy_poly(b);
destroy_poly(c);
destroy_poly(d);
destroy_poly(e);
return 0;
}
```
在上述代码中,我们首先定义了一个单项式的结构体 `Node`,包含系数 `coef` 和指数 `exp` 两个成员,以及指向下一个节点的指针。然后定义了多项式的打印、创建、插入单项式、加法、减法、乘法、销毁等操作。在 `main` 函数中,我们创建了两个多项式 `a` 和 `b`,插入了若干个单项式,然后分别计算了它们的加法、减法、乘法,并输出结果。最后我们还需要记得销毁所有多项式,以释放动态分配的内存。
阅读全文