C语言单链表实现多项式求和

编程探索课程 2025-03-14 16:46:37
C语言 单链表 实现多项式求和

talk is cheap show me code

#include <stdio.h>#include <stdlib.h>typedef struct Node { int coeff; int exp; struct Node* next;} Node;// 插入节点并保持降序排列,合并同类项void insertNode(Node** head, int coeff, int exp) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coeff = coeff; newNode->exp = exp; newNode->next = NULL; if (*head == NULL) { *head = newNode; return; } Node* current = *head; Node* prev = NULL; // 查找插入位置 while (current && current->exp > exp) { prev = current; current = current->next; } // 合并同类项 if (current && current->exp == exp) { current->coeff += coeff; free(newNode); if (current->coeff == 0) { // 删除零系数项 if (prev) { prev->next = current->next; } else { *head = current->next; } free(current); } return; } // 插入新节点 if (prev) { prev->next = newNode; } else { newNode->next = *head; *head = newNode; } newNode->next = current;}// 多项式相加Node* addPolynomials(Node* poly1, Node* poly2) { Node* result = NULL; Node** tail = &result; while (poly1 && poly2) { Node* newNode = NULL; if (poly1->exp > poly2->exp) { newNode = (Node*)malloc(sizeof(Node)); *newNode = (Node){poly1->coeff, poly1->exp, NULL}; poly1 = poly1->next; } else if (poly2->exp > poly1->exp) { newNode = (Node*)malloc(sizeof(Node)); *newNode = (Node){poly2->coeff, poly2->exp, NULL}; poly2 = poly2->next; } else { int sum = poly1->coeff + poly2->coeff; if (sum != 0) { newNode = (Node*)malloc(sizeof(Node)); *newNode = (Node){sum, poly1->exp, NULL}; } poly1 = poly1->next; poly2 = poly2->next; } if (newNode) { *tail = newNode; tail = &(newNode->next); } } // 处理剩余节点 Node* remaining = poly1 ? poly1 : poly2; while (remaining) { Node* newNode = (Node*)malloc(sizeof(Node)); *newNode = (Node){remaining->coeff, remaining->exp, NULL}; *tail = newNode; tail = &(newNode->next); remaining = remaining->next; } return result;}// 打印多项式void printPolynomial(Node* poly) { if (!poly) { printf("0\n"); return; } while (poly) { printf("%dx^%d", poly->coeff, poly->exp); poly = poly->next; if (poly) printf(" + "); } printf("\n");}// 释放链表内存void freePolynomial(Node* poly) { while (poly) { Node* temp = poly; poly = poly->next; free(temp); }}int main() { // 创建多项式 3x^5 + 4x^3 + 2x Node* poly1 = NULL; insertNode(&poly1, 3, 5); insertNode(&poly1, 4, 3); insertNode(&poly1, 2, 1); printf("Polynomial 1: "); printPolynomial(poly1); // 创建多项式 5x^4 + 4x^3 + 1 Node* poly2 = NULL; insertNode(&poly2, 5, 4); insertNode(&poly2, 4, 3); insertNode(&poly2, 1, 0); printf("Polynomial 2: "); printPolynomial(poly2); // 多项式相加 Node* sum = addPolynomials(poly1, poly2); printf("Sum: "); printPolynomial(sum); // 释放内存 freePolynomial(poly1); freePolynomial(poly2); freePolynomial(sum); return 0;}

代码说明:

数据结构: 使用Node结构体表示多项式中的每一项,包含系数coeff、指数exp和指向下一项的指针next。插入节点: insertNode函数将新项插入到合适的位置以保持降序排列。如果遇到相同指数的项,则合并系数。如果合并后系数为零,则删除该节点。多项式相加: addPolynomials函数使用双指针法遍历两个多项式,按指数大小顺序合并生成新多项式。处理过程中始终维护结果的正确顺序。内存管理: 提供了freePolynomial函数来释放链表内存,避免内存泄漏。

执行结果:

Polynomial 1: 3x^5 + 4x^3 + 2x^1Polynomial 2: 5x^4 + 4x^3 + 1x^0Sum: 3x^5 + 5x^4 + 8x^3 + 2x^1 + 1x^0

该实现能够高效地处理多项式相加操作,时间复杂度为O(m+n),其中m和n分别是两个多项式的项数。

干中学 学中干

代码使用说明书1. 数据结构Node 结构体:coeff:表示多项式项的系数。exp:表示多项式项的指数。next:指向下一个节点的指针。每个节点表示多项式中的一项,例如 3x^5 可以用一个节点表示,其中 coeff = 3,exp = 5。2. 插入节点(insertNode函数)功能:将一个新的多项式项插入到链表中,并保持链表按指数降序排列。如果链表中已经存在相同指数的项,则合并系数(相加)。如果合并后系数为 0,则删除该节点。逻辑:1. 创建一个新节点,并初始化其系数和指数。2. 遍历链表,找到合适的位置插入新节点:如果当前节点的指数大于新节点的指数,继续向后遍历。如果当前节点的指数等于新节点的指数,合并系数。如果当前节点的指数小于新节点的指数,插入新节点。3. 如果合并后系数为 0,删除该节点。4. 插入新节点并调整链表指针。3. 多项式相加(addPolynomials函数)功能:将两个多项式链表相加,生成一个新的多项式链表。逻辑:1. 初始化一个空链表 result 用于存储结果。2. 使用双指针法遍历两个多项式链表:比较当前两个节点的指数:如果 poly1 的指数大于 poly2 的指数,将 poly1 的节点插入到结果链表中。如果 poly2 的指数大于 poly1 的指数,将 poly2 的节点插入到结果链表中。如果指数相等,将系数相加,生成一个新节点插入到结果链表中。移动指针到下一个节点。3. 如果其中一个链表遍历完毕,将另一个链表的剩余节点直接插入到结果链表中。4. 返回结果链表。4. 打印多项式(printPolynomial函数)功能:按格式打印多项式链表。逻辑:1. 遍历链表,依次打印每一项的系数和指数。2. 如果链表为空,打印 0。5. 释放内存(freePolynomial函数)功能:释放多项式链表占用的内存,避免内存泄漏。逻辑:1. 遍历链表,逐个释放节点。6. 主函数(main函数)功能:测试多项式相加的功能。逻辑:1. 创建两个多项式链表 poly1 和 poly2。2. 调用 insertNode 函数向链表中插入多项式的项。3. 调用 addPolynomials 函数将两个多项式相加,生成结果链表。4. 打印结果多项式。5. 释放所有链表的内存。7. 示例运行输入:poly1 = 3x^5 + 4x^3 + 2xpoly2 = 5x^4 + 4x^3 + 1输出:Sum = 3x^5 + 5x^4 + 8x^3 + 2x + 18. 时间复杂度分析插入节点:O(n),其中 n 是链表的长度。多项式相加:O(m + n),其中 m 和 n 分别是两个多项式的项数。整体效率:高效,适合处理中等规模的多项式运算。总结以上code实现了单链表实现了多项式的表示和相加操作。代码核心逻辑是保持链表按指数降序排列,并通过合并同类项来简化结果。以上代码结构清晰,易于扩展(例如支持多项式乘法、减法等操作)。

还是那句话:干中学,学中干

如果觉得不错的话,麻烦点个关注,收藏谢谢。

毕竟:

我太想进步了

1 阅读:10
编程探索课程

编程探索课程

感谢大家的关注