数据结构大作业

数据结构大作业

题目: xxxx 校园导航介绍程序

姓名: 文中的xxx 可以换成自己的学校名称,然后再根据学校具体情况扩充一下。

学号:

班级:

时间:

学院:

实际问题阐述:

1:今年暑假留校时,我发现我们学校暑假有好多其他地方的高中生,初中生,小学生„„来我们学校参观,这应该算是高校旅游,景点开发.

2:同时也注意到,周末时也有一些人来参观。当然,各种讲座,各种辅导班,如考研班等,各种校外人来学校时,问路也是一种问题。

3:最重要的是,每年新生来报到时,一下子来学校,他们人生地不熟,虽然有很多同学充当志愿者,但是大量的人流,显然工作量是有限.

„„„„

考虑到这些实际问题,渐渐地发现,其实可以做一个xxx 的校园介绍程序,当然不能仅仅局限于地图的功能,可以加入相应的文本和图片介绍相应的建筑,介绍一下学校的历史等,考虑到程序的实用性和方便性,制作成手机程序,可以安装在手机上,这样可以提高其方便性,用java 编程,但是现在考虑知识水平有限,现在只能用c 或c++编程相应的初步程序,其实这部分主要用到数据结构的图的知识。

考虑到现在课程对图的知识讲解刚刚开始,而且图论的算法有点难,但是感觉具有实用价值,自己还是先大体构造个框架,自己学习一下相应的知识,从编程中学习!

抽象问题分析:

首先要用无向网表示xxxx 校园建筑的平面图设计图,在设计平面图中,用顶点表示主要建筑物,构建相应的结构体存放存放建筑物的编号、名称、简介,图片等信息,在图中的边表示建筑物之间的道路,存放两座建筑物的距离等信息。最终要求能够实现回答有xxxx 建筑物介绍、到相关建筑物的路径等问题。

程序的基本功能要求:

查询学校里面相应建筑物的相关信息 查询学校里面任意两座建筑物之间的最短路径 查询学校里面任意两做建筑物之间的所有路径 增加、删除、更新有关建筑物和相应道路的信息; 。 。 。

xxxxxx 平面图:

程序功能的实现过程:

程序主要涉及数据结构中有关图的存储和操作。

其实“查询学校里面相应建筑物的相关信息”和“增加、删除、更新有关建筑物和相应道路的信息”的难度不大,就是基本的查找,修改,更新等操作。

另外“查询学校里面任意两座建筑物之间的最短路径”是最短路问题,最短路书上有现成的算法Dijkstra 算法,Bellman-ford 算法和可以求各个顶点间最短路的Floyd-Warshall 算法;可以用这些算法实现

最难的感觉是“查询学校里面任意两做建筑物之间的所有路径”这属于搜索类问题,可以用深度优先和广度优先,本试验中定义为 bfs ()广搜,和dfs ()深搜,刚开始我一直没想好怎么用bfs ()控制结束,所有就用dfs ()回溯法实现了!后来想想广搜也可以控制只要想到,最多的长度是n-1就可以了(没有重复走一条路,否则将是无穷种可能)!

那用什么存储图呢?考虑到我们学校校园建筑物不多,所以v 肯定不多,而校园中的路肯定多,所以是个v 少的稠密图,所以用邻接矩阵!本人对c++比较熟,就用了vector 代替数组来实现可变容量的数组!

上面虽然把每个要求都想好了,可是到具体实现是又遇到很多的难题: 比如要求求最短路我该用那个算法呢,是单源最短路的Dijkstra 还是一劳永逸的Floyd-Warshall 呢!从实际出发,考虑到这个导游程序查询最多的就是某两点间的最短了,而且顶点间的道路很少变化,就选了Floyd-Washall 了。(但是后来实现顶点的删除和增加时又感觉这样也不是很妥当,不过实际上道路的修改肯定不会频繁的!)

定义的部分操作:

输入格式:

第一行两个整数n m ;分别表示建筑物的个数和道路的个数;

接着n 行每行包含三个数据:顶点编号 x,建筑物名称 xxx,建筑物简介 xxxxxxxx; 其中x 为整型,xxx 及xxxxxx 为字符串

再接下来m 行每行包含三个整型数据: a b cost a,b表示顶点标号,cost 为道路的长度

之后的是对这个无向网的操作:

目前暂时只定义三种操作

check all //查看所有的节点信息

check id //察看顶点id 的信息

min a b //察看建筑物a b之间的最短路径

all a b //察看 a b 之间的所有路径

update a 顶点编号 a,建筑物名称 xxx,建筑物简介 xxxxxxxx//更新a 建筑物的信息

deleteid a //删除a 节点

end // 终止操作

输出格式:

对于 checkall 要求输出所有建筑物的 名称 简介

对于 check id 要求输出id 景点的 名称 简介

对于 min a b 要求输出 路径的长度和途径的顶点;

对于 all a b 要求输出 路径的长度和途径的顶点; 每个路径独占一行 对于 deleteid a 输出id 建筑物的 名称 简介 delete successfully !! 对于 update a a xxx xxxxxxxxx 输出 a updatesuccessfully !! 对于 end 结束操作

struct node{

int id;

char name[20];

char info[50];

};

vector vex;

int map[Max_Vex][Max_Vex];

int path[Max_Vex][Max_Vex];

int each_cost[Max_Vex][Max_Vex];

int n,m;//顶点个数和边的个数;

int vexnum;//实际的大小

int min(int a,int b,int cost);//a b 的最短路径

int check(int a);//返回a 顶点的信息

void dfs(int x,int cost,int b);//深搜

int all(int a,int b);//输出a b间的所有路径

void Floyd_Washall();//求各个点最短路径

int update(int a);//更新节点信息

int validnum();//检测输入的是否为数字

int deleteid(int a);//删除顶点a

int help();//帮助命令

编译环境:

Vc6.0

用c++编译

大体流程图:

程序源代码:

#include

#include

#include

#define Max_Vex 100

#define MaxNum 0x7ffffff

using namespace std;

struct node{

int id;

char name[20];

char info[50];

};

vector vex;

int map[Max_Vex][Max_Vex];

int path[Max_Vex][Max_Vex];

int each_cost[Max_Vex][Max_Vex];

int n,m;//顶点个数和边的个数;

int vexnum;//实际的大小

int min(int a,int b,int cost);//a b 的最短路径

int check(int a);//返回a 顶点的信息

void dfs(int x,int cost,int b);//深搜

int all(int a,int b);//输出a b间的所有路径

void Floyd_Washall();//求各个点最短路径

int update(int a);//更新节点信息

int validnum();//检测输入的是否为数字

int deleteid(int a);//删除顶点a

int help();//帮助命令

int main()

{

int j,i,a,b,cost;

node t;

system("cls");

system("mode con:cols=40 lines=20");

system("color 4f");

scanf("%d%d",&n,&m);

for(i=0;i

for(j=0;j

each_cost[i][j]=map[i][j]=MaxNum;

}

}

vexnum = n;//

vex.push_back(t);

for(i=0;i

scanf("%d%s%s",&t.id,t.name,t.info);

vex.push_back(t);

}

for(i=0;i

scanf("%d%d%d",&a,&b,&cost);//利用邻接矩阵存储

map[a][b] = map[b][a] = cost;

//each_cost[a][b] = each_cost[b][a] =cost;

}

//floyd求各个点之间的最短路径保存在each_cost中

Floyd_Washall();

//路径保存在path 中

char str[20];

do{//功能菜单

scanf("%s",str);

if(strcmp(str,"check")==0){a=validnum();if(a!=-1)check(a);} else if(strcmp(str,"cls")==0){system("cls");}

else if(strcmp(str,"help")==0){help();}

else

if(strcmp(str,"update")==0){a=validnum();if(a!=-1)update(a);} else if(strcmp(str,"deleteid")==0)

{a=validnum();if(a!=-1)deleteid(a);}

else if(strcmp(str,"checkall")==0){for(i=1;i

{scanf("%d%d",&a,&b);min(a,b,each_cost[a][b]);}

else if(strcmp(str,"all")==0){scanf("%d%d",&a,&b);all(a,b);} else if(strcmp(str,"end")==0){break;}

else{printf("error input!!!\nyou can type 'help' for detail!!\n");}

}while(1);

return 0;

}

int help()

{

cout

return 0;

}

int validnum()

{//若输入的是数字则返回数字,其他为非法输入,返回-1;

char str[10];

scanf("%s",str);

if(isdigit(str[0])) return atoi(str);

else printf(" error input!!\n");

return -1;

}

int deleteid(int a)

{

for(int i=1;i

for(i=1;i

//n--;

Floyd_Washall();

vexnum--;

check(a);

printf("delete successfully!!!\n");

vex[a].id = -1;

//vex.erase(vex.begin()+a);

return 0;

}

int update(int a)

{

node t;

scanf("%d%s%s",&t.id,t.name,t.info);

vex[a] = t;

return 0;

}

int min(int a,int b,int cost)

{

int i=path[b][a];

printf("%d-->",a);

while(i!=b) {

printf("%d-->",i);

i=path[b][i];

}

printf("%d cost %d\n",b,cost);

return 0;

}

int check(int a)

{

if(vex[a].id!=-1){

printf("%d%s%s\n",vex[a].id,vex[a].name,vex[a].info); return 1;

}

//else printf("%d isn't in!\n",a);

return -1;

}

int p[Max_Vex];

int used[Max_Vex];

void dfs(int x,int cost,int b)

{

p[p[0]++] = x;//x加入路径;

if(x==b){//找到一条路径则输出

for(int i=1;i

printf("%d-->",p[i]);

printf("%d cost %d\n",p[i],cost);

return ;

}

for(int j = 1;j

if(map[x][j]!=MaxNum&& !used[x]){//x到j 有路,并且x 到j 没走过 cost+=map[x][j];//记录总的花费

used[x] = 1;//标记已走

dfs(j,cost,b);

p[0]--;//去掉j

cost-=map[x][j];//恢复

used[x] = 0;//恢复

}

}

}

int all(int a,int b)

{

p[0] = 1;

memset(used,0,sizeof(used));

dfs(a,0,b);//利用深搜找所有路径;

return 0;

}

void Floyd_Washall()

{

int i,j,k;

for(i=1;i

for (j=1;j

each_cost[i][j] = map[i][j];

path[i][j]=i;

}

}

for(i=1;i

each_cost[i][i]=0;

path[i][i]=0;

}

for(k=1;k

for(i=1;i

for(j=1;j

if(each_cost[i][j]>each_cost[i][k]+each_cost[k][j]) {

each_cost[i][j]=each_cost[i][k]+each_cost[k][j]; path[i][j]=path[k][j];

}

}

参考资料:

1, visual c++6.0程序设计与开发技术大全 2, c++大学基础教程

3, 数据结构(清华大学出版社)


相关文章

  • 作业成本法案例分析
  • 作业成本核算体系设计案例 邓为民 个性化的成本核算管理方法--作业成本法(邓为民) 作业成本法的实施是企业决策信息化的一部分,本文提供了一个在企业信息化环境下作业成本核算体系设计的案例.案例表明,在作业成本法核算体系设计中,作业数量可以很多,并且数据采集不是难点. 某集团公司外贸生产中心是一个独立核 ...

  • IE工业工程现场改善:2作业测定
  • 工业工程现场改善:第二章 作业测定 第一节 作业测定概述 一. 作业测定定义与目的 1. 作业测定的定义: 国际劳工组织的工作研究专家对作业测定下的定义是"作业测定(工作衡量)是运用各种技术来确定合格工人按规定的作业标准,完成某项工作所需标准时间."他是采用时间研究﹑工作抽样﹑预 ...

  • 锅炉钢结构安装合成版
  • 1号机组锅炉钢结构安装 施工技术措施 目 录 1 工程概况 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 1.1 工程概况 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 1.1.1工程范围 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 1 1.1 ...

  • 教师教育工作会议专题培训材料
  • 教师教育工作会议专题培训材料 一、对主管领导和辅导员的工作要求 (一)主管领导的要求: 1、熟悉县局有关培训文件内容和要求 2、设计各类教师作业训练检查结果统计表格 3、修改计划行事历并上报(10月20日通过网络上报) 4、成立业务指导小组,由辅导员主领,每人分管一项,组织检查教师训练作业:(大校6 ...

  • 寿险业务流程及组织结构
  • 某寿险公司运营业务流程模型 寿险,这个运营系统,处理寿险保单,接受客户理赔服务要求,满足客户售前咨询以及售后服务.当然,由于寿险是逐年缴纳保费的产品,故需要保费续收的工作,为了使保单正确.有效,需要保全的工作.故可以把寿险的运营工作分为四类:新契约承保业务.理赔业务.客户服务业务.续收保全业务. 虽 ...

  • 绝缘杆和绝缘斗臂车带电作业的比较
  • <农村电工>2012年第10期 农电技术 栏目主持柳鸣 绝缘杆和 绝缘斗臂车 我国推行10kV 配电线路带电作业以来,在带电连接引线.带电更换跌落式熔断器等常规作业中,绝缘杆作业法被长期采用,而绝缘斗臂车因其具有升空便利.机动性强.作业范围大.机械强度高.电气绝缘性能高等优点,正在逐步取 ...

  • 钢结构吊装安全技术措施
  • 钢结构吊装安全措施 构件的吊装一般经过绑扎.起吊.就位.临时固定.校正和最后固定等工序,吊装作业中起重机械能力的提高,减轻了人们的劳动强度,但同时也增加了作业风险和一些新问题,而大型钢结构的吊装作业由于工件规模大,往往多台吊机联合作业,所以安全技术措施是保证钢结构工程吊装顺利进行的前提,笔者通过几项 ...

  • 人因工程学实验报告
  • 经济管理学院 课程名称:人因工程学 授课班级:研1204班 授课教师:傅惠敏 小组成员:李晓华 刘静雅 洪 卫 2013-6-15 实验一 人体测量 实验名称:人体测量 班级:SJ1204班 小组成员姓名与分工 被测者:洪卫.刘静雅.李晓华 数据记录者:洪卫.刘静雅.李晓华 测试者:洪卫.刘静雅.李 ...

  • 细胞生物学课程教学大纲
  • 细胞生物学课程教学大纲 课程名称:细胞生物学Cell Biology 课程编号:1313016215 课程类别:专业课 总学时数:68 学 分:3.5 开课单位:生命科学学院生物综合教研室 适用专业:生物科学 适用对象:本科(四年) 一.课程的性质.类型.目的和任务 细胞生物学是生物科学专业的一门专 ...

  • LP精益生产之效率提升-IE
  • LP精益生产之----工业工程(IE) 当今竞争的本质无非在于设计的效率.创新的效率.制造和服务的效率.今天和将来任何东西都没有暴利.我们已进入微利时代,中国的经济要走上康庄大道必须要靠工业.工业的基础在于制造,制造的根本就在于设计与创新.推动工作一定要从IE开始. 主讲:郭晓宁老师 [课程质量] ...

© 2024 范文中心 | 联系我们 webmaster# onjobs.com.cn