数据结构课程设计.docx

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

数据结构课程设计.docx

《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构课程设计.docx

数据结构课程设计

课题名称

一.计算器模拟

问题描述

对包含加、减、乘、除、括号运算符的任意整型表达式进行求解

设计思路

这个程序的关键点是利用栈结构将输入的中缀表达式转化成后缀表达式,同时计算后缀表达式结果并输出,在这一过程中需要将连续的几个操作数化成一个操作数并入栈

数据结构定义

#defineMAXSIZE100

typedefstructnode/*顺序栈*/

{

intdata[MAXSIZE];

inttop;

}SeqStack,*PSeqStack;

功能函数设计

1.判断是否为操作数IsNum(charc)

在入栈前判断字符是否为操作数

2.定义每个算术符的优先级priority(charop)

定义运算符的优先级

3.中缀转后缀infix_exp_value(char*infixexp,char*postfixexp)

将用户输入的中缀表达式转化成后缀表达式,以方便后续的计算,其中利用

4.计算后缀postfix_exp(char*A)

5.主函数main()

编码实现

intIsNum(charc)//判断是否为操作数

{

if(c>='0'&&c<='9')

return

(1);

else

return(0);

}

intpriority(charop)//定义每个算术符的优先级

{

switch(op)

{

case'#':

return

(1);

case')':

return

(2);

case'+':

case'-':

return(3);

case'*':

case'/':

return(4);

case'(':

return(5);

default:

return(0);

}

}

intinfix_exp_value(char*infixexp,char*postfixexp)//中缀转后缀

{

PSeqStackS;

charc,w,topelement;

intf=1;

S=Init_SeqStack();

if(!

S)

{

printf("栈初始化失败\n");

return(0);

}

Push_SeqStack(S,'#');

w=*infixexp;

while((GetTop_SeqStack(S,&c),c)!

='#'||w!

='#')

{

if(IsNum(w))

{

if(f==0)

{

*postfixexp=w;

postfixexp++;

w=*(++infixexp);

}

else

{

*postfixexp='a';

postfixexp++;

*postfixexp=w;

postfixexp++;

w=*(++infixexp);

f=0;

}

}

else

{

f=1;

if((GetTop_SeqStack(S,&c),c)=='('&&w==')')

{

Pop_SeqStack(S,&topelement);

w=*(++infixexp);

}

else

if((GetTop_SeqStack(S,&c),c)=='('||priority((GetTop_SeqStack(S,&c),c))

{

Push_SeqStack(S,w);

w=*(++infixexp);

}

else

{

Pop_SeqStack(S,&topelement);

*postfixexp=topelement;

postfixexp++;

}

}

}

*postfixexp='#';

*(++postfixexp)='\0';/*添加字符串结束符号*/

Destroy_SeqStack(&S);/*销毁栈*/

return

(1);

}

doublepostfix_exp(char*A)//计算后缀

{

PSeqStackS;

intResult,a,b,c,d,f;

charch;

f=1;

ch=*A++;

S=Init_SeqStack();

while(ch!

='#')

{

if(IsNum(ch))

if(f==0)

{

Pop_SeqStack(S,&d);

d=d*10;

d=d+ch-'0';

Push_SeqStack(S,d);

}

else

{

Push_SeqStack(S,ch-'0');

f=0;

}

else

{

f=1;

if(ch!

='a')

{

Pop_SeqStack(S,&b);

Pop_SeqStack(S,&a);

switch(ch)

{

case'+':

c=a+b;/*printf("%d\n",c);*/break;

case'-':

c=a-b;break;

case'/':

c=a/b;break;

case'*':

c=a*b;break;

case'%':

c=(int)a%(int)b;break;

}

Push_SeqStack(S,c);

}

}

ch=*A++;

}

GetTop_SeqStack(S,&Result);

Destroy_SeqStack(&S);

returnResult;

}

voidHY()

{

printf("****************************************\n");

printf("**\n");

printf("**\n");

printf("*欢迎使用计算器模拟器*\n");

printf("**\n");

printf("**\n");

printf("****************************************\n");

}

intmain()//main函数

{

charin[100],post[100],a;

ints;

while

(1)

{

HY();

printf("请输入表达式并以#为结束字符\n");

scanf("%s",in);

infix_exp_value(in,post);

s=postfix_exp(post);

printf("计算结果为%d\n",s);

printf("继续计算y/n\n");

getchar();

scanf("%c",&a);

printf("%c\n",a);

if(a=='n')

break;

system("cls");

}

}

运行与测试

1加

2减

3乘

4除

5综合

二.学生成绩查询系统

问题描述

试编写程序完成学生成绩记录的查询。

学号

姓名

成绩

99070101

李军

98.6

99070102

王颜霞

86

99070103

孙涛

56

99070104

单晓宏

96

99070105

张华

83

99070106

李小明

72

99070107

陈晓婷

98

若按学号进行顺序查找,例如:

输入99070101,则输出98.6;

按学号排序后进行折半查找;

随机输入以学号为关键字的学生信息并建构二叉排序树,对学号进行二叉排序树查找。

程序框架

 

 

设计思路

学生信息包括学号、姓名、分数,所以新建一个结构体Student

顺序查找只需建一个结构体数组,以学号为关键字进行查找;

折半查找要保证数组是按学号进行排序过的,然后在数据中间进行查找,若目标学号小于中间值,则对前半部分重复上述操作,反之,则对后半部分进行重复操作;

二叉树查找,需在文件中插入标志数据,然后将文件中的数据输入二叉树中,标志数据处,输入空值,然后对二叉树进行先序遍历查找。

编码实现

#include"stdio.h"

#include"stdlib.h"

#include"math.h"

#defineMaxSize30

into=0;

intu=0;

intsign=-1;

intsign_tree;

typedefstructnode{

intnum;

charname[MaxSize];

floatscore;

}Student;

typedefstructbnode{

Studentdata;

structbnode*Lchild,*Rchild;

}Bnode,*BTree;

typedefstructsnode{

BTreepor[MaxSize];

inttop;

}SeqStack,*PSeqStack;

intInput(Studentc[])//从文件导入

{

inti=0;

FILE*fp;

fp=fopen("XX.txt","r");

while(c[i-1].num!

=0)

{

fscanf(fp,"%d%s%f",&c[i].num,c[i].name,&c[i].score);

i++;

}

returni;

}

intInput_tree(Studentc[])//从文件导入

{

inti=0;

FILE*fp;

fp=fopen("ll.txt","r");

while(c[i-1].num!

=0)

{

fscanf(fp,"%d%s%f",&c[i].num,c[i].name,&c[i].score);

i++;

}

returni;

}

voidSeq_search(Studentc[],intlength,intgoal)//按学号进行顺序查找

{

inti;

for(i=0;i

{

if(c[i].num==goal)

{

printf("顺序查找结果为:

%d%s%.2f\n",c[i].num,c[i].name,c[i].score);

break;

}

}

o=i+1;

if(i=length&&c[i].num!

=goal)

printf("查无结果!

\n");

}

voidPaixu_num(Studentc[],intlength)

{

inti,j;

Studentp;

for(i=0;i

for(j=0;j

{

if(c[j].num>c[j+1].num)

{

p=c[j];

c[j]=c[j+1];

c[j+1]=p;

}

}

}

voidHalf_search(Studentc[],intlow,inthigh,intgoal)//按学号进行折半查找

{

o++;

if((goalc[high].num)&&o==1)

printf("查无结果!

\n");

else

{

intmid=(low+high)/2;

if(goal

Half_search(c,low,mid-1,goal);

elseif(goal>c[mid].num)

Half_search(c,mid+1,high,goal);

else

printf("折半查找结果为:

%d%s%.2f\n",c[mid].num,c[mid].name,c[mid].score);

}

}

PSeqStackInit_SeqStack(void)

{

PSeqStackS;

S=(PSeqStack)malloc(sizeof(SeqStack));

if(S)

S->top=-1;

returnS;

}

intEmpty_SeqStack(PSeqStackS)

{

if(S->top==-1)

return1;

else

return0;

}

voidPush_SeqStack(PSeqStackS,BTreex)

{

if(S->top==MaxSize-1)

printf("栈满不能进栈!

\n");

else

{

S->top++;

S->por[S->top]=x;

}

}

voidPop_SeqStack(PSeqStackS,BTree*x)

{

if(Empty_SeqStack(S))

printf("栈空不能出栈!

");

else

{

*x=S->por[S->top];

S->top--;

}

}

 

Student*Data;

StudentTianjia(inti)

{

Studentt;

t=Data[i];

returnt;

}

BTreeCreat_Tree()

{

BTreet;

Studentd;

d=Tianjia(++sign);

if(d.num==1)

t=NULL;

else

{

t=(Bnode*)malloc(sizeof(Bnode));

t->data=d;

t->Lchild=Creat_Tree();

t->Rchild=Creat_Tree();

}

returnt;

}

voidSearch_SeqStack(BTreet,intgoal)

{

PSeqStackS;

BTreep=t;

S=Init_SeqStack();

while(p||!

Empty_SeqStack(S))

{

o++;

if(p)

{

if(p->data.num==goal)

{

printf("二叉树查找结果为:

%d%s%.2f\n",p->data.num,p->data.name,p->data.score);

sign_tree=1;

break;

}

Push_SeqStack(S,p);

p=p->Lchild;

}

else

{

Pop_SeqStack(S,&p);

p=p->Rchild;

}

}

if(sign_tree==0)

printf("查无结果!

\n");

}

voidmain()

{

intlength,goal,length_tree;

Studentc[MaxSize];

Studentg[MaxSize];

BTreet;

length=Input(c)-1;

length_tree=Input_tree(g)-1;

Data=g;

t=Creat_Tree();

while(goal!

=0)

{

printf("请输入要查找目标的学号:

");

scanf("%d",&goal);

Seq_search(c,length,goal);

printf("顺序查找次数为:

%d\n",o);

o=0;

printf("\n");

Paixu_num(c,length);

Half_search(c,0,length,goal);

printf("折半查找次数为:

%d\n",o);

o=0;

printf("\n");

Search_SeqStack(t,goal);

printf("二叉树查找次数为:

%d\n",o);

printf("\n");

}

}

运行与测试

输入目标学号,程序分别进行三种形式的查询,并输出查询目标的学号、姓名、成绩等信息,当目标学号为0时,查询结束。

 

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

当前位置:首页 > 经管营销 > 金融投资

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

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