数据结构实验实验一Word下载.docx
- 文档编号:16930918
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:20
- 大小:272.18KB
数据结构实验实验一Word下载.docx
《数据结构实验实验一Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验实验一Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
typedefstructnode{
Coefficientc;
Exponente;
structnode*next;
}EntryNode,*Polynomial;
//定义项结点及多项式头指针
(2)各函数模块的申明
StatusCreatePoly(Polynomial*Poly);
//创建多项式,形参为多项式头指针的地址,返回值为Status类型
StatusDestoryPoly(Polynomial*Poly);
//多项式存在,则销毁多项式,形参为多项式头指针的地址,返回值为Status
类型
StatusPrintPoly(PolynomialPoly);
//多项式存在,则打印多项式,形参为多项式头指针,返回值为Status类型
StatusPolyAdd(Polynomial*Poly1,PolynomialPoly2);
//两多项式均存在,则相加,结果储存为前面那个多项式Poly1,形参为前一个多项式头指针地址和后一个多项式头指针,返回值为Status类型
StatusPolySub(Polynomial*Poly1,PolynomialPoly2);
//两多项式均存在,则相减,结果储存为前面那个多项式Poly1,形参为前一个多项式头指针地址和后一个多项式头指针,返回值为Status类型
floatPolyVal(PolynomialPoly,floatx);
//多项式存在,则求其在变量取值为x时的值,形参为多项式头指针和x值,
返回值为float类型
voidMenuShow();
//功能菜单,功客户选择当前操作,无形参,无返回值
(3)主程序(main函数)执行流程
3、调试分析
(1)调试中主要出现的问题在free()函数上,由于DestoryPoly函数要调用它,而DestoryPoly的形参是*Poly,则不能直接写语句free(Poly);
而要写成free(*Poly)的形式,因为实际申请的动态空间是Poly指向的内容;
(2)整个算法的时间复杂度为
,其中
、
为多项式项数,MenuShow的时间复杂度为
,CreatePoly、PolyVal、DestoryPoly的时间复杂度均为
,PrintPoly的时间复杂度为
,PolyAdd、PolySub的时间复杂度均为
;
改进设想是在CreatePoly内部就对多项式按指数递减顺序排序,这样DestoryPoly、PrintPoly、PolyAdd、PolySub、PolyVal这些依赖于CreatePoly的算法复杂度将降低;
(3)指针如果申请了动态空间,要注意传指针的引用与传指针的值时释放的方法有区别。
4、测试结果
详细的测试结果见附录2
5、用户手册
1、找到“多项式求值.exe”文件,双击
2、根据界面提示输入测试数据
6、附录
附录一:
源程序清单
多项式求值.c
#defineOK0//正确状态
StatusCreatePoly(Polynomial*Poly)
{//建立多项式
EntryNode*p,*q;
inti;
if(!
p)
exit(OVERFLOW);
printf("
请输入多项式的项数:
"
);
scanf("
%g"
&
((*Poly)->
e));
if((*Poly)->
e<
=0)
exit(ERROR);
for(i=0;
i<
(*Poly)->
e;
i++){
q=(EntryNode*)malloc(sizeof(EntryNode));
if(!
q)exit(OVERFLOW);
printf("
请输入第%d项的系数和指数:
i+1);
scanf("
%g%g"
(q->
c),&
p->
next=q;
p=p->
next;
}
p->
next=NULL;
returnOK;
}
StatusDestoryPoly(Polynomial*Poly)
{//销毁多项式
EntryNode*p;
(*Poly))
returnOK;
while(*Poly){//释放第一项,对子式递归
p=(*Poly)->
free(*Poly);
*Poly=p;
DestoryPoly(Poly);
StatusPrintPoly(PolynomialPoly)
{//按指数递减排序并打印多项式
floatr;
inti,j;
Poly)
有%g项"
Poly->
e);
p=Poly->
for(i=1;
Poly->
i++){//冒泡排序
q=p->
for(j=i;
j<
j++){
if(p->
q->
e){
r=p->
c;
p->
c=q->
q->
c=r;
e=q->
e=r;
}
q=q->
}
printf("
<
%g,%g>
p->
c,p->
\n"
StatusPolyAdd(Polynomial*Poly1,PolynomialPoly2)
{//多项式相加,结果储存在第一个多项式中
EntryNode*p,*q,*r;
inti,j,k;
(*Poly1)||!
Poly2)
for(p=Poly2->
next,i=0;
Poly2->
k=(*Poly1)->
for(q=*Poly1,j=0;
k;
r=q->
if(r->
e==p->
e){//指数相同
if((r->
c+p->
c)==0){
q->
next=r->
free(r);
((*Poly1)->
e)--;
break;
}//系数互为相反数则释放该项
r->
c+=p->
//否则进行项归并
break;
q=q->
if(j==k){
r=(EntryNode*)malloc(sizeof(EntryNode));
if(!
r)exit(OVERFLOW);
r->
c=p->
r->
e=p->
q->
next=r;
q=q->
((*Poly1)->
e)++;
p=p->
if((*Poly1)->
e==0)*Poly1=NULL;
StatusPolySub(Polynomial*Poly1,PolynomialPoly2)
{//多项式相减
if(r->
c==p->
c){
}//系数相同则释放该项
c-=p->
break;
}q=q->
r=(EntryNode*)malloc
(sizeof(EntryNode));
c=0-p->
q=q->
((*Poly1)->
}p=p->
e==0)
*Poly1=NULL;
returnOK;
floatPolyVal(PolynomialPoly,floatx)
{//求多项式在x下的值
floatVal=0.0;
EntryNode*p;
for(i=0,p=Poly->
Val+=(p->
c)*pow(x,p->
returnVal;
voidMenuShow(){//功能菜单
********************************\n"
一元稀疏多项式简单计算\n"
1.建立多项式\n"
2.输出多项式\n"
3.多项式相加\n"
4.多项式相减\n"
5.多项式求值\n"
6.退出\n"
**************************\n\n"
intmain(){
PolynomialPoly[10];
intchoice,i,j,n=0;
floatx;
10;
i++)
Poly[i]=NULL;
MenuShow();
请选择正确的操作(1、2、3、4、5、6):
%d"
choice);
while
(1){
switch(choice){
case1:
CreatePoly(&
Poly[n++]);
break;
case2:
请选择要打印的多项式(1到%d号):
n);
i);
该多项式(第%d个)为:
i);
PrintPoly(Poly[i-1]);
case3:
请选择参与相加的两个多项式(1到%d号):
%d%d"
i,&
j);
PolyAdd(&
Poly[i-1],Poly[j-1]);
if(!
Poly[i-1])
相加结果(存储为第%d个多项式)为:
0\n"
else{
}break;
case4:
请选择参与相减的两个多项式
(1到%d号):
scanf("
PolySub(&
相减结果(存储为第%d个)的值
为:
%g\n"
i,PolyVal(Poly[i-1],x));
case6:
for(i=0;
n;
DestoryPoly(&
Poly[i]);
exit(0);
\n请选择正确的操作(1、2、3、4、5、6):
return0;
附录附录二:
测试结果截图
二、算术表达式求值
1、需求分析
算术表达式求值程序的基本功能是:
(1)以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
(2)演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
(3)最终运算数栈存储的算术表达式的值弹出给形参以供输出。
/3
0
(这是数据(128)溢出的情况,该表达式的实际值应为4)
#defineOVERFLOW-2//溢出错误
#defineTrue1//是
#defineFalse0//否
//Status用于
返回函数状态信息
typedefcharElemType;
//元素类型
ElemTypech;
}ChNode,*Stack;
//定义字符
结点和栈头指针
(2)各函数模块的申明
StatusInitStack(Stack*S);
//初始化栈,形参为栈的头指针的地址,返回值为Status类型
StatusStackEmpty(StackS);
//判断栈是否为空,形参为栈的头指针,栈空则返回True,非空则返回False
StatusPush(Stack*S,ElemTypee);
//压栈操作,形参为栈的头指针的地址和压栈元素e,返回值为Status类型
StatusPop(Stack*S,ElemType*e);
//出栈操作,形参为栈的头指针的地址和e的地址,返回值为Status类型
StatusDestoryStack(Stack*S);
//销毁栈,形参为栈的头指针的地址,返回值为Status类型
StatusEvaluateExpression(ElemType*a);
//计算表达式的值,形参a的地址,返回值为Status类型
(3)执行流程
主程序(main函数)流程
EvaluateExpression函数流程
(1)调试中主要问题在于相邻两运算符情况较多,而且二者的优先级又有三种情况,所以经常会因逻辑表述不严密而造成错误,好在对三种优先级的判断比较简明,而且有些过程在一定的优先级前提下会重复出现,于是想到用goto语句来取代while循环以使程序流向更以控制从而减少逻辑描述量并使代码简洁明了;
其中
为表达式字符串的长度。
InitStack、StackEmpty、Push、Pop的时间复杂度为
,DestoryStack的时间复杂度为
EvaluateExpression的时间复杂度为
。
改进设想是对相邻两个操作符的优先级关系进行进一步的优化分析,避免使用goto语句;
(3)写代码之前要对问题的逻辑层次与逻辑关系进行充分的分析,而且先画出算法的流程图,从流程图可以直观地看出程序的循环或其他重复过程以及各种操作,然后根据流程图写代码将会准确快捷而且代码也会较简洁易读。
1、找到“表达式求值.exe”,双击;
2、进入Dos操作界面,输入一个春整数算术表达式,按enter键
3、按任意键退出
表达式求值.c
#include<
stdio.h>
stdlib.h>
#defineTrue1
#defineFalse0
//Status用于
StatusInitStack(Stack*S)
{//初始化栈
*S=(ChNode*)malloc(sizeof(ChNode));
(*S))exit(OVERFLOW);
(*S)->
StatusStackEmpty(StackS)
{//判断栈是否为空
S)exit(ERROR);
if(S->
next)returnFalse;
elsereturnTrue;
StatusPush(Stack*S,ElemTypee){//元素e入栈
ChNode*p;
(*S))exit(ERROR);
p=(ChNode*)malloc(sizeof(ChNode));
p)exit(OVERFLOW);
ch=e;
next=(*S);
(*S)=p;
StatusPop(Stack*S,ElemType*e){//栈顶元素弹出到e
(*S)||StackEmpty(*S))exit(ERROR);
p=(*S)->
*e=p->
ch;
(*S)->
next=p->
free(p);
StatusDestoryStack(Stack*S){//销毁栈
(*S))returnOK;
while(*S){
p=*S;
*S=p->
DestoryStack(S);
StatusEvaluateExpression(ElemType*a)
{//多项式求值
StackOperator,Operand;
ElemTypee,b;
charc;
Operator=Operand=NULL;
InitStack(&
Operator);
Operand);
loop1:
c=getchar();
loop2:
if(c!
='
\n'
){
if(c>
0'
&
c<
9'
*a=0;
while(c>
*a=10*(*a)+c-'
//将连续的数字串转化成对应的整数,
}//直到获取的字符为运算符或‘\n’
Push(&
Operand,*a);
//操作数入栈Operand
gotoloop2;
loop3:
if(StackEmpty(Operator)){//栈空,则运算符入栈Operator
Operator,c);
gotoloop1;
else{
Pop(&
Operator,&
if(e=='
('
||c=='
||((e=='
+'
||e=='
-'
)&
(c=='
*'
||c=='
/'
))){//c优先级不低于e
if(e=='
c=='
)'
)gotoloop1;
//c优先级等于ePush(&
Operator,e);
Push(&
//c优先级高于e
else{//c优先级低于e
Pop(&
Operand,a);
Pop(&
Operand,&
b);
//Operand最顶两元素出栈运算
switch(e){
case'
:
*a=b+(*a);
*a=b-(*a);
*a=b*(*a);
*a=b/(*a);
}
Push(&
//运算结果入栈Operand
gotoloop3;
}//所有运算符都做过是否该入栈的处理了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验 实验一 数据结构 实验