1、一元多项式的计算一、 需求分析建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果二、 概要设计存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。基本算法:1、输入输出(1)功能:将要进行运算的多项式输入输出。(2)数据流入:要输入的多项式的系数与指数。(3)数据流出
2、:合并同类项后的多项式。(4)程序流程图:多项式输入流程图如图 1 所示。(5)测试要点:输入的多项式是否正确,若输入错误则重新输入开始申请结点空间+num输入多项式的项数指针数组tempi中(i=1num)输入多项式各项的系数 x, 指数 y输出已输入的多项式 合并同类项结束否是是否输入正确图表 12、多项式的加法(1)功能:将两多项式相加。(2)数据流入:输入函数。(3)数据流出:多项式相加后的结果。(4)程序流程图:多项式的加法流程图如图 2 所示。(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。图表 2开始定义存储结果的空链 r是 否输出存储多项式的和的链 r结束
3、是否同指数项系数相加后存入 r中直接把 p 中各项存入 r中直接把 q 中各项存入 r存储多项式 2 的空链 Q 是否为空存储多项式 1 的空链 P 是否为空合并同类项3、多项式的减法(1)功能:将两多项式相减。(2)数据流入:调用输入函数。(3)数据流出:多项式相减后的结果。(4)程序流程图:多项式的减法流程图如图 3 所示。(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。开始定义存储结果的空链 r是 否输出存储多项式的和的链 r结束是否同指数项系数相加后存入 r中把 p 中各项系数改变符号后存入r 中直接把 q 中各项存入 r存储多项式 2 的空链 Q 是否为空存储多
4、项式 1 的空链 P 是否为空合并同类项图表 3三、 详细设计 #include#includetypedef struct Polynomialfloat coef;int expn;struct Polynomial *next;*Polyn,Polynomial; /Polyn 为结点指针类型void Insert(Polyn p,Polyn h) if(p-coef=0) free(p); /系数为 0 的话释放结点elsePolyn q1,q2;q1=h;q2=h-next;while(q2q2=q2-next;if(q2free(p);if(!q2-coef) /系数为 0 的话释
5、放结点q1-next=q2-next;free(q2);else /指数为新时将结点插入p-next=q2;q1-next=p;/InsertPolyn CreatePolyn(Polyn head,int m)/建立一个头指针为 head、项数为 m 的一元多项式int i;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial);head-next=NULL;for(i=0;icoef,Insert(p,head); /调用 Insert 函数插入结点return head;/CreatePolynvoid DestroyPolyn(Po
6、lyn p)/销毁多项式 pPolyn q1,q2;q1=p-next;q2=q1-next;while(q1-next)free(q1);q1=q2;/指针后移q2=q2-next;void PrintPolyn(Polyn P) Polyn q=P-next; int flag=1;/项数计数器if(!q) /若多项式为空,输出 0putchar(0); printf(“n“);return; while (q)if(q-coef0 /系数大于 0 且不是第一项if(q-coef!=1 if(q-expn=1) putchar(X);else if(q-expn) printf(“X%d“
7、,q-expn);elseif(q-coef=1)if(!q-expn) putchar(1); else if(q-expn=1) putchar(X); else printf(“X%d“,q-expn);if(q-coef=-1)if(!q-expn) printf(“-1“); else if(q-expn=1) printf(“-X“); else printf(“-X%d“,q-expn);q=q-next; flag+;/whileprintf(“n“);/PrintPolynint compare(Polyn a,Polyn b)if(aelse if(!a|a-expnexp
8、n) return -1;else return 0;else if(!a/a 多项式已空,但 b 多项式非空else return 1;/b 多项式已空,但 a 多项式非空/comparePolyn AddPolyn(Polyn pa,Polyn pb)/求解并建立多项式 a+b,返回其头指针Polyn qa=pa-next;Polyn qb=pb-next;Polyn headc,hc,qc;hc=(Polyn)malloc(sizeof(struct Polynomial);/建立头结点hc-next=NULL;headc=hc;while(qa|qb)qc=(Polyn)malloc(
9、sizeof(struct Polynomial);switch(compare(qa,qb)case 1:qc-coef=qa-coef;qc-expn=qa-expn;qa=qa-next;break;case 0: qc-coef=qa-coef+qb-coef;qc-expn=qa-expn;qa=qa-next;qb=qb-next;break;case -1:qc-coef=qb-coef;qc-expn=qb-expn;qb=qb-next;break; /switchif(qc-coef!=0)qc-next=hc-next;hc-next=qc;hc=qc;else free
10、(qc);/当相加系数为 0 时,释放该结点/whilereturn headc;/AddPolynPolyn SubtractPolyn(Polyn pa,Polyn pb)/求解并建立多项式 a+b,返回其头指针Polyn h=pb;Polyn p=pb-next;Polyn pd;while(p) /将 pb 的系数取反p-coef*=-1;p=p-next;pd=AddPolyn(pa,h);for(p=h-next;p;p=p-next) /恢复 pb 的系数p-coef*=-1;return pd;/SubtractPolynint main()int m,n,flag=0;flo
11、at x;Polyn pa=0,pb=0,pc,pd,pe,pf;/定义各式的头指针,pa 与 pb 在使用前付初值 NULLprintf(“请输入 a 的项数:“);scanf(“%d“,pa=CreatePolyn(pa,m);/建立多项式 aprintf(“请输入 b 的项数:“);scanf(“%d“,pb=CreatePolyn(pb,n);/建立多项式 a/输出菜单printf(“*n“);printf(“操作提示:nt1.输出多项式 a 和 bnt2.建立多项式 a+bnt3.建立多项式 a-bn“);printf(“t4.退出n*n“);for(;flag=0)printf(“
12、执行操作:“);scanf(“%d“,if(flag=1)printf(“多项式 a:“);PrintPolyn(pa);printf(“多项式 b:“);PrintPolyn(pb);continue;if(flag=2)pc=AddPolyn(pa,pb);printf(“多项式 a+b:“);PrintPolyn(pc);DestroyPolyn(pc);continue;if(flag=3)pd=SubtractPolyn(pa,pb);printf(“多项式 a-b:“);PrintPolyn(pd);DestroyPolyn(pd);continue;if(flag=4) break;if(flag4) printf(“Error!n“);continue;/forDestroyPolyn(pa);DestroyPolyn(pb);return 0;四、 调试结果1. 测试的数据及结果