中南大学数据结构课程设计报告Word文档格式.docx

上传人:b****6 文档编号:18796510 上传时间:2023-01-01 格式:DOCX 页数:24 大小:126.29KB
下载 相关 举报
中南大学数据结构课程设计报告Word文档格式.docx_第1页
第1页 / 共24页
中南大学数据结构课程设计报告Word文档格式.docx_第2页
第2页 / 共24页
中南大学数据结构课程设计报告Word文档格式.docx_第3页
第3页 / 共24页
中南大学数据结构课程设计报告Word文档格式.docx_第4页
第4页 / 共24页
中南大学数据结构课程设计报告Word文档格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

中南大学数据结构课程设计报告Word文档格式.docx

《中南大学数据结构课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《中南大学数据结构课程设计报告Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。

中南大学数据结构课程设计报告Word文档格式.docx

能够实现一元多项式相加,并予以存储。

②概要设计

数据结构类型:

#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("

-------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1