在学习C语言链表多项式之前,你可能已经接触过数组、结构体等基础数据类型。但当你需要处理像多项式这样“项数不固定、系数和指数可变”的数学对象时,传统的数组就显得不够灵活了。这时候,链表就派上了大用场!
本文将带你从零开始,用C语言实现链表多项式的存储与加法运算,即使你是编程小白,也能轻松理解并动手实践。
一个多项式如:3x⁵ + 2x³ - x + 7,它包含4项,每项有系数(如3、2、-1、7)和指数(如5、3、1、0)。如果用数组存储,我们需要预先分配足够大的空间,而且很多位置可能是空的(比如指数为4、2的位置),造成内存浪费。
而链表是动态分配内存的,有多少项就建多少节点,非常高效!
每个节点代表多项式的一项,包含系数(coef)、指数(exp)和指向下一个节点的指针(next)。
struct PolyNode { int coef; // 系数 int exp; // 指数 struct PolyNode* next;};typedef struct PolyNode PolyNode; 我们写一个函数,通过输入系数和指数,逐步构建多项式链表。为了保持指数从高到低排序,我们采用有序插入的方式。
PolyNode* createPolynomial() { PolyNode* head = NULL; PolyNode* tail = NULL; int coef, exp; printf("请输入多项式的项(系数 指数),输入 0 0 结束:\n"); while (1) { scanf("%d %d", &coef, &exp); if (coef == 0 && exp == 0) break; PolyNode* newNode = (PolyNode*)malloc(sizeof(PolyNode)); newNode->coef = coef; newNode->exp = exp; newNode->next = NULL; if (head == NULL || head->exp < exp) { // 插入到头部 newNode->next = head; head = newNode; } else { // 找到合适位置插入 PolyNode* curr = head; while (curr->next != NULL && curr->next->exp > exp) { curr = curr->next; } if (curr->next != NULL && curr->next->exp == exp) { // 合并同类项 curr->next->coef += coef; if (curr->next->coef == 0) { // 系数为0,删除该项 PolyNode* temp = curr->next; curr->next = temp->next; free(temp); } free(newNode); // 不需要新节点 } else { // 插入新节点 newNode->next = curr->next; curr->next = newNode; } } } return head;} 多项式加法的核心思想是:指数相同则系数相加,不同则保留原项。我们可以用两个指针分别遍历两个链表,按指数大小合并。
PolyNode* addPolynomials(PolyNode* p1, PolyNode* p2) { PolyNode* result = NULL; PolyNode* tail = NULL; while (p1 != NULL && p2 != NULL) { PolyNode* newNode = (PolyNode*)malloc(sizeof(PolyNode)); if (p1->exp > p2->exp) { newNode->coef = p1->coef; newNode->exp = p1->exp; p1 = p1->next; } else if (p1->exp < p2->exp) { newNode->coef = p2->coef; newNode->exp = p2->exp; p2 = p2->next; } else { newNode->coef = p1->coef + p2->coef; newNode->exp = p1->exp; p1 = p1->next; p2 = p2->next; if (newNode->coef == 0) { free(newNode); continue; } } newNode->next = NULL; if (result == NULL) { result = tail = newNode; } else { tail->next = newNode; tail = newNode; } } // 处理剩余项 while (p1 != NULL) { PolyNode* newNode = (PolyNode*)malloc(sizeof(PolyNode)); newNode->coef = p1->coef; newNode->exp = p1->exp; newNode->next = NULL; if (tail == NULL) result = newNode; else tail->next = newNode; tail = newNode; p1 = p1->next; } while (p2 != NULL) { PolyNode* newNode = (PolyNode*)malloc(sizeof(PolyNode)); newNode->coef = p2->coef; newNode->exp = p2->exp; newNode->next = NULL; if (tail == NULL) result = newNode; else tail->next = newNode; tail = newNode; p2 = p2->next; } return result;} 为了验证我们的结果,写一个打印函数:
void printPolynomial(PolyNode* head) { if (head == NULL) { printf("0\n"); return; } PolyNode* curr = head; while (curr != NULL) { if (curr != head && curr->coef > 0) printf("+"); if (curr->exp == 0) { printf("%d", curr->coef); } else if (curr->exp == 1) { if (curr->coef == 1) printf("x"); else if (curr->coef == -1) printf("-x"); else printf("%dx", curr->coef); } else { if (curr->coef == 1) printf("x^%d", curr->exp); else if (curr->coef == -1) printf("-x^%d", curr->exp); else printf("%dx^%d", curr->coef, curr->exp); } curr = curr->next; } printf("\n");} 将上述函数整合到 main() 中:
#include <stdio.h>#include <stdlib.h>// 此处插入上面定义的所有函数...int main() { printf("=== C语言链表多项式加法演示 ===\n"); printf("输入第一个多项式:\n"); PolyNode* p1 = createPolynomial(); printf("输入第二个多项式:\n"); PolyNode* p2 = createPolynomial(); printf("\n多项式1: "); printPolynomial(p1); printf("多项式2: "); printPolynomial(p2); PolyNode* sum = addPolynomials(p1, p2); printf("相加结果: "); printPolynomial(sum); // 注意:实际项目中应释放链表内存(略) return 0;} 通过本教程,你已经掌握了如何使用C语言链表多项式来动态存储和运算多项式。这种链表实现多项式的方法不仅节省内存,还能高效处理任意长度的多项式。
这是数据结构链表教程中的经典案例,建议你动手敲一遍代码,加深理解。掌握它,你就离精通C语言多项式运算更近了一步!
关键词回顾:C语言链表多项式、链表实现多项式、C语言多项式运算、数据结构链表教程
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129213.html