用C语言代码实现从标准输入中读入两个多项式。且该多项式中各项的系数均为0或正整数,最高幂次不超过1000000。对于多项式 anxn + an-1xn-1+.... + a1x1 + a0x0 (n<=1000000)的表示方法如下: an n an-1 n-1 ... a1 1 a0 0 第一、二行读入第一个多项式。第一行,表示多项式的项数。紧接着下一行输入该多项式的每一项。相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。 第三、四行读入第二个多项式。将运算结果输出到屏幕。将系数不为0的项按指数从高到低的顺序输出,每次输出其系数和指数,均以一个空格分隔。在行的末尾也输出一个空格符,并且最后要求换行。使用链表并且空间复杂度为一
时间: 2023-05-28 14:05:51 浏览: 189
条多项式的系数和指数分别存储在链表结点中,使用头插法构建链表。对两个多项式进行加法运算,将结果存储在一个新的链表中。最后遍历新链表输出结果。
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int coeff; // 系数
int expn; // 指数
struct node *next; // 指向下一个结点的指针
} Node;
Node* create_poly() { // 创建多项式
int n, coeff, expn;
scanf("%d", &n);
Node *head, *p;
head = (Node*) malloc(sizeof(Node)); // 创建头结点
head->next = NULL;
p = head;
for (int i = 0; i < n; i++) {
scanf("%d%d", &coeff, &expn);
if (coeff == 0) continue; // 系数为0,跳过
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->coeff = coeff;
new_node->expn = expn;
new_node->next = NULL;
p->next = new_node;
p = p->next;
}
return head;
}
void print_poly(Node *head) { // 输出多项式
Node *p = head->next;
while (p) {
printf("%d %d ", p->coeff, p->expn);
p = p->next;
}
printf("\n");
}
Node* add_poly(Node *poly1, Node *poly2) { // 多项式加法
Node *head, *p, *p1, *p2;
head = (Node*) malloc(sizeof(Node)); // 创建头结点
head->next = NULL;
p = head;
p1 = poly1->next;
p2 = poly2->next;
while (p1 && p2) {
if (p1->expn > p2->expn) { // 将指数大的项插入新链表
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->coeff = p1->coeff;
new_node->expn = p1->expn;
new_node->next = NULL;
p->next = new_node;
p = p->next;
p1 = p1->next;
} else if (p1->expn < p2->expn) {
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->coeff = p2->coeff;
new_node->expn = p2->expn;
new_node->next = NULL;
p->next = new_node;
p = p->next;
p2 = p2->next;
} else { // 指数相等,系数相加
int sum = p1->coeff + p2->coeff;
if (sum != 0) { // 系数和不为0,插入新链表
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->coeff = sum;
new_node->expn = p1->expn;
new_node->next = NULL;
p->next = new_node;
p = p->next;
}
p1 = p1->next;
p2 = p2->next;
}
}
while (p1) { // 将剩余的项插入新链表
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->coeff = p1->coeff;
new_node->expn = p1->expn;
new_node->next = NULL;
p->next = new_node;
p = p->next;
p1 = p1->next;
}
while (p2) {
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->coeff = p2->coeff;
new_node->expn = p2->expn;
new_node->next = NULL;
p->next = new_node;
p = p->next;
p2 = p2->next;
}
return head;
}
int main() {
Node *poly1 = create_poly();
Node *poly2 = create_poly();
Node *result = add_poly(poly1, poly2);
print_poly(result);
return 0;
}
阅读全文