1、数据结构实验报告一多项式及其运用中南大学物理学院数据结构实验报告- - - - 一元多项式相加及其运用 专业班级:电信0903 时间:2010年10月18日数据结构实验报告- 一元多项式相加及其运用【问题描述】设计一个一元稀疏多项式简单计算器【基本要求】 一元稀疏多项式简单计算器的功能是: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,cn,en,其中n是多 项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。【运用拓展】(1)计算多项式在x处的
2、值;(2)多项式a和b相乘,建立乘积多项式ab;(3)计算器的仿真友好界面。【设计思路分析】 (1)解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表。 (2)运用尾插法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题 (3)设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则: 若p-expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 若p-expn=q-expn,则将两个结点中的系数相加,当和不为0时修改结点
3、p的系数。 若p-expnq-expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。【 测试数据】多项式a:6x+3x5-7.1x11多项式b: 2-5x5+11x9若计算a+b则有:(6x+3x5-7.1x11)+(2-5x5+11x9)=(-7.1x11+11x9-2x5+6x+2)等。【操作界面显示】 1:建立多项式的操作:2:输出多项式及计算x的值 3:进行运算操作: 4:结束程序:【程序代码】#include /调用输入输出函数#includetypedef struct Polynomial /定义一个Polyn结构体 flo
4、at coef; int exp; /系数指定为浮点型,指数指定为整型 struct Polynomial *next;*Polyn,Polynomial; void Insert(Polyn p,Polyn h) /查找位置插入新链节 if(p-coef=0) free(p); /p系数为0的话释放结点 else /否则查找插入位置 Polyn q1,q2; q1=h; q2=h-next; while(q2& p-exp exp) /指数较大则插前面 q1=q2; q2=q2-next; if(q2& p-exp = q2-exp) /将指数相同相合并 q2-coef += p-coef;
5、 free(p); if(!q2-coef) /系数为0的话释放结点 q1-next=q2-next; free(q2); else p-next=q2; q1-next=p; /指数为新时将结点插入 /第一个else /void 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
6、;icoef,&p-exp); Insert(p,head); /调用Insert函数插入结点 return head;void PrintPolyn(Polyn P) /输出多项式 Polyn q=P-next; int flag=1; /项数计数器 if(!q) /若多项式为空,输出0 putchar(0); printf(n); return; /void if while(q) if(q-coef0& flag!=1) putchar(+); /系数大于0且不是第一项,显示+连接 if(q-coef!=1&q-coef!=-1) /系数非1或-1时输出 printf(%g,q-coef
7、); if(q-exp=1) putchar(X); /指数为1时,直接输出X else if(q-exp) printf(X%d,q-exp); /指数不为1时,输入X格式 /while if if else if(q-coef=1) if(!q-exp) putchar(1); else if(q-exp=1) putchar(X); else printf(X%d,q-exp); /else if if(q-coef=-1) /系数为-1时,前面加上负号,其他情况与+1类似 if(!q-exp) printf(-1); else if(q-exp=1) printf(-X); else
8、printf(-X%d,q-exp); /else if if /else q=q-next; flag+; /while printf(n); /voidint compare(Polyn a,Polyn b) /两个多项式的判断 if(a&b) /若两个多项式都非空 if(!b|a-expb-exp) return 1; /b多项式已空或指数较小,返回1 else if(!a|a-expexp) return -1; /a多项式已空或指数较小,返回-1 else return 0; /a、b两多项式的指数相等,返回0 /if else if(!a&b) return -1; /a多项式已空
9、,但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(sizeof(struct Polynomial);
10、 /开辟地址空间 switch(compare(qa,qb) /判断多项式a和b case 1: qc-coef=qa-coef; /输入a多项式 qc-exp=qa-exp; qa=qa-next; break; case 0: qc-coef=qa-coef+qb-coef; /指数相等时系数相加 qc-exp=qa-exp; qa=qa-next; qb=qb-next; break; case -1: qc-coef=qb-coef; /输入b多项式 qc-exp=qb-exp; qb=qb-next; break; /switch if(qc-coef!=0) /当相加系数不为0,加
11、入该结点 qc-next=hc-next; hc-next=qc; hc=qc; else free(qc); /当相加系数为0时,释放该结点 /while return headc;Polyn 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; /while pd=AddPolyn(pa,h); for(p=h-next;p;p=p-next) /恢复pb的系数 p-coef*=-1
12、; return pd; /SubtractPolynPolyn MultiplyPolyn(Polyn pa,Polyn pb) /求解并建立多项式a*b,返回其头指针 Polyn hf,pf; Polyn qa=pa-next; Polyn qb=pb-next; hf=(Polyn)malloc(sizeof(struct Polynomial); /建立头结点 hf-next=NULL; for(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(Polyn)malloc(sizeof(struct Polynomial); pf-coe
13、f=qa-coef*qb-coef; pf-exp=qa-exp+qb-exp; Insert(pf,hf); /调用Insert函数以合并指数相同的项 /for for /for return hf;/MultiplyPolynfloat ValuePolyn(Polyn head,int x) /输入x值,计算并返回多项式的值 Polyn p; int i,t; float sum=0; for(p=head-next;p;p=p-next) t=1; for(i=p-exp;i!=0;) if(icoef*t; /计算求和 /for return sum; /ValuePolynvoid
14、 DestroyPolyn(Polyn p) /销毁多项式p Polyn q1,q2; q1=p-next; q2=q1-next; while(q1-next) /删除q1的元素直至q1为空 free(q1); q1=q2; q2=q2-next; /DestroyPolynvoid main() int m,n,a,x;char flag; Polyn pa=0,pb=0,pc; printf( -n); printf( 欢迎使用一元多项式及其运用操作程序n); printf( -n); printf(请输入多项式a的项数:); scanf(%d,&m); pa=CreatePolyn(p
15、a,m); /建立多项式a printf(请输入多项式b的项数:); scanf(%d,&n); pb=CreatePolyn(pb,n); /建立多项式b /输出菜单 printf( *n); printf( * 一元稀疏多项式简单计算器 *n); printf( * *n); printf( * A:输出多项式a B:输出多项式b *n); printf( * *n); printf( * C:同时输出多项式a和b *n); printf( * *n); printf( * D:代入x的值计算a E:代入x的值计算b *n); printf( * *n); printf( * F:代人x的
16、值同时计算a和b *n); printf( * *n); printf( * G:输出a+b H:输出a-b *n); printf( * *n); printf( * I:输出a*b J:退出 *n); printf( * *n); printf( *n); while(a) printf(n请选择操作:); /提示选择操作 scanf( %c,&flag); /输入选择 switch(flag) /输入大小写都可以判断 caseA: casea: printf(n 多项式a=); /输出多项式a PrintPolyn(pa); /调用输出函数显示 break; /跳出 caseB: cas
17、eb: printf(n 多项式b=); /输出多项式b PrintPolyn(pb); break; caseC: casec: printf(n 多项式a=); /输出多项式a和b PrintPolyn(pa); printf(n 多项式b=); PrintPolyn(pb); break; caseD: cased: printf(输入x的值:x=); /输入x值后计算a scanf(%d,&x); printf(n x=%d时,a=%.3fn,x,ValuePolyn(pa,x); break; caseE: casee: printf(输入x的值:x=); /输入x值后计算b sca
18、nf(%d,&x); printf(n x=%d时,b=%.3fn,x,ValuePolyn(pb,x); break; caseF: casef: printf(输入x的值:x=); /输入x值后计算a和b scanf(%d,&x); printf(n x=%d时,a=%.3fn,x,ValuePolyn(pa,x); printf(n x=%d时,b=%.3fn,x,ValuePolyn(pb,x); break; caseG: caseg: pc=AddPolyn(pa,pb); /输出a+b,用新多项式显示 printf(n a+b=); PrintPolyn(pc); break;
19、caseH: caseh: pc=SubtractPolyn(pa,pb); /输出a-b,用新多项式显示 printf(n a-b=); PrintPolyn(pc); break; caseI: casei: pc=MultiplyPolyn(pa,pb); /输出a*b,用新多项式显示 printf(n a*b=); PrintPolyn(pc); break; caseJ: casej: printf(n 感谢使用此程序!n); /退出该程序 DestroyPolyn(pa); /删除多项式a DestroyPolyn(pb); /删除多项式b a=0; /暂停显示界面,用户选择关闭 break; default: printf(n 您的选择错误,请重新选择!n); /swich /while/main
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1