数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
目录
1.查找子系统2
1.1内容及要求2
1.2程序分析及算法描述2
1.3结构图及流程图3
1.4源代码:
5
1.5结果分析:
6
2.迷宫求解问题7
2.1题目分析7
2.2.流程图:
7
3、源代码9
4.运行结果:
13
心得体会15
参考文献16
1.查找子系统
1.1内容及要求
1.设计一个选择式菜单。
查找子系统
******************************************************
*1……折半查找*
*2……哈希查找*
*0……返回*
******************************************************
请选择菜单号(0…2):
2.分别实现折半查找和哈希查找。
3.哈希函数采用除留余数法,解决冲突的方法任选。
1.2程序分析及算法描述
1.折半查找实现过程
折半查找是对有序表的查找,确定查找记录的区间,通过比较中间值,逐步减半区间,直到找到或找不到该记录为止。
while(low<=high)
{
mid=(low+high)/2;
if(keyhigh=mid-1;
elseif(key>data[mid])
low=mid+1;
elseif(key==data[mid])
{
printf("\ndata[%d]=%d\n\n",mid,key);
break;
}
}
if(low>high)printf("\n没找到\n\n");
}
2.构造哈希表算法实现过程
for(i=0;i{
j=data[i]%p;
while(hash[j])
{
j++;
j=j%p;
}
hash[j]=data[i];
}
3.哈希查找的算法实现
哈希查找,确定步长,采用除留余数法构造哈希表,给定Key,有哈希函数求的哈希地址,若此位置没记录则查找不成功,否则比较关键字,若与给定值相等,成功,否则找下一位置,直到相等或为空结束。
j=key%p;
while(hash[j]&&hash[j]!
=key)
{
j++;
j=j%p;
}
if(hash[j])
printf("\nhash[%d]=%d\n\n",j,key);
else{
printf("\n没找到\n\n");
hash[j]=key;
}
1.3结构图及流程图
折半查找:
在下面的有序表中查找关键字i的数据元素;
假设指针low和hight分别指示待查元素所在范围的上届和下届,指针mid指示区间的中间位置:
0513346342873221049202
Lowmidhigh
1.4源代码:
#include
#include
#include
#defineN100
intmax,key,data[N];
voidSelect(void);
voidSearchBinary(intdata[],intkey){
intlow=0;
inthigh=max-1;
intmid;
while(low<=high){
mid=(low+high)/2;
if(keyhigh=mid-1;
elseif(key>data[mid])
low=mid+1;
elseif(key==data[mid]){
printf("\ndata[%d]=%d\n\n",mid,key);
break;
}
}
if(low>high)
printf("\n没找到\n\n");
Select();
}
voidSearchHash(intdata[],intkey){
inti,j,hash[N+4]={0},p=max+4;
for(i=0;ij=data[i]%p;
while(hash[j]){
j++;
j=j%p;
}
hash[j]=data[i];
}
j=key%p;
while(hash[j]&&hash[j]!
=key){
j++;
j=j%p;
}
if(hash[j])
printf("\nhash[%d]=%d\n\n",j,key);
else{
printf("\n没找到\n\n");
hash[j]=key;
}
Select();
}
voidInitData(){
printf("要查找的数据:
");
scanf("%d",&key);
Select();
}
voidSelect(void){
inta;
printf("选择执行方式:
");
scanf("%d",&a);
switch(a){
case1:
SearchBinary(data,key);break;
case2:
SearchHash(data,key);break;
case0:
InitData();break;
}
}
main(){
inti;
printf("1折半查找\n2哈希查找\n0返回\n");
printf("输入数据个数:
");
scanf("%d",&max);
printf("输入数列:
");
for(i=0;iscanf("%d",&data[i]);
Select();
}
1.5结果分析:
2.迷宫求解问题
2.1题目分析
本题是迷宫求解问题,由0和1构成的m*n维矩阵表示一个迷宫。
0为路,1为墙。
在入口处的上下左右进行查找,找到0后表示通路,在此0处继续查找。
直至找到一条到出口的路,即表示迷宫已解出。
显示坐标表示迷宫路径。
本题用到的是数据结构是栈
2.2.流程图:
01
否
是
是
否
整体流程图
是
否
是
否
是
否
主程序流程图
3、源代码
#include
#include
#include
#defineMA100
#defineM15
#defineN15
typedefstruct
{
intx;
inty;
intd;//该点下一个可能方向上的点,1表示向右,2向下,3向左,4向上
}Data;
typedefstruct
{
intpos;
Datadata[MA];
}Node,*Stack;
/*************栈函数****************/
StackInitStack()/*初始化*/
{
Stackps;
ps=(Stack)malloc(sizeof(Node));
if(!
ps)
exit(-1);
ps->pos=-1;
returnps;
}
intempty(Stackstack)/*判断栈空*/
{
if(stack->pos==-1)
return1;
else
return0;
}
voidPush(Stackps,Datax)/*入栈*/
{
if(ps->pos>=MA-1)
exit(-1);
else
{
ps->pos++;
ps->data[ps->pos]=x;
}
}
voidPop(Stackps)/*出栈*/
{
if(ps->pos==-1)
exit(-1);
else
ps->pos--;
}
DataGetTop(Stackps)/*取栈顶元素*/
{
returnps->data[ps->pos];
}
DataSet(intx,inty,intd)
{
Dataelement;
element.x=x;
element.y=y;
element.d=d;
returnelement;
}
voidDisplay(Stackps)/*显示路径*/
{
inti=0,j,k,a[N],b[N];
Dataelement;
printf("路径通过的点的横,纵坐标为:
\n");
while(!
empty(ps))
{
element=GetTop(ps);
Pop(ps);
a[i]=element.x;
b[i]=element.y;
i++;
}
j=i-1;
for(k=j;k>=0;k--)
printf("路径坐标为:
%d%d\n",a[k],b[k]);
}
voidMazePath(intmaze[][N],intdirection[][2],intx1,inty1,intx2,inty2)
{
inti,j,k,g,h;
Stackps;
Dataelement;
ps=InitStack();
maze[x1][y1]=2;//标记入口点
Push(ps,Set(x1,y1,0));
while(!
empty(ps))//栈不为空
{
element=GetTop(ps);
Pop(ps);
i=element.x;
j=element.y;
k=element.d;
while(k<=3)//试探各个方向
{
g=i+direction[k][0];
h=j+direction[k][1];
if(g==x2&&h==y2&&maze[g][h]==0)//找到非出口点
{
Push(ps,Set(i,j,k));
Push(ps,Set(x2,y2,k));
Display(ps);
return;
}
if(maze[g][h]==0)//找到可以前进的非出口的点
{
maze[g][h]=2;//标记走过的点
Push(ps,Set(i,j,k+1));
i=g;
j=h;
k=0;
}
else
k++;
}
}
printf("迷宫无解!
\n\n\n");
}
/*************建立迷宫*******************/
voidinitmaze(intmaze[M][N])
{
inti,j;
intm,n;//迷宫行,列
printf("请输入迷宫的行数列数[例:
3.3]\n");
scanf("%d.%d",&m,&n);
printf("\n请输入迷宫的各行各列:
\n用空格隔开,0代表路,1代表墙\n",m,n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&maze[i][j]);
printf("迷宫为:
\n");
for(i=0;i<=m+1;i++)//加一圈围墙
{
maze[i][0]=1;
maze[i][n+1]=1;
}
for(j=0;j<=n+1;j++)
{
maze[0][j]=1;
maze[m+1][j]=1;
}
for(i=0;i<=m+1;i++)//输出迷宫
{
for(j=0;j<=n+1;j++)
printf("%d",maze[i][j]);
printf("\n");
}
}
main()
{
intmaze[M][N],x1,x2,y1,y2;
intk;
intdirection[][2]={0,1,1,0,0,-1,-1,0};//存放下一个点相对于该点可能的方向
while
(1)
{
printf("┌───────┐\n");
printf("│1.进行迷宫求解│\n");
printf("├───────┤\n");
printf("│0.退出│\n");
printf("└───────┘\n");
printf("请输入代码:
");
scanf("%d",&k);
switch(k)
{
case1:
initmaze(maze);
printf("输入出入口的横坐标纵坐标[例:
11.33]\n");
scanf("%d%d.%d%d",&x1,&y1,&x2,&y2);
MazePath(maze,direction,x1,y1,x2,y2);
break;
case0:
exit(-1);break;
default:
printf("error!
\n\n\n");
}
}
}
4.运行结果:
心得体会
短短几天的数据结构课程设计很快结束了,通过此次的训练我了解到一些简单的应用程序的编译方法,丰富了编程知识及常识,了解到了基础知识的重要性,以前认为的C语言都只是用来编写很小的程序的,这两个题目分别代表了查找和线性性结构这俩大类结构,在编程实现的过程中通过查找资料,学习,写代码这么些过程使得这一学期以来数据结构的学习有了质的提升,将理论转化为实践,并在实践过程中发现了问题,不仅有数据结构方面的,还有C语言方面的,在解决这些问题的同时对所学知识有了更深的理解,以前在理论学习中费解的一些问题也得到了解决。
能够利用函数等模块化思想,提高程序的可读性,也避免了由于程序过于复杂.语句较多而产生错误。
以主函数调用其他的函数,很方便,不容易出错。
所以我们须要课程实习,需要工程训练,这样才能成为真正的二十一世纪合格的大学生!
参考文献
[1]谭浩强,C程序设计(第三版),清华大学出版社,2005
[2]S巴斯,计算机算法:
设计和分析理论,复旦大学出版社,2005
[3]杨路明,C语言程序设计教程,北京邮电大学出版社,2010
[4]吴伟民,数据结构(C语言版),清华大学出版社,2006