链表的应用:单元多项式的加法、减法、乘法
使用链表来实现单元多项式的加法、减法、乘法。一个单元多项式的节点结构无非是这种:系数域、指数域、链域。
例如以下图:
我们使用链表来模拟单元多项式的常见运算。
当中,加法是其他运算的基础。减法:poly1-poly2=poly1+(-poly2),乘法:poly1*poly2。可用poly1乘以poly2的每一项,相加其乘积结果。
单元多项式的节点结构类型是这种:
typedef struct node { float coef; //系数 int expn; //指数 struct node *next; }PolyNode; //多项式节点 polynomial node
多项式的加法我们提供了两种:
1.Polynomial polyAdd(Polynomial poly1, Polynomial poly2),把poly1和poly2相加得到一个新的多项式。相加的过程中poly1和poly2保持不变,不会被破坏。
2.void add(Polynomial poly1, Polynomial poly2),把poly2加到poly1上。相加的过程中poly2的节点会被利用上。结束后。poly2不存在了。
提供第一种加法,是为了保持poly1和poly2不变,以便进行下一次的运算。提供另外一种加法,是为了运算结束后,内存不会泄露。
其他详细细节得看代码了:
#include<stdio.h> #include<stdlib.h> typedef struct node { float coef; //系数 int expn; //指数 struct node *next; }PolyNode; //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() //创建多项式 { PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode)); //头节点 head->next = NULL; float coef; int expn; printf("输入该多项式每一项的系数和指数。每项一行。输入0 0结束!\n"); while (scanf("%f %d", &coef, &expn) && coef) // 默认,按指数递减排列 { if (head->next) { p = head; while (p->next && expn < p->next->expn) p = p->next; if (p->next) { if (expn == p->next->expn) //有同样指数的直接把系数加到原多项式 { p->next->coef += coef; //若是相加后系数为0。则舍弃该节点 if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { q = p->next; p->next = q->next; free(q); } } else { q = (PolyNode*)malloc(sizeof(PolyNode)); q->coef = coef; q->expn = expn; q->next = p->next; p->next = q; } } else { p->next = (PolyNode*)malloc(sizeof(PolyNode)); p = p->next; p->coef = coef; p->expn = expn; p->next = NULL; } } else { head->next = (PolyNode*)malloc(sizeof(PolyNode)); head->next->coef = coef; head->next->expn = expn; head->next->next = NULL; } } return head; } //多项式与指定单项式相乘,该单项式为 coefx^expn Polynomial multiply(Polynomial poly, float coef, int expn) { PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode)); p = Poly; q = poly->next; while (q) { p->next = (PolyNode*)malloc(sizeof(PolyNode)); p = p->next; p->coef = (q->coef*coef); p->expn = (q->expn + expn); q = q->next; } p->next = NULL; return Poly; } void add(Polynomial poly1, Polynomial poly2) //把 poly2 加到 poly1 上 { PolyNode *p, *q, *r; r = poly1; p = poly1->next; //指向第一个节点 q = poly2->next; poly2->next = NULL; while (p && q) { if (p->expn > q->expn) { r->next = p; p = p->next; r = r->next; } else if (p->expn < q->expn) { r->next = q; q = q->next; r = r->next; } else { PolyNode *t; p->coef += q->coef; if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0 { r->next = p; r = r->next; p = p->next; } else { t = p; p = p->next; free(t); } t = q; q = q->next; free(t); } } if (p) r->next = p; if (q) r->next = q; } //多项式减法 poly1-poly2形成一个新的多项式 Polynomial polySubtract(Polynomial poly1, Polynomial poly2) { //把poly2的系数取相反数。形成一个新的多项式 Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点 PolyNode *p, *q; p = poly; q = poly2->next; while (q) { p->next = (PolyNode*)malloc(sizeof(PolyNode)); p = p->next; p->coef = -(q->coef); //系数取反 p->expn = q->expn; q = q->next; } p->next = NULL; add(poly, poly1); //利用加法 return poly; } //多项式相加 poly1+poly2形成一个新的多项式 Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //和多项式的头节点 poly->next = NULL; PolyNode *p, *q, *r; r = poly; p = poly1->next; q = poly2->next; while (p&&q) { if (p->expn > q->expn) { r->next = (PolyNode*)malloc(sizeof(PolyNode)); r = r->next; r->coef = p->coef; r->expn = p->expn; p = p->next; } else if (p->expn < q->expn) { r->next = (PolyNode*)malloc(sizeof(PolyNode)); r = r->next; r->coef = q->coef; r->expn = q->expn; q = q->next; } else { float m = p->coef + q->coef; if (!(m > -0.000001 && m < 0.000001)) { r->next = (PolyNode*)malloc(sizeof(PolyNode)); r = r->next; r->coef = m; r->expn = p->expn; } q = q->next; p = p->next; } } while (p) { r->next = (PolyNode*)malloc(sizeof(PolyNode)); r = r->next; r->coef = p->coef; r->expn = p->expn; p = p->next; } while (q) { r->next = (PolyNode*)malloc(sizeof(PolyNode)); r = r->next; r->coef = q->coef; r->expn = q->expn; q = q->next; } r->next = NULL; return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) //多项式相乘 { Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //创建多项式和的头节点 poly->next = NULL; PolyNode *p; p = poly2->next; while (p) { add(poly, multiply(poly1, p->coef, p->expn)); p = p->next; } return poly; } void printPoly(Polynomial poly) //打印多项式 { if (poly && poly->next) { PolyNode *p = poly->next; //p指向第一个节点 while (p->next) { printf("%gx^%d", p->coef, p->expn); p = p->next; if (p && (p->coef > 0)) printf("+"); } if (p->expn == 0) printf("%g", p->coef); //打印常数项 else printf("%gx^%d", p->coef, p->expn); printf("\n"); } } void clear(Polynomial poly) //释放内存 { if (poly && poly->next) { PolyNode *p, *q; p = poly; while (p) { q = p->next; free(p); p = q; } } poly = NULL; }
调用方法:
int main() { printf("用链表实现多项式的加减法\n"); Polynomial poly1, poly2, poly; printf("创建多项式一\n"); poly1 = createPolynomial(); printf("多项式一:\n"); printPoly(poly1); printf("创建多项式二\n"); poly2 = createPolynomial(); printf("多项式二:\n"); printPoly(poly2); printf("两多项式相加。和为:\n"); poly = polyAdd(poly1, poly2); printPoly(poly); clear(poly); printf("两个多项式相乘,积为:\n"); poly = polyMultiply(poly1, poly2); printPoly(poly); clear(poly); printf("两多项式相减。差为:\n"); poly = polySubtract(poly1, poly2); printPoly(poly); clear(poly1); clear(poly2); clear(poly); system("pause"); return 0; }
调用中,调用次序是加法、乘法、减法,减法放最后。
这是由于减法的过程中poly2会被破坏掉。细致看看add()方法就可明确。
执行:
代码比較长。逻辑有些复杂。得重复地看。
完整代码下载:一元多项式的加法、减法、乘法
若是有所帮助,顶一个哦!
专栏完整文件夹: