用链表表示多项式,并实现多项式的加法运算
输入格式:
输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。
输出格式:
对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。
输入样例:
5,0 2,1 1,6 8,15 0,0
-2,1 3,6 4,8 0,0
#include <stdio.h>
#include <stdlib.h>
// 定义多项式节点结构体
typedef struct PolyNode {
int coef; // 系数
int exp; // 指数
struct PolyNode* next;
} PolyNode;
// 创建多项式节点
PolyNode* createNode(int coef, int exp) {
PolyNode* newNode = (PolyNode*)malloc(sizeof(PolyNode));
if (!newNode) {
printf("Memory allocation failed.\n");
exit(1);
}
newNode->coef = coef;
newNode->exp = exp;
newNode->next = NULL;
return newNode;
}
// 插入节点到多项式链表(按指数递增顺序)
void insertNode(PolyNode** poly, int coef, int exp) {
PolyNode* newNode = createNode(coef, exp);
if (*poly == NULL || (*poly)->exp > exp) {
newNode->next = *poly;
*poly = newNode;
} else {
PolyNode* current = *poly;
PolyNode* prev = NULL;
while (current != NULL && current->exp < exp) {
prev = current;
current = current->next;
}
if (current != NULL && current->exp == exp) {
// 如果指数相同,则系数相加
current->coef += coef;
if (current->coef == 0) {
// 如果系数相加后为0,则删除该节点
prev->next = current->next;
free(current);
}
// 不需要插入新节点
free(newNode);
} else {
prev->next = newNode;
newNode->next = current;
}
}
}
// 打印多项式
void printPoly(PolyNode* poly) {
while (poly != NULL) {
printf("%d,%d ", poly->coef, poly->exp);
poly = poly->next;
}
printf("\n");
}
// 多项式相加
void addPoly(PolyNode* polyA, PolyNode* polyB, PolyNode** result) {
*result = NULL;
while (polyA != NULL && polyB != NULL) {
if (polyA->exp > polyB->exp) {
insertNode(result, polyA->coef, polyA->exp);
polyA = polyA->next;
} else if (polyA->exp < polyB->exp) {
insertNode(result, polyB->coef, polyB->exp);
polyB = polyB->next;
} else {
int sumCoef = polyA->coef + polyB->coef;
if (sumCoef != 0) {
insertNode(result, sumCoef, polyA->exp);
}
polyA = polyA->next;
polyB = polyB->next;
}
}
while (polyA != NULL) {
insertNode(result, polyA->coef, polyA->exp);
polyA = polyA->next;
}
while (polyB != NULL) {
insertNode(result, polyB->coef, polyB->exp);
polyB = polyB->next;
}
}
int main() {
PolyNode* polyA = NULL;
PolyNode* polyB = NULL;
PolyNode* result = NULL;
// 读取第一个多项式
int coef, exp;
while (scanf("%d,%d", &coef, &exp) && (coef || exp)) {
insertNode(&polyA, coef, exp);
}
// 读取第二个多项式
while (scanf("%d,%d", &coef, &exp) && (coef || exp)) {
insertNode(&polyB, coef, exp);
}
// 多项式相加
addPoly(polyA, polyB, &result);
// 打印结果
printPoly(result);
// 释放链表内存
while (result != NULL) {
PolyNode* temp = result;
result = result->next;
free(temp);
}
return 0;
}