中南大学数据结构课程设计报告Word文档格式.docx
《中南大学数据结构课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《中南大学数据结构课程设计报告Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
能够实现一元多项式相加,并予以存储。
②概要设计
数据结构类型:
#defineSTACK_INIT_SIZT100;
#defineSTACKINCREMENT10
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;
}
SqStack;
数据结构类型
typedefstruct
{
intdata[MAX];
inttop;
}
SeqStack;
SeqStack*OPTR,*OPND;
typedefintElemType;
typedefstructCLNode
{
ElemTypecoef;
ElemTypeexp;
structCLNode*next;
}CLNode,*CLinkList
③详细设计
voidmain(){
SqStack_TOPTR;
SqStack_NOPND;
floata,b,i;
chartheta,c,x;
InitStack_T(&
OPTR);
Push_T(&
OPTR,’#’);
InitStack_N(&
OPND);
printf(“请输入表达式关以’#’结尾:
\n”);
c=getchar();
if(c==35||(c>
=40&
&
c<
=43)||c==45||(c>
=47&
=57))
while(c!
=’#’||GetTop_T(&
OPTR)!
=’#’)
if(c>
=48&
=57)
i=(float)c-48;
Push_N(&
OPND,i);
c=getchar();
else
switch(Precede(GetTop_T(&
OPND),c))
{
case’<
’:
OPTR,c);
break;
case’=’:
x=Pop_T(&
case’>
theat=Pop_T(&
b=Pop_N(&
a=Pop_N(&
Push_N(&
OPND,Operate(a,theta,b));
printf(“结果是%f\n”,GetTop_N(&
OPND));
elseprintf(“输入错误!
voidmain()
SeqStack*OPTR,*OPND;
//定义两个栈
intw,op,temp;
inta,b,is_err;
OPTR=Init_SeqStack();
//初始化运算符optr堆栈
OPND=Init_SeqStack();
//初始化运算数opnd堆栈
is_err=Push(OPTR,'
#'
);
//首先将#进运算符栈
system("
cls"
printf("
------------------中缀表达式求值程序------------------\n\n"
-----使用方法:
连续输入表达式,以#号结束,最后按回车键。
\n\n"
-----可使用的运算符包括:
(、)、^、*、/、%、+、-\n\n"
-----注意:
运算数为0-9十个数字。
-----请输入表达式:
"
w=getchar();
while(w!
='
||GetTop(OPTR)!
)//算符栈顶元素不是#(表达式非0,执行语句)
if(Is_OPND(w))//w为数值,返回1,w为算符,返回0
{
Push(OPND,w-'
0'
//数值进opnd堆栈
w=getchar();
//循环
}
else
switch(Precede(GetTop(OPTR),w))//否则,比较optr堆栈中栈顶的算符与getchar()函数读入的算符的优先级
{
case-1:
//栈外算符优先级高,继续入栈
is_err=Push(OPTR,w);
//入栈操作
w=getchar();
break;
case0:
//?
?
is_err=Pop(OPTR,&
temp);
case1:
//栈内算符优先级高
is_err=Pop(OPND,&
b);
//将栈顶的元素赋予后一个变量
a);
op);
is_err=Push(OPND,Execute(a,op,b));
}
-----结果为:
%d\n"
GetTop(OPND));
}
voidAddpoly(PolyNode*pa,PolyNode*pb)
//两个多项式相加
PolyNode*p,*q,*r,*temp;
//temp用来存放临时结点
floatsum;
p=pa->
next;
q=pb->
r=pa;
while(p&
q)
if(p->
exp<
q->
exp)
//p指向的项指数小于q,尾指针指向p,且将p指向链表的下一结点
r=p;
p=p->
elseif(p->
exp==q->
//指数相等时,系数相加
sum=p->
coef+q->
coef;
if(sum!
=0)
p->
coef=sum;
else
//系数相加为0
r->
next=p->
free(p);
p=r->
temp=q;
q=q->
else
//q指向项指数小于p时,将q加入多项式中
temp=q->
q->
next=p;
next=q;
r=q;
q=temp;
if(q)
r->
free(pb);
voidPrint(PolyNode*p)
//打印多项式
{
inti=0;
while(p->
next)
{
i++;
%g*x^%d\n"
p->
coef,p->
exp);
printf("
一共有%d项\n"
i);
}
voidmain()
//主函数
PolyNode*pa,*pb;
inti;
\n**********^-^欢迎光临^-^**********\n"
\n请输入多项式a(按指数递增顺序输入):
\n"
pa=Createpoly();
Print(pa);
\n请输入多项式b(按指数递增顺序输入):
pb=Createpoly();
Print(pb);
\n多项式相加结果是:
Addpoly(pa,pb);
Print(pa);
④调试分析
未实现功能
四:
软件模块结构图
模块1、2:
五:
程序设计思想
看到程序要求,头脑里就有一定的逻辑思路和关系:
先判断括号是否对称,然后再考虑是否有符号连续的情况。
最后看是否运算数位比符号位多1。
算术表达式中有加减乘除,以及乘方和括号等运算关系和法则,又考虑到有运算先后的关系。
故需采用不同的存储结构来存储,所以要用到OPTR和OPND两个栈,分别用来存储运算符合运算数,并且规定‘#’是最低运算级,所以需用‘#’表示表达式结束。
模块3:
第一眼看到要求以及多项式的形式,可以采用顺序存储结构来实现,但是一般应用中多项式的次数过大,难以确定链表的长度,所以此处用链式存储结构来实现。
六:
程序流程图
七:
源程序
#include"
stdio.h"
stdlib.h"
#include<
malloc.h>
#defineOK1
#defineERROR0
#defineOVERFLOW0
#defineMAX100
char*base;
char*top;
intstacksize;
}SqStack_T;
float*base;
float*top;
}SqStack_N;
voidInitStack_T(SqStack_T*S){
(*S).base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
(*S).base)exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
voidInitStack_N(SqStack_N*S){
(*S).base=(float*)malloc(STACK_INIT_SIZE*sizeof(float));
charGetTop_T(SqStack_T*S){
chare;
if((*S).top==(*S).base)returnERROR;
e=*((*S).top-1);
returne;
floatGetTop_N(SqStack_N*S){
floate;
charPush_T(SqStack_T*S,chare){
if((*S).top-(*S).base>
=(*S).stacksize){
(*S).base=(char
*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(char));
if(!
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
*((*S).top)++=e;
returnOK;
floatPush_N(SqStack_N*S,floate){
(*S).base=(float
*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(float));
charPop_T(SqStack_T*S){
e=*(--(*S).top);
floatPop_N(SqStack_N*S){
charm[7]="
+-*/()#"
;
charn[7][7]={"
>
<
"
="
>
="
};
charPrecede(chara,charb){
inti=0,j=0;
while(m[i]!
=a)
i++;
while(m[j]!
=b)
j++;
return(n[i][j]);
floatOperate(floata,chartheta,floatb){
floatr;
switch(theta){
case'
+'
:
r=a+b;
-'
r=a-b;
*'
r=a*b;
/'
if(b!
=0)r=a/b;
elseprintf("
输入错误!
break;
returnr;
SqStack_TOPTR;
SqStack_NOPND;
floata,b,i;
InitStack_T(&
OPTR,'
InitStack_N(&
请输入表达式并以'
结尾:
if(c==35||(c>
while(c!
||GetTop_T(&
)
if(c>
i=(float)c-48;
Push_N(&
c=getchar();
}
else
switch(Precede(GetTop_T(&
OPTR),c))
{
case'
'
theta=Pop_T(&
}
}printf("
结果是%f\n"
GetTop_N(&
elseprintf("
typedefstruct
intdata[MAX];
inttop;
}SeqStack;
SeqStack*Init_SeqStack()//初始化堆栈
{
SeqStack*s;
s=newSeqStack;
//申请栈空间
if(!
s)
printf("
空间不足,初始化失败!
returnNULL;
//未申请到足够大的存储空间,返回空指针
s->
top=-1;
//初始化栈顶指针
堆栈初始化成功!
\n按回车键继续..."
returns;
//申请到栈空间,返回栈空间地址
intEmpty(SeqStack*s){//判空栈
if(s->
top==-1)
return1;
//栈顶指针指向栈底,空栈
return0;
intPush(SeqStack*s,intx){//进栈
top==MAX-1)
//栈满不能入栈,返回错误代码0
{s->
top++;
//栈顶指针向上移动
data[s->
top]=x;
//将x至入新的栈顶
//入栈成功,返回成功代码1
intPop(SeqStack*s,int*x){//出栈
if(Empty(s))
//栈空不能出栈,返回错误代码0
{*x=s->
top];
//保存栈顶元素值
top--;
//栈顶指针向下移动
//返回成功代码1
intGetTop(SeqStack*s)//取栈顶元素
return(s->
top]);
intIs_OPND(charx)//判断运算符和运算数
inttemp;
temp=1;
switch(x)
case'
^'
%'
('
)'
temp=0;
return(temp);
intPrecede(charin,charout)
intc_temp1,c_temp2;
switch(in)
c_temp1=5;
c_temp1=4;
c_temp1=2;
c_temp1=0;
c_temp1=6;
c_temp1=-1;
switch(out)
c_temp2=5;
c_temp2=3;
c_temp2=1;
c_temp2=6;
c_temp2=0;
c_temp2=-1;
if(c_temp1<
c_temp2)temp=-1;
//栈外算符优先级高,入栈
if(c_temp1==c_temp2)temp=0;
if(c_temp1>
c_temp2)temp=1;
//栈内算符优先级高,运算
intExecute(inta,charop,intb){
ints;
switch(op)
s=(int)pow(a,b);
s=a*b;
s=a/b;
s=a%b;
s=a+b;
s=a-b;
}return(s);
voidmain()
SeqStack*OPTR,*OPND;
intc,theta,temp;
inta,b,is_err;
OPTR=Init_SeqStack();
OPND=Init_SeqStack();
is_err=Push(OPTR,'
system("
-------------