02-线性结构1 一元多项式的乘法与加法运算
2015-09-17 15:00
435 查看
#include <stdio.h> #include <stdlib.h> typedef struct node{ int coefficient; int exponent; struct node * next; } PolyNode, *Polynomial; Polynomial ReadPoly(); void Attach(int c, int e, Polynomial * Rear); Polynomial MultPoly(Polynomial P1, Polynomial P2); Polynomial AddPoly(Polynomial P1, Polynomial P2); void PrintPoly(Polynomial P); int main(int argc, char const *argv[]) { Polynomial Poly1, Poly2, PolySum, PolyMul; Poly1 = ReadPoly(); Poly2 = ReadPoly(); PolyMul = MultPoly(Poly1, Poly2); PrintPoly(PolyMul); PolySum = AddPoly(Poly1, Poly2); PrintPoly(PolySum); return 0; } Polynomial ReadPoly() { Polynomial P, Rear, temp; P = (PolyNode*)malloc(sizeof(PolyNode)); P->next = NULL; Rear = P; int N, c, e; scanf("%d", &N); while(N--){ scanf("%d %d", &c, &e); Attach(c, e, &Rear); } temp = P; P = P->next; free(temp); return P; } void Attach(int c, int e, Polynomial * pRear) { Polynomial P; P = (PolyNode*)malloc(sizeof(PolyNode)); P->coefficient = c; P->exponent = e; P->next = NULL; (*pRear)->next = P; *pRear = P; } Polynomial MultPoly(Polynomial P1, Polynomial P2) { Polynomial P, temp1, temp2, Rear, temp; int c, e; if(!P1 || !P2) return NULL; temp1 = P1; temp2 = P2; P = (PolyNode*)malloc(sizeof(PolyNode)); P->next = NULL; Rear = P; while(temp2){ c = temp1->coefficient * temp2->coefficient; e = temp1->exponent + temp2->exponent; if(c != 0){ Attach(c, e, &Rear); temp2 = temp2->next; } } temp1 = temp1->next; while(temp1){ temp2 = P2, Rear = P; while(temp2){ c = temp1->coefficient * temp2->coefficient; e = temp1->exponent + temp2->exponent; if(c != 0){ while(Rear->next && Rear->next->exponent > e) Rear = Rear->next; if(Rear->next && Rear->next->exponent == e){ if(Rear->next->coefficient + c) Rear->next->coefficient += c; else{ temp = Rear->next; Rear->next = temp->next; free(temp); } } else{ temp = (PolyNode*)malloc(sizeof(PolyNode)); temp->coefficient = c; temp->exponent = e; temp->next = Rear->next; Rear->next = temp; Rear = Rear->next; } temp2 = temp2->next; } } temp1 = temp1->next; } temp = P; P = P->next; free(temp); return P; } Polynomial AddPoly(Polynomial P1, Polynomial P2) { Polynomial P, temp1, temp2, Rear, temp; if(!P1 && !P2){ if(!P1) return P2; else return P1; } P = (PolyNode*)malloc(sizeof(PolyNode)); P->next = NULL; Rear = P; temp1 = P1; temp2 = P2; while(temp1 && temp2){ if(temp1->exponent > temp2->exponent){ if(temp1->coefficient){ Attach(temp1->coefficient, temp1->exponent, &Rear); } temp1 = temp1->next; } else if(temp1->exponent == temp2->exponent){ if(temp1->coefficient + temp2->coefficient){ Attach(temp1->coefficient + temp2->coefficient, temp1->exponent, &Rear); } temp1 = temp1->next; temp2 = temp2->next; } else{ if(temp2->coefficient){ Attach(temp2->coefficient, temp2->exponent, &Rear); } temp2 = temp2->next; } } while(temp1){ Attach(temp1->coefficient, temp1->exponent, &Rear); temp1 = temp1->next; } while(temp2){ Attach(temp2->coefficient, temp2->exponent, &Rear); temp2 = temp2->next; } temp = P; P = P->next; free(temp); return P; } void PrintPoly(Polynomial P) { int flag = 0; if(!P){ printf("0 0"); } while(P){ if (!flag) flag = 1; else printf(" "); printf("%d %d", P->coefficient, P->exponent); P = P->next; } printf("\n"); }
相关文章推荐
- Struts 2 ModelDriven example
- java.util.Scanner应用详解
- 241个jquery插件—jquery插件大全
- mac上安装gradle
- (转)java.util.Scanner应用详解
- 线程中断
- English summary Over the past year
- 01-复杂度2 Maximum Subsequence Sum
- android图片:高效加载大图
- [No00000A]计算机的存储单位
- 【pm2】
- win10安装Sql Server 2014图文教程
- velocity的了解及学习
- 每个程序员都应该了解的内存知识
- 网页性能管理详解
- 【bzoj1202】 HNOI2005狡猾的商人 并查集
- HDU 3032 Nim or not Nim?(博弈 sg表)
- 终于决定把自己的小窝从CSDN搬到博客园了
- ZOJ 3894 Chessgame
- Android之SurfaceView