数据结构实验报告1.docx
- 文档编号:9366850
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:42
- 大小:158.29KB
数据结构实验报告1.docx
《数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1.docx(42页珍藏版)》请在冰豆网上搜索。
数据结构实验报告1
1.一元多项式的表示及其运算的实现
1.1问题描述
符号多项式的操作,已经成为表处理的典型用例。
在数学上,一个一元多项式Pn(x)可按升幂写成:
Pn(x)=p0+p1x+p2x2+….+pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线性表P来表示:
P=(p0,p1,p2,…pn)每一项的指数i隐含在其系数pi的序号里。
假设Qm(x)是一元m次多项式,同样可用线性表Q来表示:
Q=(q0,q1,q2,…qm)。
不失一般性,设m R=(p0+q0,p1+q1,p2+q2,…,pm+qm,pm+1,…pn)。 显然,我们可以对P、Q和R采用顺序存储结构,使得多项式相加的算法定义十分简洁。 至此,一元多项式的表示及相加问题似乎已经解决了。 然而在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难决定。 特别是在处理形如: S(x)=1+3x10000+2x20000的多项式时,就要用一长度为20001的线性表来表示,表中仅有三个非零元素,这种对内存空间的浪费是应当避免的,但是如果只存储非零系数项则显然必须同时存储相应的指数。 一般情况下的一元n次多项式可写成: Pn(x)=p1xe1+p2xe2+…+pmxem 其中pi,是指数为ei的项的非零系数,且满足0≤e1 ((p1,e1),(p2,e2),…,(pm,em)) 在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。 但是,对于S(x)类的多项式,这种表示将大大节省空间。 本题要求选用线性表的一种合适的存储结构来表示一个一元多项式,并在此结构上实现一元多项式的加法,减法和乘法操作。 1.2设计方案与概要设计 实现实系数一元多项式的创建,打印以及两个一元多项式的加、减、乘运算。 程序所能达到的功能: a.实现一元多项式的输入; b.实现一元多项式的输出; c.计算两个一元多项式的和并输出结果; d.计算两个一元多项式的差并输出结果; e.计算两个一元多项式的积并输出结果。 程序实现: a.功能: 将要进行运算的二项式输入输出; b.数据流入: 要输入的二项式的系数与指数; c.数据流出: 合并同类项后的二项式; d.程序流程图: 二项式输入流程图; e.测试要点: 输入的二项式是否正确,若输入错误则重新输入 数据类型 ADTPolynomial{ 数据对象: D={ai|ai∈TermSet,i=1,2,…,m,m≥0TermSet中的每个元素包含一个表示系数的实数和表示指数的整数} 数据关系: R1={ 基本操作: sort(Polyn&h);//对多项式进行排序 print(Polynh);//输出多项式 delZeroCoef(Polyn&h);//判断系数为零的情况 merge(Polyn&h);//合并指数相同的项 createList();//创建多项式 addPoly(Polynh1,Polynh2);//多项式相加 subPoly(Polynh1,Polynh2);//多项式相减 multPoly(Polynh1,Polynh2);//多项式相乘 }ADTPolynomial 1.3详细设计 #include #include #include typedefstructLNode{ floatcoef; intexpn; structLNode*next; }LNode; LNode*InitPolyn(LNode*La,intn){ if(n<=0)returnNULL; LNode*h=La=(LNode*)malloc(sizeof(LNode)),*Lb; La->coef=0.0; inti; printf("依次输入%d个非零项(每项前一个为系数,后一个为指数)\n",n); for(i=1;i<=n;++i){ scanf("%f%d",&La->coef,&La->expn); if(La->coef) Lb=La; La=La->next=(LNode*)malloc(sizeof(LNode)); } Lb->next=NULL; free(La); returnh; } LNode*selsort(LNode*h){ LNode*g,*La,*Lb; if(! h)returnNULL; floatf; inti,fini=1; for(g=h;g->next&&fini;g=g->next){ fini=0; for(La=h,Lb=h->next;Lb;La=La->next,Lb=Lb->next) if(La->expn f=La->coef;i=La->expn; La->coef=Lb->coef;La->expn=Lb->expn; Lb->coef=f;Lb->expn=i; fini=1; } } for(g=h,La=g->next;La;) if(g->expn==La->expn){ g->coef+=La->coef; g->next=La->next; Lb=La; La=La->next; free(Lb); } elseif(g->next){ g=g->next; La=La->next; } returnh; } voidPrintfPoly(LNode*La){ LNode*Lb=La; if(! Lb){ putchar('0'); return; } if(Lb->coef! =1){ printf("%g",Lb->coef); if(Lb->expn==1)putchar('X'); elseif(Lb->expn)printf("X^%d",Lb->expn); } elseif(! Lb->expn)putchar('1'); elseif(Lb->expn==1)putchar('X'); elseprintf("X^%d",Lb->expn); Lb=Lb->next; while(Lb){ if(Lb->coef>0)putchar('+'); if(Lb->coef! =1){ printf("%g",Lb->coef); if(Lb->expn==1)putchar('X'); elseif(Lb->expn)printf("X^%d",Lb->expn); } elseif(! Lb->expn)putchar('1'); elseif(Lb->expn==1)putchar('X'); elseprintf("X^%d",Lb->expn); Lb=Lb->next; } } intCompare(LNode*a,LNode*b){ if(a->expn if(a->expn>b->expn)return1; return0; } LNode*AddPolyn(LNode*Pa,LNode*Pb){ LNode*h,*qa=Pa,*qb=Pb,*La,*Lb; floatsum; h=La=(LNode*)malloc(sizeof(LNode)); La->next=NULL; while(qa&&qb){ switch(Compare(qa,qb)){ case-1: La->next=qb; La=qb; qb=qb->next; break; case0: sum=qa->coef+qb->coef; if(sum! =0.0){ La->next=qa; qa->coef=sum; La=qa; qa=qa->next; } else{ Lb=qa; qa=qa->next; free(Lb); } Lb=qb; qb=qb->next; free(Lb); break; case1: La->next=qa; La=qa; qa=qa->next; break; } } if(Pa)La->next=qa; if(Pb)La->next=qb; Lb=h; h=h->next; free(Lb); returnh; } LNode*Add(LNode*Pa,LNode*Pb){ intn; puts("再输入1个一元多项式的项数"); scanf("%d",&n); Pb=InitPolyn(Pb,n); Pb=selsort(Pb); PrintfPoly(Pa); if(Pb&&Pb->coef>0)printf("+"); PrintfPoly(Pb); Pa=AddPolyn(Pa,Pb); printf("="); Pa=selsort(Pa); PrintfPoly(Pa); returnPa; } LNode*SubtractPolyn(LNode*Pa,LNode*Pb){ LNode*La=Pb; while(La){ La->coef*=-1; La=La->next; } returnAddPolyn(Pa,Pb); } LNode*Subtract(LNode*Pa,LNode*Pb){ intn; puts("\n再输入1个一元多项式的项数"); scanf("%d",&n); Pb=InitPolyn(Pb,n); Pb=selsort(Pb); PrintfPoly(Pa); printf("-"); putchar('(');PrintfPoly(Pb);putchar(')'); Pa=SubtractPolyn(Pa,Pb); printf("="); Pa=selsort(Pa); PrintfPoly(Pa); returnPa; } LNode*MultiplyPolyn(LNode*Pa,LNode*Pb){ if(! Pb)returnNULL; LNode*pa=Pa,*p,*q,*r,*s,*t; r=p=(LNode*)malloc(sizeof(LNode)); while(pa){ p->coef=pa->coef; p->expn=pa->expn; q=p; p=p->next=(LNode*)malloc(sizeof(LNode)); pa=pa->next; } q->next=NULL; free(p); pa=Pa; t=s=(LNode*)malloc(sizeof(LNode)); while(pa){ q=s; s=s->next=(LNode*)malloc(sizeof(LNode)); pa=pa->next; } q->next=NULL; free(s); pa=Pa; while(pa){ pa->coef*=Pb->coef; pa->expn+=Pb->expn; pa=pa->next; } Pb=Pb->next; while(Pb){ p=r; s=t; while(p){ s->coef=p->coef*Pb->coef; s->expn=p->expn+Pb->expn; p=p->next; s=s->next; } Pa=AddPolyn(Pa,t); Pb=Pb->next; } returnPa; } LNode*Multiply(LNode*Pa,LNode*Pb){ intn; puts("\n再输入1个一元多项式的项数"); scanf("%d",&n); Pb=InitPolyn(Pb,n); Pb=selsort(Pb); putchar('(');PrintfPoly(Pa);putchar(')'); printf("×"); putchar('(');PrintfPoly(Pb);putchar(')'); printf("="); Pa=MultiplyPolyn(Pa,Pb); Pa=selsort(Pa); PrintfPoly(Pa); returnPa; } voidmain(){ LNode*A,*B; chars[2]; inti,n; printf("\t\t\t------------------------------\n"); printf("\t\t\t一元多项式的表达与运算\n"); printf("\t\t\t------------------------------\n"); printf("\t\t\t****MadebyHuangruiting****\n"); puts("\n输入1个一元多项式的项数"); scanf("%d",&n); A=InitPolyn(A,n); A=selsort(A); PrintfPoly(A); p: puts("\n1: 加\n2: 减\n3: 乘\n4: 退出"); getchar(); q: gets(s); if(s[1]! ='\0'||! isdigit(*s)){ puts("Error,请重新输入! ");gotoq; } i=*s-48; switch(i){ case1: A=Add(A,B);gotop;; case2: A=Subtract(A,B);gotop;; case3: A=Multiply(A,B);gotop; case4: break; default: puts("Error,请重新输入! ");gotoq; } } 1.4程序运行说明与结果 运行说明: 首先根据提示输入一元多项式的项数。 例如: 3。 然后回车。 接着输入三个非零项,前一个为系数,后一个为指数。 每输入一个数按一个空格,最后一个回车。 例如: 123456。 在根据提示选择你要的算法。 例如: 1.进行加法运算。 此时程序会提醒你再输入一个多项式的项数。 例如: 3 。 三个非零项,前一个为系数,后一个为指数,每个数用空格隔开,最后一个数回车。 例如: 223654。 回车之后就会出现截图之后的结果。 此时你还可以接着选减法,乘法的操作。 运行结果: 2.算术表达式求值问题 2.1问题描述 根据算术运算符的优先级,根据输入的算术表达式,求表达式的值。 例如,输入的算术表达式形式为: 12+32*4,3*(12+24/(2+4)),3.6*(4.3+5) 2.2设计方案与概要设计 需求分析: 设计一个程序,演示用算符优先法对算术表达式求值的过程。 利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式: 表达式,例如2*(3+4) 包含的运算符只能有'+'、'-'、'*'、'/'、'('、')'; (2)输出的形式: 运算结果,例如2*(3+4)=14; (3)程序所能达到的功能: 对表达式求值并输出 2、系统设计 1、栈的抽象数据类型定义: ADTStack{ 数据对象: D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系: R1={ 约定an端为栈顶,ai端为栈底 基本操作: Push(&S,e) 初始条件: 栈S已存在 操作结果: 插入元素e为新的栈顶元素 Pop(&S,&e) 初始条件: 栈S已存在且非空 操作结果: 删除S的栈顶元素,并用e返回其值 }ADTStack 3、各个模块的主要功能: *Push(SC*s,charc): 把字符压栈 *Push(SF*s,floatf): 把数值压栈 *Pop(SC*s): 把字符退栈 *Pop(SF*s): 把数值退栈 Operate(a,theta,b): 根据theta对a和b进行'+'、'-'、'*'、'/'、'^'操作 In(Test,*TestOp): 若Test为运算符则返回true,否则返回false ReturnOpOrd(op,*TestOp): 若Test为运算符,则返回此运算符在数组中的下标 precede(Aop,Bop): 根据运算符优先级表返回Aop与Bop之间的优先级 EvaluateExpression(*MyExpression): 用算符优先法对算术表达式求值 2.3详细设计 #include #include #include #include #definetrue1 #definefalse0 #defineOPSETSIZE8 typedefintStatus; unsignedcharPrior[8][8]= {//运算符优先级表 //'+''-''*''/''('')''#''^' /*'+'*/'>','>','<','<','<','>','>','<', /*'-'*/'>','>','<','<','<','>','>','<', /*'*'*/'>','>','>','>','<','>','>','<', /*'/'*/'>','>','>','>','<','>','>','<', /*'('*/'<','<','<','<','<','=','','<', /*')'*/'>','>','>','>','','>','>','>', /*'#'*/'<','<','<','<','<','','=','<', /*'^'*/'>','>','>','>','<','>','>','>' }; typedefstructStackChar { charc; structStackChar*next; }SC;//StackChar类型的结点SC typedefstructStackFloat { floatf; structStackFloat*next; }SF;//StackFloat类型的结点SF SC*Push(SC*s,charc)//sc类型的指针push,返回p { SC*p=(SC*)malloc(sizeof(SC)); p->c=c; p->next=s; returnp; } SF*Push(SF*s,floatf){//SF类型的指针Push,返回p SF*p=(SF*)malloc(sizeof(SF)); p->f=f; p->next=s; returnp; } SC*Pop(SC*s)//sc类型的指针Pop { SC*q=s; s=s->next; free(q); returns; } SF*Pop(SF*s)//sf类型的指针Pop { SF*q=s; s=s->next; free(q); returns; } floatOperate(floata,unsignedchartheta,floatb)//计算函数Operate { switch(theta) { case'+': returna+b; case'-': returna-b; case'*': returna*b; case'/': returna/b; case'^': returnpow(a,b); default: return0; } } charOPSET[OPSETSIZE]={'+','-','*','/','(',')','#','^'}; StatusIn(charTest,char*TestOp) { intFind=false; for(inti=0;i { if(Test==TestOp[i]) Find=true; } returnFind; } StatusReturnOpOrd(charop,char*TestOp) { for(inti=0;i { if(op==TestOp[i]) returni; } } charprecede(charAop,charBop) { returnPrior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]; } floatEvaluateExpression(char*MyExpression) { //算数表达式值的算符优先级算法 //设optr和opnd分别为运算符栈和运算数栈,op为运算符集合 SC*OPTR=NULL;//运算符栈,字符元素 SF*OPND=NULL;//运算数栈,实数元素 cha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告