一元多项式计算 功能要求: (1)能够按照指数降序排列建立并输出多项式; (2)能够完成两个多项式的相加、相减,并将结果输出c语言数据结构
时间: 2024-01-17 15:03:01 浏览: 81
好的,下面是 C 语言的数据结构实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义多项式项的结构体
typedef struct Node {
int coef; // 系数
int exp; // 指数
struct Node *next; // 指向下一项的指针
} Node;
// 定义多项式的结构体
typedef struct Polynomial {
int len; // 多项式中项的个数
struct Node *head; // 指向第一项的指针
} Polynomial;
// 插入一项到多项式中,按照指数降序排列
void insert(Polynomial *p, int coef, int exp) {
Node *new_node = (Node *)malloc(sizeof(Node)); // 创建新节点
new_node->coef = coef;
new_node->exp = exp;
new_node->next = NULL;
if (p->head == NULL) { // 如果多项式为空,直接插入
p->head = new_node;
p->len = 1;
return;
}
Node *prev = NULL, *cur = p->head;
while (cur != NULL && cur->exp >= exp) { // 找到第一个指数小于插入项的节点
prev = cur;
cur = cur->next;
}
if (prev == NULL) { // 插入的项为最高项
new_node->next = p->head;
p->head = new_node;
} else { // 插入到 prev 后面
prev->next = new_node;
new_node->next = cur;
}
p->len++;
}
// 打印多项式
void print(Polynomial *p) {
Node *cur = p->head;
while (cur != NULL) {
printf("%d*x^%d", cur->coef, cur->exp);
cur = cur->next;
if (cur != NULL) {
printf(" + ");
} else {
printf("\n");
}
}
}
// 释放多项式中所有节点的内存
void clear(Polynomial *p) {
Node *cur = p->head;
while (cur != NULL) {
Node *tmp = cur;
cur = cur->next;
free(tmp);
}
p->head = NULL;
p->len = 0;
}
// 多项式相加
Polynomial *add(Polynomial *p1, Polynomial *p2) {
Polynomial *res = (Polynomial *)malloc(sizeof(Polynomial)); // 创建新多项式
res->head = NULL;
res->len = 0;
Node *cur1 = p1->head, *cur2 = p2->head;
while (cur1 != NULL && cur2 != NULL) {
if (cur1->exp > cur2->exp) { // p1 的指数大于 p2 的指数
insert(res, cur1->coef, cur1->exp);
cur1 = cur1->next;
} else if (cur1->exp < cur2->exp) { // p1 的指数小于 p2 的指数
insert(res, cur2->coef, cur2->exp);
cur2 = cur2->next;
} else { // p1 和 p2 的指数相同,系数相加
insert(res, cur1->coef + cur2->coef, cur1->exp);
cur1 = cur1->next;
cur2 = cur2->next;
}
}
// 将 p1 或 p2 中剩余的项插入到 res 中
while (cur1 != NULL) {
insert(res, cur1->coef, cur1->exp);
cur1 = cur1->next;
}
while (cur2 != NULL) {
insert(res, cur2->coef, cur2->exp);
cur2 = cur2->next;
}
return res;
}
// 多项式相减
Polynomial *sub(Polynomial *p1, Polynomial *p2) {
Polynomial *res = (Polynomial *)malloc(sizeof(Polynomial)); // 创建新多项式
res->head = NULL;
res->len = 0;
Node *cur1 = p1->head, *cur2 = p2->head;
while (cur1 != NULL && cur2 != NULL) {
if (cur1->exp > cur2->exp) { // p1 的指数大于 p2 的指数
insert(res, cur1->coef, cur1->exp);
cur1 = cur1->next;
} else if (cur1->exp < cur2->exp) { // p1 的指数小于 p2 的指数
insert(res, -cur2->coef, cur2->exp);
cur2 = cur2->next;
} else { // p1 和 p2 的指数相同,系数相减
insert(res, cur1->coef - cur2->coef, cur1->exp);
cur1 = cur1->next;
cur2 = cur2->next;
}
}
// 将 p1 或 p2 中剩余的项插入到 res 中
while (cur1 != NULL) {
insert(res, cur1->coef, cur1->exp);
cur1 = cur1->next;
}
while (cur2 != NULL) {
insert(res, -cur2->coef, cur2->exp);
cur2 = cur2->next;
}
return res;
}
int main() {
Polynomial p1 = {0, NULL}, p2 = {0, NULL};
insert(&p1, 3, 2);
insert(&p1, 1, 1);
insert(&p1, 5, 0);
insert(&p2, 2, 3);
insert(&p2, 4, 1);
insert(&p2, 2, 0);
printf("p1 = ");
print(&p1);
printf("p2 = ");
print(&p2);
Polynomial *res = add(&p1, &p2);
printf("p1 + p2 = ");
print(res);
clear(res);
res = sub(&p1, &p2);
printf("p1 - p2 = ");
print(res);
clear(res);
clear(&p1);
clear(&p2);
return 0;
}
```
这个代码中,我们使用了单链表来表示多项式的项。每个节点包括一个系数和一个指数,以及指向下一个节点的指针。多项式的结构体包括一个指向第一项的指针和项的个数。我们实现了插入一个节点、打印多项式、释放多项式内存、多项式相加和多项式相减等功能。在相加和相减多项式时,我们首先遍历两个多项式,按照指数降序插入到新的多项式中,再将剩余的项插入到新的多项式中。
阅读全文