数据结构课设1.docx
《数据结构课设1.docx》由会员分享,可在线阅读,更多相关《数据结构课设1.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构课设1
课程设计的目录有:
一、课程设计目的
二、课程设计内容
1、课程设计的题目及简介
2、设计说明
3、程序流图
4、程序清单(主要算法)
三、测试数据:
四、课程设计总结(写出心得和总结)
五、参考文献
一、课程设计的目的:
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
2、校园导游咨询
1.任务:
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
2.基本要求:
设计学校的校园平面图,所含景点不小于10个。
以图中个顶点表示校园各个景点,存放景点名称,带好,简介等信息;边表示路径,存放路径长度等相关信息。
为来访客人提供图中任意景点相关信息的查询。
为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
实现提示:
一般情况下,校园的道路是双向通行的,可设校园平面是一个无向网。
顶点和边均含有相关信息。
3.设计思路:
用图的结点代表景点,用图的边代表景点之间的路径。
首先设计一个图类。
结点值代表景点信息,边的权值代表景点间的距离。
结点值及边的权值用顺序表存储,所以需要设计一个顺序表类。
本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。
计算路径长度和最短路线时可用Dijkastra算法实现。
最后用switch选择语句选择执行浏览景点信息或查询最短路径。
4.程序流程
校内景点平面图
5.程序清单
#include"string.h"
#include"stdio.h"
#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#defineMax20000
#defineNUM9
typedefstructArcCell{
intadj;/*相邻接的景点之间的路程*/
}ArcCell;/*定义边的类型*/
typedefstructVertexType{
intnumber;/*景点编号*/
char*sight;/*景点名称*/
char*description;/*景点描述*/
}VertexType;/*定义顶点的类型*/
typedefstruct{
VertexTypevex[NUM];/*图中的顶点,即为景点*/
ArcCellarcs[NUM][NUM];/*图中的边,即为景点间的距离*/
intvexnum,arcnum;/*顶点数,边数*/
}MGraph;/*定义图的类型*/
MGraphG;/*把图定义为全局变量*/
intP[NUM][NUM];/**/
longintD[NUM];/*辅助变量存储最短路径长度*/
intx[9]={0};
voidCreateUDN(intv,inta);/*造图函数*/
voidnarrate();/*说明函数*/
voidShortestPath(intnum);/*最短路径函数*/
voidoutput(intsight1,intsight2);/*输出函数*/
charMenu();/*主菜单*/
voidsearch();/*查询景点信息*/
charSearchMenu();/*查询子菜单*/
voidHaMiTonian(int);/*哈密尔顿图的遍历*/
voidNextValue(int);
voiddisplay();/*显示遍历结果*/
voidmain()/*主函数*/
{
intv0,v1;
charck;
system("colorfc");
CreateUDN(NUM,11);
do
{
ck=Menu();
switch(ck)
{
case'1':
system("cls");
narrate();
printf("\n\n\t\t\t请选择起点景点(0~8):
");
scanf("%d",&v0);
printf("\t\t\t请选择终点景点(0~8):
");
scanf("%d",&v1);
ShortestPath(v0);/*计算两个景点之间的最短路径*/
output(v0,v1);/*输出结果*/
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;
case'2':
search();
break;
case'3':
system("cls");
narrate();
x[0]=1;
HaMiTonian
(1);
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;
};
}while(ck!
='e');
}
charMenu()/*主菜单*/
{
charc;
intflag;
do{
flag=1;
system("cls");
narrate();
printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┃1、查询景点路径┃\n");
printf("\t\t\t┃2、查询景点信息┃\n");
printf("\t\t\t┃3、推荐参观路线┃\n");
printf("\t\t\t┃e、退出┃\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:
");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='3'||c=='e')
flag=0;
}while(flag);
returnc;
}
charSearchMenu()/*查询子菜单*/
{
charc;
intflag;
do{
flag=1;
system("cls");
narrate();
printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┃1、按照景点编号查询┃\n");
printf("\t\t\t┃2、按照景点名称查询┃\n");
printf("\t\t\t┃e、返回┃\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:
");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
returnc;
}
voidsearch()/*查询景点信息*/
{
intnum;
inti;
charc;
charname[20];
do
{
system("cls");
c=SearchMenu();
switch(c)
{
case'1':
system("cls");
narrate();
printf("\n\n\t\t请输入您要查找的景点编号:
");
scanf("%d",&num);
for(i=0;i{
if(num==G.vex[i].number)
{
printf("\n\n\t\t\t您要查找景点信息如下:
");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t没有找到!
");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case'2':
system("cls");
narrate();
printf("\n\n\t\t请输入您要查找的景点名称:
");
scanf("%s",name);
for(i=0;i{
if(!
strcmp(name,G.vex[i].sight))
{
printf("\n\n\t\t\t您要查找景点信息如下:
");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t没有找到!
");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}while(c!
='e');
}
voidCreateUDN(intv,inta)/*造图函数*/
{
inti,j;
G.vexnum=v;/*初始化结构中的景点数和边数*/
G.arcnum=a;
for(i=0;i/*初始化没一个景点名及其景点描述*/
G.vex[0].sight="体育馆";
G.vex[0].description="锻炼场所,举办各种运动活动";
G.vex[1].sight="第三食堂";
G.vex[1].description="师生用餐场所";
G.vex[2].sight="三教";
G.vex[2].description="学生上课场所老师办公场所";
G.vex[3].sight="十二舍";
G.vex[3].description="男生住宿之地。
";
G.vex[4].sight="十一舍";
G.vex[4].description="女生住宿之地";
G.vex[5].sight="石头楼礼堂";
G.vex[5].description="举办大型会议和演出的地方";
G.vex[6].sight="东阶教学楼";
G.vex[6].description="学生上课自习的地方";
G.vex[7].sight="图书馆";
G.vex[7].description="借阅图书";
G.vex[8].sight="机房楼";
G.vex[8].description="学生上机的地方";
/*这里把所有的边假定为20000,含义是这两个景点之间是不可到达*/
for(i=0;ifor(j=0;jG.arcs[i][j].adj=Max;/*下边是可直接到达的景点间的距离,由于两个景点间距离是互相的,所以要对图中对称的边同时赋值。
*/
G.arcs[0][2].adj=G.arcs[2][0].adj=50;
G.arcs[0][6].adj=G.arcs[6][0].adj=100;
G.arcs[1][2].adj=G.arcs[2][1].adj=50;
G.arcs[1][3].adj=G.arcs[3][1].adj=50;
G.arcs[1][4].adj=G.arcs[4][1].adj=100;
G.arcs[2][3].adj=G.arcs[3][2].adj=50;
G.arcs[3][4].adj=G.arcs[4][3].adj=50;
G.arcs[5][6].adj=G.arcs[6][5].adj=100;
G.arcs[5][7].adj=G.arcs[7][5].adj=50;
G.arcs[5][8].adj=G.arcs[8][5].adj=50;
G.arcs[6][7].adj=G.arcs[7][6].adj=50;
G.arcs[7][8].adj=G.arcs[8][7].adj=20;
}
voidnarrate()/*说明函数*/
{
inti,k=0;
printf("\n\t\t*****************欢迎使用校园导游程序***************\n");
printf("\n\t\t********************东北电力大学********************\n");
printf("\t__________________________________________________________________\n");
printf("\t\t景点名称\t\t|\t景点描述\n");
printf("\t________________________________|_________________________________\n");
for(i=0;i{
printf("\t%c(%2d)%-10s\t\t|\t%-25s%c\n",3,i,G.vex[i].sight,G.vex[i].description,3);/*输出景点列表*/
k=k+1;
}
printf("\t________________________________|_________________________________\n");
}
voidShortestPath(intnum)/*狄克斯特拉算法最短路径函数num为入口点的编号*/
{
intv,w,i,t;/*i、w和v为计数变量*/
intfinal[NUM];/**/
intmin;
for(v=0;v{
final[v]=0;/*假设从顶点num到顶点v没有最短路径*/
D[v]=G.arcs[num][v].adj;/*将与之相关的权值放入D中存放*/
for(w=0;wP[v][w]=0;
if(D[v]<20000)/*存在路径*/
{
P[v][num]=1;/*存在标志置为一*/
P[v][v]=1;/*自身到自身*/
}
}
D[num]=0;
final[num]=1;/*初始化num顶点属于S集合*/
/*开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合*/
for(i=0;i{
min=Max;/*当前所知离顶点num的最近距离*/
for(w=0;wif(!
final[w])/*w顶点在v-s中*/
if(D[w]{
v=w;
min=D[w];
}
final[v]=1;/*离num顶点更近的v加入到s集合*/
for(w=0;wif(!
final[w]&&((min+G.arcs[v][w].adj){
D[w]=min+G.arcs[v][w].adj;
for(t=0;tP[w][t]=P[v][t];
P[w][w]=1;
}
}
}
voidoutput(intsight1,intsight2)/*输出函数*/
{
inta,b,c,d,q=0;
a=sight2;/*将景点二赋值给a*/
if(a!
=sight1)/*如果景点二不和景点一输入重合,则进行...*/
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);/*输出提示信息*/
printf("\t(最短距离为%dm.)\n\n\t",D[a]);/*输出sight1到sight2的最短路径长度,存放在D[]数组中*/
printf("\t%s",G.vex[sight1].sight);/*输出景点一的名称*/
d=sight1;/*将景点一的编号赋值给d*/
for(c=0;c{
gate:
;/*标号,可以作为goto语句跳转的位置*/
P[a][sight1]=0;
for(b=0;b{
if(G.arcs[d][b].adj<20000&&P[a][b])/*如果景点一和它的一个临界点之间存在路径且最短路径*/
{
printf("-->%s",G.vex[b].sight);/*输出此节点的名称*/
q=q+1;/*计数变量加一,满8控制输出时的换行*/
P[a][b]=0;
d=b;/*将b作为出发点进行下一次循环输出,如此反复*/
if(q%8==0)printf("\n");
gotogate;
}
}
}
}
}
voidHaMiTonian(intm)/*哈密尔顿图的遍历*/
{
if(m>8)return;
L:
NextValue(m);
if(x[m]==0)
return;
if(m==7&&G.arcs[0][x[8]-1].adj!
=20000)
display();
else
HaMiTonian(m+1);
gotoL;
}
voidNextValue(intk)
{
intj;
l:
x[k]=(x[k]+1)%10;
if(x[k]==0)
return;
if(G.arcs[x[k-1]-1][x[k]-1].adj!
=20000)
{
for(j=0;jif(x[j]==x[k])
gotol;
return;
}
else
gotol;
}
voiddisplay()
{
inti=0;
printf("\n\n\t");
for(i=0;i<8;i++)
printf("%s->",G.vex[x[i]-1].sight);
printf("出口");
printf("\n");
}
三、测试数据:
导游咨询
初始界面
景点路径
景点信息
推荐路线
四、课程设计总结:
通过使用C++语言设计程序代码,我们更能体会到C++语言较C语言在编程设计程序代码方面的优越性。
在编制过程中,将实际选取的景点抽象成一个带权的无向平面图并且使用了结构体类型,宏定义,全局变量,自定义函数及switch语句等内容。
经过多次测试,我们得到了一个完善的程序,通过用所学的知识去解决某个实际问题,我们更加认识到了团队合作的重要性,也深深的体会到了实践与理论想结合的重要性,这次程序设计极大的提高了我对编程的兴趣,培养了分析和解决问题的能力。
为以后走上工作岗位积累下宝贵的经验。
五、参考文献:
《C程序设计》(第二版)潭浩强著清华大学出版社出版
《C++程序设计》潭浩强著清华大学出版社出版
《数据结构》(C语言版)严蔚敏、吴伟民著清华大学出版社出版