数据结构实验报告1文档格式.docx
- 文档编号:22502906
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:42
- 大小:158.29KB
数据结构实验报告1文档格式.docx
《数据结构实验报告1文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
数据类型
ADTPolynomial{
数据对象:
D={ai|ai∈TermSet,i=1,2,…,m,m≥0TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,且ai-1中的指数值<ai中的指数值,i=2,…,n}
基本操作:
sort(Polyn&
h);
//对多项式进行排序
print(Polynh);
//输出多项式
delZeroCoef(Polyn&
//判断系数为零的情况
merge(Polyn&
//合并指数相同的项
createList();
//创建多项式
addPoly(Polynh1,Polynh2);
//多项式相加
subPoly(Polynh1,Polynh2);
//多项式相减
multPoly(Polynh1,Polynh2);
//多项式相乘
}ADTPolynomial
1.3详细设计
#include<
stdlib.h>
stdio.h>
ctype.h>
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"
&
coef,&
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;
next,Lb=Lb->
next)
if(La->
expn<
Lb->
expn){
f=La->
coef;
i=La->
expn;
coef=Lb->
expn=Lb->
coef=f;
expn=i;
fini=1;
for(g=h,La=g->
La;
)
if(g->
expn==La->
coef+=La->
next=La->
free(Lb);
elseif(g->
voidPrintfPoly(LNode*La){
LNode*Lb=La;
Lb){
putchar('
0'
);
return;
if(Lb->
coef!
=1){
%g"
Lb->
coef);
expn==1)putchar('
X'
elseif(Lb->
expn)printf("
X^%d"
elseif(!
expn)putchar('
1'
elseprintf("
Lb=Lb->
while(Lb){
coef>
0)putchar('
+'
intCompare(LNode*a,LNode*b){
if(a->
b->
expn)return-1;
expn>
expn)return1;
return0;
LNode*AddPolyn(LNode*Pa,LNode*Pb){
LNode*h,*qa=Pa,*qb=Pb,*La,*Lb;
floatsum;
h=La=(LNode*)malloc(sizeof(LNode));
while(qa&
qb){
switch(Compare(qa,qb)){
case-1:
next=qb;
La=qb;
qb=qb->
break;
case0:
sum=qa->
coef+qb->
if(sum!
=0.0){
next=qa;
qa->
coef=sum;
La=qa;
qa=qa->
else{
Lb=qa;
Lb=qb;
case1:
if(Pa)La->
if(Pb)La->
Lb=h;
h=h->
LNode*Add(LNode*Pa,LNode*Pb){
intn;
puts("
再输入1个一元多项式的项数"
%d"
n);
Pb=InitPolyn(Pb,n);
Pb=selsort(Pb);
PrintfPoly(Pa);
if(Pb&
Pb->
coef>
0)printf("
+"
PrintfPoly(Pb);
Pa=AddPolyn(Pa,Pb);
="
Pa=selsort(Pa);
returnPa;
LNode*SubtractPolyn(LNode*Pa,LNode*Pb){
LNode*La=Pb;
while(La){
coef*=-1;
returnAddPolyn(Pa,Pb);
LNode*Subtract(LNode*Pa,LNode*Pb){
\n再输入1个一元多项式的项数"
-"
('
)'
Pa=SubtractPolyn(Pa,Pb);
LNode*MultiplyPolyn(LNode*Pa,LNode*Pb){
Pb)returnNULL;
LNode*pa=Pa,*p,*q,*r,*s,*t;
r=p=(LNode*)malloc(sizeof(LNode));
while(pa){
p->
coef=pa->
expn=pa->
q=p;
p=p->
pa=pa->
q->
free(p);
pa=Pa;
t=s=(LNode*)malloc(sizeof(LNode));
q=s;
s=s->
free(s);
pa->
coef*=Pb->
expn+=Pb->
Pb=Pb->
while(Pb){
p=r;
s=t;
while(p){
s->
coef=p->
coef*Pb->
expn=p->
expn+Pb->
Pa=AddPolyn(Pa,t);
LNode*Multiply(LNode*Pa,LNode*Pb){
×
"
Pa=MultiplyPolyn(Pa,Pb);
voidmain(){
LNode*A,*B;
chars[2];
inti,n;
\t\t\t------------------------------\n"
\t\t\t一元多项式的表达与运算\n"
\t\t\t****MadebyHuangruiting****\n"
\n输入1个一元多项式的项数"
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)){
Error,请重新输入!
gotoq;
i=*s-48;
switch(i){
A=Add(A,B);
gotop;
;
case2:
A=Subtract(A,B);
case3:
A=Multiply(A,B);
case4:
default:
Error,请重新输入!
}
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}
数据关系:
ai-1,ai>
|ai-1,ai∈D,i=2,…,n}
约定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<
string.h>
math.h>
#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;
next=s;
returnp;
SF*Push(SF*s,floatf){//SF类型的指针Push,返回p
SF*p=(SF*)malloc(sizeof(SF));
f=f;
next=s;
returnp;
SC*Pop(SC*s)//sc类型的指针Pop
SC*q=s;
s=s->
free(q);
returns;
SF*Pop(SF*s)//sf类型的指针Pop
SF*q=s;
floatOperate(floata,unsignedchartheta,floatb)//计算函数Operate
switch(theta)
{
case'
:
returna+b;
returna-b;
returna*b;
returna/b;
returnpow(a,b);
default:
}
charOPSET[OPSETSIZE]={'
StatusIn(charTest,char*TestOp)
intFind=false;
for(inti=0;
i<
OPSETSIZE;
i++)
if(Test==TestOp[i])
Find=true;
returnFind;
StatusReturnOpOrd(charop,char*TestOp)
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告