用链表表示多项式时,每个链表结点存储多项式中的一个非零项包括系数和指数
1条回答 默认 最新
- 赵4老师 2022-03-30 09:31关注
仅供参考:
//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node { float coef; //系数 int expn; //指数 struct node *next; } PolyNode; 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 (1) { scanf("%f %d", &coef, &expn); if (0.0==coef && 0==expn) break; 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; if (-0.00001f < p->next->coef && p->next->coef < 0.00001f) { //若是相加后系数为0,则舍弃该节点 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; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+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 (!(-0.00001f <m && m < 0.00001f)) { 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 polySubtract(Polynomial poly1, Polynomial poly2) { //多项式减法 poly1-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; Polynomial poly3 = polyAdd(poly1, poly); //利用加法 return poly3; } 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 (!(-0.00001f < p->coef && p->coef < 0.00001f)) { //系数不为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; } void printPoly(Polynomial poly) { //打印多项式 if (poly && poly->next) { PolyNode *p = poly->next; //p指向第一个节点 while (p->next) { if (1!=p->expn) printf("%g X^%d", p->coef, p->expn); else printf("%g X" , p->coef ); p = p->next; if (p) { if (p->coef > 0) printf(" +"); else printf(" "); } } if (p->expn == 0) printf("%g", p->coef); //打印常数项 else { if (1!=p->expn) printf("%g X^%d", p->coef, p->expn); else printf("%g X" , p->coef ); } printf("\n"); } else { printf("0\n"); } } Polynomial multiply(Polynomial poly, float coef, int expn) { //多项式与指定单项式相乘,该单项式为 coefx^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; // printf("多项式");printPoly(poly); // printf("乘");printf("%g X^%d\n",coef,expn); // printPoly(Poly); 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)); // printf("子多项式");printPoly(poly); p = p->next; } // printf("结果多项式");printPoly(poly); return poly; } void freePoly(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, poly3; printf("创建多项式一\n"); poly1 = createPolynomial(); printf("创建多项式二\n"); poly2 = createPolynomial(); printf(" 多项式一:");printPoly(poly1); printf(" 多项式二:");printPoly(poly2); poly3 = polyAdd(poly1, poly2); printf("两多项式相加,和为:");printPoly(poly3); freePoly(poly3); poly3 = polySubtract(poly1, poly2); printf("两多项式相减,差为:");printPoly(poly3); freePoly(poly3); // printf(" 多项式一:");printPoly(poly1); // printf(" 多项式二:");printPoly(poly2); poly3 = polyMultiply(poly1, poly2); printf("两多项式相乘,积为:");printPoly(poly3); freePoly(poly3); freePoly(poly2); freePoly(poly1); system("pause"); return 0; } //用链表实现多项式的加减乘法 //创建多项式一 //输入该多项式每一项的系数和指数,每项一行,输入0 0结束! //4 9 //3 6 //2 5 //0 0 //创建多项式二 //输入该多项式每一项的系数和指数,每项一行,输入0 0结束! //4 9 //3 6 //2 5 //0 0 // 多项式一:4 X^9 +3 X^6 +2 X^5 // 多项式二:4 X^9 +3 X^6 +2 X^5 //两多项式相加,和为:8 X^9 +6 X^6 +4 X^5 //两多项式相减,差为:0 //两多项式相乘,积为:16 X^18 +24 X^15 +16 X^14 +9 X^12 +12 X^11 +4 X^10 //请按任意键继续. . .
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥15 stable diffusion
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条