西安邮电大学数据结构校园导游系统课程设计报告.docx
《西安邮电大学数据结构校园导游系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《西安邮电大学数据结构校园导游系统课程设计报告.docx(34页珍藏版)》请在冰豆网上搜索。
西安邮电大学数据结构校园导游系统课程设计报告
西安郵電大學
数据结构课程设计报告书
系部名称
计算机学院
学生姓名
崔斌
专业名称
计算机科学与技术专业
班级
计科1106
学号
04111185
指导教师
衡霞
时间
2012年12月15日至
2012年12月21日
实验题目:
校园导游系统
一、实验目的
①:
为了让非本校的同学们,家长们能够充分了解本校---西安邮电大学。
②:
实践数据结构所学知识。
二、实验内容
学校简易的俯视图。
各个景点的简单介绍。
③:
任意两景点之间的所有路径。
④:
任意两景点之间的最少中转景点路径。
⑤:
任意两景点之间的带权路径长度。
三、需求分析
Init();初始化两个顺序栈
Menu();进行选择的模块函数;
Intro();景点介绍函数;
Search();判断是否有此编号的景点;
Findallpath();找路径函数;
Findallway();找任意两个景点之间的所有路径;(存在栈里面)
Shortestway();任意两个景点之间中转次数最少的路径;(从栈里面读取出来)
Niceway();任意两个景点之间总权值最小的路径;(从栈里面读取出来)
Calculate();(从栈里面读取出来相关数据),进行分析运算;
Byebye();你懂得!
四、概要设计
1、方案设计
对系统进行分析,给出景区图
重点:
1:
//思想;递归结合循环,然后,找到终点时还要回溯;
voidfindallway(adjlist*G,intm,intn)//两点之间的所有路径
{
inti,t,k;
arcnode*p;
pa_thrp;
push(s,m);
G->vertex[m-1].flag=1;
if(m==n)
rp.sumweight=k=calculate(G);
rp.sum=s->top;
rp.num=(y+1);
push1(&z,rp);
printf("路径%3d为(途径%2d个景点,长度为%3d):
",y+1,s->top,k);
for(i=0;i<=s->top;i++)
printf("->%d",s->elem[i]);
printf("\n");
y++;//外部全局变量
}
else
for(p=G->vertex[m-1].firstarc;p!
=NULL;p=p->nextarc)
t=p->num;
if(G->vertex[t-1].flag==0)
findallway(G,t,n);
G->vertex[s->elem[s->top]-1].flag=0;//两句顺序不可以调换
pops(s);
2:
//从文件里读取数据;
错误1;不知道此节点有几个邻接点,因为%s的原因,就会只把第一个节点的相关数据读出来,从第二个节点的相关信息处,开始读出错误(即烫烫烫烫烫烫烫烫烫烫烫);为此,我在文件里面加了此节点的邻接点个数m,readnet()里面又有count相加以监视不超过m;
错误2;读文件时,因为有链表的部分,就按照单链表的创建些写,结果总是此节点的最后一个邻接点没被读到内存里,究其原因,是最后一个p1没有连接到此条链表的尾部,(不仅我把p2->nextarc=NULL;还把free(p1);)
voidreadnet(adjlist*G)
inti,count,m;
arcnode*head,*p2,*p1;
FILE*fp;
fp=fopen(U,"rt");
if(fp==NULL)
printf("文件打开失败!
!
");exit(0);
for(i=0;i{fscanf(fp,"%d%s%s%d%d",&G->vertex[i].num,G->vertex[i].name,G->vertex[i].introduce,&G->vertex[i].sum,&G->vertex[i].flag);//fprintf()的"后面不加第一个空格也可以。m=G->vertex[i].sum;p2=H;head=p2;p1=H;fscanf(fp,"%d%d",&p1->num,&p1->weight);//fprintf()的"后面不加第一个空格也可以。count=1;while(count{p2->nextarc=p1;p2=p1;p1=H;fscanf(fp,"%d%d",&p1->num,&p1->weight);//fprintf()的"后面不加第一个空格也可以。count++;}p2->nextarc=p1;//千万不能忘掉此语句,令人蛋碎一地呀p2=p1;//千万不能忘掉此语句,令人蛋碎一地呀,否则会丢掉每个节点的最后一个邻接点p2->nextarc=NULL;//free(p1);//千万不能有此语句,令人蛋碎一地呀G->vertex[i].firstarc=head->nextarc;}fclose(fp);}2、数据结构说明程序中定义的数据类型——结构体(各个成员的作用);表定义:typedefstructArcnode{intnum;//顶点编号intweight;//顶点与此点之间路径的权值structArcnode*nextarc;}arcnode;typedefstructVertexnode{intnum;//顶点编号charname[20];//顶点景点名称charintroduce[40];//景点简介intsum;//与其他连接的景点个数//令人蛋疼的读文件呀intflag;//默认为0,刚好可以标志。arcnode*firstarc;}vertexnode;typedefstructAA{vertexnodevertex[MAX_vertex_num];//顶点数组intother;//备用}adjlist;编号名称简介邻接点个数Flagfirstarc五、详细设计及运行结果六、调试情况,设计技巧及体会(重点)1、测试数据包括合法与非法的测试数据、预期结构和实测结果(最好用表格列出)读文件后本应为:1超市同学们购物的天堂!20210031502宿舍楼同学们就寝,玩游戏的宝地。2011005303体育馆锻炼身体,高校的体育交流之地。2011506704旭日苑就餐之地1.30590630071205网吧锻炼大脑,手指灵活性的地方。3023049071206图书馆书的海洋。3037043008407美广就餐之地2.304120520101108大活娱乐晚会举办地。30640930122009喷泉哈哈,你懂得!308301070134010实验楼下一个产生钱学森的圣地!307110970113011教学楼园丁与花朵!2010301310012行政楼学校领导办公之地。208200139013北门学校的正门。20111001290但确只有:(每个邻接点的邻接点都少一个)1超市同学们购物的天堂!2021002宿舍楼同学们就寝,玩游戏的宝地。2011003体育馆锻炼身体,高校的体育交流之地。2011504旭日苑就餐之地1.3059063005网吧锻炼大脑,手指灵活性的地方。302304906图书馆书的海洋。3037043007美广就餐之地2.3041205208大活娱乐晚会举办地。306409309喷泉哈哈,你懂得!30830107010实验楼下一个产生钱学森的圣地!30711097011教学楼园丁与花朵!20103012行政楼学校领导办公之地。20820013北门学校的正门。2011100非法数据:2、对调试中主要问题进行总结错误1;(读文件时)不知道此节点有几个邻接点,因为%s的原因,就会只把第一个节点的相关数据读出来,从第二个节点的相关信息处,开始读出错误(即烫烫烫烫烫烫烫烫烫烫烫);为此,我在文件里面加了此节点的邻接点个数m,readnet()里面又有count相加以监视不超过m;错误2;读文件时,因为有链表的部分,就按照单链表的创建些写,结果总是此节点的最后一个邻接点没被读到内存里,究其原因,是最后一个p1没有连接到此条链表的尾部,(不仅我把p2->nextarc=NULL;还把free(p1);)还有,由于findallway()是循环与递归的结合,所以调试过程相当累。3、对自己设计进行评价,指出合理和不足之处,提出改进的方案自己编写的,就有一份自豪感,但是也有问题;比如,找最小中转路径时,如果有相同的几个,那么就只能打印出一条路径。带权路径也一样。由于时间问题,没有改进,以后会改进的。4、在设计过程中的感受感觉循环与递归的结合短小精悍,对于程序员分析问题来说,就,你懂得!七、源程序清单(略,详见电子版实验报告)❶:#include"common.h"#include"seqstacki.h"#include"schooltravel.h"#defineMAX_vertex_num30#defineH(arcnode*)malloc(sizeof(arcnode))#defineU"daoyou1.txt"#defineO(linkstacknode*)malloc(sizeof(linkstacknode))typedefstructArcnode{intnum;//编号intweight;//顶点与此点之间路径的权值structArcnode*nextarc;}arcnode;typedefstructVertexnode{intnum;//编号charname[20];//顶点景点名称charintroduce[40];//景点简介intsum;//与他连接的景点个数//令人蛋疼的读文件呀intflag;//默认为0,刚好可以标志。arcnode*firstarc;}vertexnode;typedefstructAA{vertexnodevertex[MAX_vertex_num];//顶点数组intother;//备用}adjlist;voidmenu(adjlist*G);voidintro(adjlist*G);intsearch(adjlist*G,ints);voidfindallpath(adjlist*G);voidfindallway(adjlist*G,intm,intn);voidbyebye();voidreadnet(adjlist*G);voidMap();voidshortestway(adjlist*G);intcalculate(adjlist*G);voidniceway(adjlist*G);voidfindweight(adjlist*G,intm,intn); seqstackiw,*s=&w;seqstackpathz;intvnum=13;main(){adjlistq,*G=&q;initstack(s);initstack1(&z);readnet(G);//读出文件Map();//printf("%d\n",G->vertex[4].firstarc->nextarc->nextarc->weight);menu(G);}voidmenu(adjlist*G){intchoice;Map();printf("\n┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳\n");printf("\n┣┃●①◣查看景点信息┃┫");printf("\n┣┃●②◣查寻两景点之间的路径┃┫");printf("\n┣┃︻┳═一●③◣退出系统┃┫");printf("\n┻┻┻┻┻┻┻┻︷︷︷︷︷︷︷︷︷︷︷︷︷︷︷┻┻┻┻┻┻┻\n");printf("\n\t\t你想选择?请选择(1-3):");scanf("%d",&choice);while(choice<1||choice>3){printf("\n\t\t输入错误,重新选择(1-3):");scanf("%d",&choice);}switch(choice){case1:intro(G);break;case2:findallpath(G);break;case3:byebye();exit(0);break;}}voidintro(adjlist*G)//景点信息{intchoice;intk;//接收返回的数组下标值Map();printf("\n\t你想查看哪个景点的详细介绍呢?请按照本校平面图输入--标号:");scanf("%d",&choice);if((k=search(G,choice)+1))//判断是否存在此景点{printf("\n%d号景点:\n\t%s--%s",choice,G->vertex[k-1].name,G->vertex[k-1].introduce);//k要-1,否则向后偏移一个景点printf("\n\t(任意键返回主菜单)\n");getch();menu(G);exit(0);;}else{printf("\n\t不存在此景点!!(任意键返回主菜单)\n");getch();menu(G);exit(0);}}intsearch(adjlist*G,ints){inti;for(i=0;iif(G->vertex[i].num==s)return(i);return(-1);//没有就返回-1}inty=0;voidfindallpath(adjlist*G){inti,j;//两景点编号Map();printf("\n你想查寻哪两个景点之间的路线呢?(-间隔)请按照本校平面图输入--标号:");scanf("%d-%d",&i,&j);if(0=j)//景点编号大于景点树木,必然不存在次景点{findallway(G,i,j);//所有路径printf("\n\t共有%d条路径!\n",y); y=0;//很重要,否则查询几次,她就一直叠加。 shortestway(G);//最短路径广度优先niceway(G);//最佳访问路径地界斯科拉算法initstack(s);//找完所有路径后,必须初始化栈,否则栈可能满而溢出initstack1(&z);//找完所有路径后,必须初始化栈,否则栈可能满而溢出}else{printf("不存在此景点或者起点和终点是同一点!!(任意键返回主菜单)");getch();menu(G);exit(0);}printf("\n\(任意键返回主菜单)");getch();menu(G);exit(0);}voidshortestway(adjlist*G){inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];max=min=z.elem[0].sum;for(i=1;i<=z.top;i++){if(min>=z.elem[i].sum){min=z.elem[i].sum;k=i;}if(max<=z.elem[i].sum){max=z.elem[i].sum;t=i;}}if(min==z.elem[0].sum)k=0;if(max==z.elem[0].sum)t=0;printf("\n\t最短路径为:%3d号路径,途径%2d个景点!!\n",z.elem[k].num,min);printf("\n\t最长路径为:%3d号路径,途径%2d个景点!!\n",z.elem[t].num,max);}voidniceway(adjlist*G){inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];max=min=z.elem[0].sumweight;for(i=1;i<=z.top;i++){if(min>z.elem[i].sumweight){min=z.elem[i].sumweight;k=i;}if(max{max=z.elem[i].sumweight;t=i;}}if(min==z.elem[0].sumweight)k=0;if(max==z.elem[0].sumweight)t=0;printf("\n\t最佳访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[k].num,min);printf("\n\t最差访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[t].num,max);}voidfindallway(adjlist*G,intm,intn)//两点之间的所有路径{inti,t,k;arcnode*p;pa_thrp;push(s,m);G->vertex[m-1].flag=1;if(m==n){rp.sumweight=k=calculate(G);rp.sum=s->top;rp.num=(y+1);push1(&z,rp);printf("路径%3d为(途径%2d个景点,长度为%3d):",y+1,s->top,k);for(i=0;i<=s->top;i++)printf("->%d",s->elem[i]);printf("\n");G->vertex[m-1].flag=1;y++;}elsefor(p=G->vertex[m-1].firstarc;p!=NULL;p=p->nextarc){t=p->num;if(G->vertex[t-1].flag==0)findallway(G,t,n);}G->vertex[s->elem[s->top]-1].flag=0;//两句顺序不可以调换pops(s);}intcalculate(adjlist*G){inti;intsum=0;for(i=0;i<=s->top;i++){findweight(&sum,G,search(G,s->elem[i]),i);}return(sum);}voidfindweight(int*sum,adjlist*G,intm,intn){arcnode*p;for(p=G->vertex[m].firstarc;p!=NULL;p=p->nextarc)if(p->num==s->elem[n+1]){*sum+=p->weight;break;}} voidbyebye(){system("cls");printf("\n\n\n\n");printf("\t\t /\~~~~~~~~~~~~~\ ▓ ^*^ ☆ $$ .☆\n");printf("\t\t ./ \~~~▓~ ~~~~\◆ 圣诞.快乐 * $◢◣$ *\n");printf("\t\t /^^\══════\.◆ * * * $◢★◣$ *\n");printf("\t\t ..▎[] ▎田 田▎|┃◆ . * $◢■■◣$ *\n");printf("\t\t &&▎ ▎ ▎'|'▎@ *$◢■■■◣$*\n");printf("\t\t#■■■■■■■■■■〓▄▃▂▁愿你圣诞快乐︸︸||︸︸\n\n\n\n");printf("制作人:崔斌\n");printf("================================================================================\n");printf("●☆☆Bye-Bye☆☆●\n");printf("\n");printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("\n");printf("\n");printf("☆☆☆☆☆☆☆☆☆☆☆\n");printf("\n");printf("★★★★★★★★★★★\n");print
fscanf(fp,"%d%s%s%d%d",&G->vertex[i].num,G->vertex[i].name,G->vertex[i].introduce,&G->vertex[i].sum,&G->vertex[i].flag);//fprintf()的"后面不加第一个空格也可以。
m=G->vertex[i].sum;
p2=H;head=p2;
p1=H;
fscanf(fp,"%d%d",&p1->num,&p1->weight);//fprintf()的"后面不加第一个空格也可以。
count=1;
while(count{p2->nextarc=p1;p2=p1;p1=H;fscanf(fp,"%d%d",&p1->num,&p1->weight);//fprintf()的"后面不加第一个空格也可以。count++;}p2->nextarc=p1;//千万不能忘掉此语句,令人蛋碎一地呀p2=p1;//千万不能忘掉此语句,令人蛋碎一地呀,否则会丢掉每个节点的最后一个邻接点p2->nextarc=NULL;//free(p1);//千万不能有此语句,令人蛋碎一地呀G->vertex[i].firstarc=head->nextarc;}fclose(fp);}2、数据结构说明程序中定义的数据类型——结构体(各个成员的作用);表定义:typedefstructArcnode{intnum;//顶点编号intweight;//顶点与此点之间路径的权值structArcnode*nextarc;}arcnode;typedefstructVertexnode{intnum;//顶点编号charname[20];//顶点景点名称charintroduce[40];//景点简介intsum;//与其他连接的景点个数//令人蛋疼的读文件呀intflag;//默认为0,刚好可以标志。arcnode*firstarc;}vertexnode;typedefstructAA{vertexnodevertex[MAX_vertex_num];//顶点数组intother;//备用}adjlist;编号名称简介邻接点个数Flagfirstarc五、详细设计及运行结果六、调试情况,设计技巧及体会(重点)1、测试数据包括合法与非法的测试数据、预期结构和实测结果(最好用表格列出)读文件后本应为:1超市同学们购物的天堂!20210031502宿舍楼同学们就寝,玩游戏的宝地。2011005303体育馆锻炼身体,高校的体育交流之地。2011506704旭日苑就餐之地1.30590630071205网吧锻炼大脑,手指灵活性的地方。3023049071206图书馆书的海洋。3037043008407美广就餐之地2.304120520101108大活娱乐晚会举办地。30640930122009喷泉哈哈,你懂得!308301070134010实验楼下一个产生钱学森的圣地!307110970113011教学楼园丁与花朵!2010301310012行政楼学校领导办公之地。208200139013北门学校的正门。20111001290但确只有:(每个邻接点的邻接点都少一个)1超市同学们购物的天堂!2021002宿舍楼同学们就寝,玩游戏的宝地。2011003体育馆锻炼身体,高校的体育交流之地。2011504旭日苑就餐之地1.3059063005网吧锻炼大脑,手指灵活性的地方。302304906图书馆书的海洋。3037043007美广就餐之地2.3041205208大活娱乐晚会举办地。306409309喷泉哈哈,你懂得!30830107010实验楼下一个产生钱学森的圣地!30711097011教学楼园丁与花朵!20103012行政楼学校领导办公之地。20820013北门学校的正门。2011100非法数据:2、对调试中主要问题进行总结错误1;(读文件时)不知道此节点有几个邻接点,因为%s的原因,就会只把第一个节点的相关数据读出来,从第二个节点的相关信息处,开始读出错误(即烫烫烫烫烫烫烫烫烫烫烫);为此,我在文件里面加了此节点的邻接点个数m,readnet()里面又有count相加以监视不超过m;错误2;读文件时,因为有链表的部分,就按照单链表的创建些写,结果总是此节点的最后一个邻接点没被读到内存里,究其原因,是最后一个p1没有连接到此条链表的尾部,(不仅我把p2->nextarc=NULL;还把free(p1);)还有,由于findallway()是循环与递归的结合,所以调试过程相当累。3、对自己设计进行评价,指出合理和不足之处,提出改进的方案自己编写的,就有一份自豪感,但是也有问题;比如,找最小中转路径时,如果有相同的几个,那么就只能打印出一条路径。带权路径也一样。由于时间问题,没有改进,以后会改进的。4、在设计过程中的感受感觉循环与递归的结合短小精悍,对于程序员分析问题来说,就,你懂得!七、源程序清单(略,详见电子版实验报告)❶:#include"common.h"#include"seqstacki.h"#include"schooltravel.h"#defineMAX_vertex_num30#defineH(arcnode*)malloc(sizeof(arcnode))#defineU"daoyou1.txt"#defineO(linkstacknode*)malloc(sizeof(linkstacknode))typedefstructArcnode{intnum;//编号intweight;//顶点与此点之间路径的权值structArcnode*nextarc;}arcnode;typedefstructVertexnode{intnum;//编号charname[20];//顶点景点名称charintroduce[40];//景点简介intsum;//与他连接的景点个数//令人蛋疼的读文件呀intflag;//默认为0,刚好可以标志。arcnode*firstarc;}vertexnode;typedefstructAA{vertexnodevertex[MAX_vertex_num];//顶点数组intother;//备用}adjlist;voidmenu(adjlist*G);voidintro(adjlist*G);intsearch(adjlist*G,ints);voidfindallpath(adjlist*G);voidfindallway(adjlist*G,intm,intn);voidbyebye();voidreadnet(adjlist*G);voidMap();voidshortestway(adjlist*G);intcalculate(adjlist*G);voidniceway(adjlist*G);voidfindweight(adjlist*G,intm,intn); seqstackiw,*s=&w;seqstackpathz;intvnum=13;main(){adjlistq,*G=&q;initstack(s);initstack1(&z);readnet(G);//读出文件Map();//printf("%d\n",G->vertex[4].firstarc->nextarc->nextarc->weight);menu(G);}voidmenu(adjlist*G){intchoice;Map();printf("\n┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳\n");printf("\n┣┃●①◣查看景点信息┃┫");printf("\n┣┃●②◣查寻两景点之间的路径┃┫");printf("\n┣┃︻┳═一●③◣退出系统┃┫");printf("\n┻┻┻┻┻┻┻┻︷︷︷︷︷︷︷︷︷︷︷︷︷︷︷┻┻┻┻┻┻┻\n");printf("\n\t\t你想选择?请选择(1-3):");scanf("%d",&choice);while(choice<1||choice>3){printf("\n\t\t输入错误,重新选择(1-3):");scanf("%d",&choice);}switch(choice){case1:intro(G);break;case2:findallpath(G);break;case3:byebye();exit(0);break;}}voidintro(adjlist*G)//景点信息{intchoice;intk;//接收返回的数组下标值Map();printf("\n\t你想查看哪个景点的详细介绍呢?请按照本校平面图输入--标号:");scanf("%d",&choice);if((k=search(G,choice)+1))//判断是否存在此景点{printf("\n%d号景点:\n\t%s--%s",choice,G->vertex[k-1].name,G->vertex[k-1].introduce);//k要-1,否则向后偏移一个景点printf("\n\t(任意键返回主菜单)\n");getch();menu(G);exit(0);;}else{printf("\n\t不存在此景点!!(任意键返回主菜单)\n");getch();menu(G);exit(0);}}intsearch(adjlist*G,ints){inti;for(i=0;iif(G->vertex[i].num==s)return(i);return(-1);//没有就返回-1}inty=0;voidfindallpath(adjlist*G){inti,j;//两景点编号Map();printf("\n你想查寻哪两个景点之间的路线呢?(-间隔)请按照本校平面图输入--标号:");scanf("%d-%d",&i,&j);if(0=j)//景点编号大于景点树木,必然不存在次景点{findallway(G,i,j);//所有路径printf("\n\t共有%d条路径!\n",y); y=0;//很重要,否则查询几次,她就一直叠加。 shortestway(G);//最短路径广度优先niceway(G);//最佳访问路径地界斯科拉算法initstack(s);//找完所有路径后,必须初始化栈,否则栈可能满而溢出initstack1(&z);//找完所有路径后,必须初始化栈,否则栈可能满而溢出}else{printf("不存在此景点或者起点和终点是同一点!!(任意键返回主菜单)");getch();menu(G);exit(0);}printf("\n\(任意键返回主菜单)");getch();menu(G);exit(0);}voidshortestway(adjlist*G){inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];max=min=z.elem[0].sum;for(i=1;i<=z.top;i++){if(min>=z.elem[i].sum){min=z.elem[i].sum;k=i;}if(max<=z.elem[i].sum){max=z.elem[i].sum;t=i;}}if(min==z.elem[0].sum)k=0;if(max==z.elem[0].sum)t=0;printf("\n\t最短路径为:%3d号路径,途径%2d个景点!!\n",z.elem[k].num,min);printf("\n\t最长路径为:%3d号路径,途径%2d个景点!!\n",z.elem[t].num,max);}voidniceway(adjlist*G){inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];max=min=z.elem[0].sumweight;for(i=1;i<=z.top;i++){if(min>z.elem[i].sumweight){min=z.elem[i].sumweight;k=i;}if(max{max=z.elem[i].sumweight;t=i;}}if(min==z.elem[0].sumweight)k=0;if(max==z.elem[0].sumweight)t=0;printf("\n\t最佳访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[k].num,min);printf("\n\t最差访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[t].num,max);}voidfindallway(adjlist*G,intm,intn)//两点之间的所有路径{inti,t,k;arcnode*p;pa_thrp;push(s,m);G->vertex[m-1].flag=1;if(m==n){rp.sumweight=k=calculate(G);rp.sum=s->top;rp.num=(y+1);push1(&z,rp);printf("路径%3d为(途径%2d个景点,长度为%3d):",y+1,s->top,k);for(i=0;i<=s->top;i++)printf("->%d",s->elem[i]);printf("\n");G->vertex[m-1].flag=1;y++;}elsefor(p=G->vertex[m-1].firstarc;p!=NULL;p=p->nextarc){t=p->num;if(G->vertex[t-1].flag==0)findallway(G,t,n);}G->vertex[s->elem[s->top]-1].flag=0;//两句顺序不可以调换pops(s);}intcalculate(adjlist*G){inti;intsum=0;for(i=0;i<=s->top;i++){findweight(&sum,G,search(G,s->elem[i]),i);}return(sum);}voidfindweight(int*sum,adjlist*G,intm,intn){arcnode*p;for(p=G->vertex[m].firstarc;p!=NULL;p=p->nextarc)if(p->num==s->elem[n+1]){*sum+=p->weight;break;}} voidbyebye(){system("cls");printf("\n\n\n\n");printf("\t\t /\~~~~~~~~~~~~~\ ▓ ^*^ ☆ $$ .☆\n");printf("\t\t ./ \~~~▓~ ~~~~\◆ 圣诞.快乐 * $◢◣$ *\n");printf("\t\t /^^\══════\.◆ * * * $◢★◣$ *\n");printf("\t\t ..▎[] ▎田 田▎|┃◆ . * $◢■■◣$ *\n");printf("\t\t &&▎ ▎ ▎'|'▎@ *$◢■■■◣$*\n");printf("\t\t#■■■■■■■■■■〓▄▃▂▁愿你圣诞快乐︸︸||︸︸\n\n\n\n");printf("制作人:崔斌\n");printf("================================================================================\n");printf("●☆☆Bye-Bye☆☆●\n");printf("\n");printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("\n");printf("\n");printf("☆☆☆☆☆☆☆☆☆☆☆\n");printf("\n");printf("★★★★★★★★★★★\n");print
p2->nextarc=p1;
p2=p1;
count++;
p2->nextarc=p1;//千万不能忘掉此语句,令人蛋碎一地呀
p2=p1;//千万不能忘掉此语句,令人蛋碎一地呀,否则会丢掉每个节点的最后一个邻接点
p2->nextarc=NULL;
//free(p1);//千万不能有此语句,令人蛋碎一地呀
G->vertex[i].firstarc=head->nextarc;
fclose(fp);
2、数据结构说明
程序中定义的数据类型——结构体(各个成员的作用);
表定义:
typedefstructArcnode
intnum;//顶点编号
intweight;//顶点与此点之间路径的权值
structArcnode*nextarc;
}arcnode;
typedefstructVertexnode
charname[20];//顶点景点名称
charintroduce[40];//景点简介
intsum;//与其他连接的景点个数//令人蛋疼的读文件呀
intflag;//默认为0,刚好可以标志。
arcnode*firstarc;
}vertexnode;
typedefstructAA
vertexnodevertex[MAX_vertex_num];//顶点数组
intother;//备用
}adjlist;
编号
名称
简介
邻接点个数
Flag
firstarc
五、详细设计及运行结果
六、调试情况,设计技巧及体会(重点)
1、测试数据
包括合法与非法的测试数据、预期结构和实测结果(最好用表格列出)
读文件后本应为:
1超市同学们购物的天堂!
20
2100
3150
2宿舍楼同学们就寝,玩游戏的宝地。
1100
530
3体育馆锻炼身体,高校的体育交流之地。
1150
670
4旭日苑就餐之地1.30
590
6300
7120
5网吧锻炼大脑,手指灵活性的地方。
30
230
490
6图书馆书的海洋。
370
4300
840
7美广就餐之地2.30
4120
520
10110
8大活娱乐晚会举办地。
640
930
12200
9喷泉哈哈,你懂得!
830
1070
1340
10实验楼下一个产生钱学森的圣地!
7110
970
1130
11教学楼园丁与花朵!
1030
13100
12行政楼学校领导办公之地。
8200
1390
13北门学校的正门。
11100
1290
但确只有:
(每个邻接点的邻接点都少一个)
非法数据:
2、对调试中主要问题进行总结
错误1;(读文件时)不知道此节点有几个邻接点,因为%s的原因,就会只把第一个节点的相关数据读出来,从第二个节点的相关信息处,开始读出错误(即烫烫烫烫烫烫烫烫烫烫烫);为此,我在文件里面加了此节点的邻接点个数m,readnet()里面又有count相加以监视不超过m;
还有,由于findallway()是循环与递归的结合,所以调试过程相当累。
3、对自己设计进行评价,指出合理和不足之处,提出改进的方案
自己编写的,就有一份自豪感,但是也有问题;比如,找最小中转路径时,如果有相同的几个,那么就只能打印出一条路径。
带权路径也一样。
由于时间问题,没有改进,以后会改进的。
4、在设计过程中的感受
感觉循环与递归的结合短小精悍,对于程序员分析问题来说,就,你懂得!
七、源程序清单(略,详见电子版实验报告)
❶:
#include"common.h"
#include"seqstacki.h"
#include"schooltravel.h"
#defineMAX_vertex_num30
#defineH(arcnode*)malloc(sizeof(arcnode))
#defineU"daoyou1.txt"
#defineO(linkstacknode*)malloc(sizeof(linkstacknode))
intnum;//编号
intsum;//与他连接的景点个数//令人蛋疼的读文件呀
voidmenu(adjlist*G);
voidintro(adjlist*G);
intsearch(adjlist*G,ints);
voidfindallpath(adjlist*G);
voidfindallway(adjlist*G,intm,intn);
voidbyebye();
voidreadnet(adjlist*G);
voidMap();
voidshortestway(adjlist*G);
intcalculate(adjlist*G);
voidniceway(adjlist*G);
voidfindweight(adjlist*G,intm,intn);
seqstackiw,*s=&w;
seqstackpathz;
intvnum=13;
main()
adjlistq,*G=&q;
initstack(s);
initstack1(&z);
readnet(G);//读出文件
Map();
//printf("%d\n",G->vertex[4].firstarc->nextarc->nextarc->weight);
menu(G);
voidmenu(adjlist*G)
intchoice;
printf("\n┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳\n");
printf("\n┣┃●①◣查看景点信息┃┫");
printf("\n┣┃●②◣查寻两景点之间的路径┃┫");
printf("\n┣┃︻┳═一●③◣退出系统┃┫");
printf("\n┻┻┻┻┻┻┻┻︷︷︷︷︷︷︷︷︷︷︷︷︷︷︷┻┻┻┻┻┻┻\n");
printf("\n\t\t你想选择?
请选择(1-3):
");
scanf("%d",&choice);
while(choice<1||choice>3)
printf("\n\t\t输入错误,重新选择(1-3):
switch(choice)
case1:
intro(G);break;
case2:
findallpath(G);break;
case3:
byebye();exit(0);break;
voidintro(adjlist*G)//景点信息
intk;//接收返回的数组下标值
printf("\n\t你想查看哪个景点的详细介绍呢?
请按照本校平面图输入--标号:
if((k=search(G,choice)+1))//判断是否存在此景点
printf("\n%d号景点:
\n\t%s--%s",choice,G->vertex[k-1].name,G->vertex[k-1].introduce);//k要-1,否则向后偏移一个景点
printf("\n\t(任意键返回主菜单)\n");getch();menu(G);exit(0);;
printf("\n\t不存在此景点!
(任意键返回主菜单)\n");getch();menu(G);exit(0);
intsearch(adjlist*G,ints)
inti;
for(i=0;iif(G->vertex[i].num==s)return(i);return(-1);//没有就返回-1}inty=0;voidfindallpath(adjlist*G){inti,j;//两景点编号Map();printf("\n你想查寻哪两个景点之间的路线呢?(-间隔)请按照本校平面图输入--标号:");scanf("%d-%d",&i,&j);if(0=j)//景点编号大于景点树木,必然不存在次景点{findallway(G,i,j);//所有路径printf("\n\t共有%d条路径!\n",y); y=0;//很重要,否则查询几次,她就一直叠加。 shortestway(G);//最短路径广度优先niceway(G);//最佳访问路径地界斯科拉算法initstack(s);//找完所有路径后,必须初始化栈,否则栈可能满而溢出initstack1(&z);//找完所有路径后,必须初始化栈,否则栈可能满而溢出}else{printf("不存在此景点或者起点和终点是同一点!!(任意键返回主菜单)");getch();menu(G);exit(0);}printf("\n\(任意键返回主菜单)");getch();menu(G);exit(0);}voidshortestway(adjlist*G){inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];max=min=z.elem[0].sum;for(i=1;i<=z.top;i++){if(min>=z.elem[i].sum){min=z.elem[i].sum;k=i;}if(max<=z.elem[i].sum){max=z.elem[i].sum;t=i;}}if(min==z.elem[0].sum)k=0;if(max==z.elem[0].sum)t=0;printf("\n\t最短路径为:%3d号路径,途径%2d个景点!!\n",z.elem[k].num,min);printf("\n\t最长路径为:%3d号路径,途径%2d个景点!!\n",z.elem[t].num,max);}voidniceway(adjlist*G){inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];max=min=z.elem[0].sumweight;for(i=1;i<=z.top;i++){if(min>z.elem[i].sumweight){min=z.elem[i].sumweight;k=i;}if(max{max=z.elem[i].sumweight;t=i;}}if(min==z.elem[0].sumweight)k=0;if(max==z.elem[0].sumweight)t=0;printf("\n\t最佳访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[k].num,min);printf("\n\t最差访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[t].num,max);}voidfindallway(adjlist*G,intm,intn)//两点之间的所有路径{inti,t,k;arcnode*p;pa_thrp;push(s,m);G->vertex[m-1].flag=1;if(m==n){rp.sumweight=k=calculate(G);rp.sum=s->top;rp.num=(y+1);push1(&z,rp);printf("路径%3d为(途径%2d个景点,长度为%3d):",y+1,s->top,k);for(i=0;i<=s->top;i++)printf("->%d",s->elem[i]);printf("\n");G->vertex[m-1].flag=1;y++;}elsefor(p=G->vertex[m-1].firstarc;p!=NULL;p=p->nextarc){t=p->num;if(G->vertex[t-1].flag==0)findallway(G,t,n);}G->vertex[s->elem[s->top]-1].flag=0;//两句顺序不可以调换pops(s);}intcalculate(adjlist*G){inti;intsum=0;for(i=0;i<=s->top;i++){findweight(&sum,G,search(G,s->elem[i]),i);}return(sum);}voidfindweight(int*sum,adjlist*G,intm,intn){arcnode*p;for(p=G->vertex[m].firstarc;p!=NULL;p=p->nextarc)if(p->num==s->elem[n+1]){*sum+=p->weight;break;}} voidbyebye(){system("cls");printf("\n\n\n\n");printf("\t\t /\~~~~~~~~~~~~~\ ▓ ^*^ ☆ $$ .☆\n");printf("\t\t ./ \~~~▓~ ~~~~\◆ 圣诞.快乐 * $◢◣$ *\n");printf("\t\t /^^\══════\.◆ * * * $◢★◣$ *\n");printf("\t\t ..▎[] ▎田 田▎|┃◆ . * $◢■■◣$ *\n");printf("\t\t &&▎ ▎ ▎'|'▎@ *$◢■■■◣$*\n");printf("\t\t#■■■■■■■■■■〓▄▃▂▁愿你圣诞快乐︸︸||︸︸\n\n\n\n");printf("制作人:崔斌\n");printf("================================================================================\n");printf("●☆☆Bye-Bye☆☆●\n");printf("\n");printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("\n");printf("\n");printf("☆☆☆☆☆☆☆☆☆☆☆\n");printf("\n");printf("★★★★★★★★★★★\n");print
if(G->vertex[i].num==s)
return(i);
return(-1);//没有就返回-1
inty=0;
voidfindallpath(adjlist*G)
inti,j;//两景点编号
printf("\n你想查寻哪两个景点之间的路线呢?
(-间隔)请按照本校平面图输入--标号:
scanf("%d-%d",&i,&j);
if(0
=j)//景点编号大于景点树木,必然不存在次景点
findallway(G,i,j);//所有路径
printf("\n\t共有%d条路径!
\n",y);
y=0;//很重要,否则查询几次,她就一直叠加。
shortestway(G);//最短路径广度优先
niceway(G);//最佳访问路径地界斯科拉算法
initstack(s);//找完所有路径后,必须初始化栈,否则栈可能满而溢出
initstack1(&z);//找完所有路径后,必须初始化栈,否则栈可能满而溢出
printf("不存在此景点或者起点和终点是同一点!
(任意键返回主菜单)");
getch();
exit(0);
printf("\n\(任意键返回主菜单)");
getch();menu(G);
voidshortestway(adjlist*G)
inti,max,min,k,t;//不可以直接intmax=min=z.elem[0];
max=min=z.elem[0].sum;
for(i=1;i<=z.top;i++)
if(min>=z.elem[i].sum)
min=z.elem[i].sum;
k=i;
if(max<=z.elem[i].sum)
max=z.elem[i].sum;
t=i;
if(min==z.elem[0].sum)
k=0;
if(max==z.elem[0].sum)
t=0;
printf("\n\t最短路径为:
%3d号路径,途径%2d个景点!
!
\n",z.elem[k].num,min);
printf("\n\t最长路径为:
\n",z.elem[t].num,max);
voidniceway(adjlist*G)
max=min=z.elem[0].sumweight;
if(min>z.elem[i].sumweight)
min=z.elem[i].sumweight;
if(max{max=z.elem[i].sumweight;t=i;}}if(min==z.elem[0].sumweight)k=0;if(max==z.elem[0].sumweight)t=0;printf("\n\t最佳访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[k].num,min);printf("\n\t最差访问路径为:%3d号路径,长度为:%2d米!!\n",z.elem[t].num,max);}voidfindallway(adjlist*G,intm,intn)//两点之间的所有路径{inti,t,k;arcnode*p;pa_thrp;push(s,m);G->vertex[m-1].flag=1;if(m==n){rp.sumweight=k=calculate(G);rp.sum=s->top;rp.num=(y+1);push1(&z,rp);printf("路径%3d为(途径%2d个景点,长度为%3d):",y+1,s->top,k);for(i=0;i<=s->top;i++)printf("->%d",s->elem[i]);printf("\n");G->vertex[m-1].flag=1;y++;}elsefor(p=G->vertex[m-1].firstarc;p!=NULL;p=p->nextarc){t=p->num;if(G->vertex[t-1].flag==0)findallway(G,t,n);}G->vertex[s->elem[s->top]-1].flag=0;//两句顺序不可以调换pops(s);}intcalculate(adjlist*G){inti;intsum=0;for(i=0;i<=s->top;i++){findweight(&sum,G,search(G,s->elem[i]),i);}return(sum);}voidfindweight(int*sum,adjlist*G,intm,intn){arcnode*p;for(p=G->vertex[m].firstarc;p!=NULL;p=p->nextarc)if(p->num==s->elem[n+1]){*sum+=p->weight;break;}} voidbyebye(){system("cls");printf("\n\n\n\n");printf("\t\t /\~~~~~~~~~~~~~\ ▓ ^*^ ☆ $$ .☆\n");printf("\t\t ./ \~~~▓~ ~~~~\◆ 圣诞.快乐 * $◢◣$ *\n");printf("\t\t /^^\══════\.◆ * * * $◢★◣$ *\n");printf("\t\t ..▎[] ▎田 田▎|┃◆ . * $◢■■◣$ *\n");printf("\t\t &&▎ ▎ ▎'|'▎@ *$◢■■■◣$*\n");printf("\t\t#■■■■■■■■■■〓▄▃▂▁愿你圣诞快乐︸︸||︸︸\n\n\n\n");printf("制作人:崔斌\n");printf("================================================================================\n");printf("●☆☆Bye-Bye☆☆●\n");printf("\n");printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("\n");printf("\n");printf("☆☆☆☆☆☆☆☆☆☆☆\n");printf("\n");printf("★★★★★★★★★★★\n");print
max=z.elem[i].sumweight;
if(min==z.elem[0].sumweight)
if(max==z.elem[0].sumweight)
printf("\n\t最佳访问路径为:
%3d号路径,长度为:
%2d米!
printf("\n\t最差访问路径为:
y++;
intcalculate(adjlist*G)
intsum=0;
findweight(&sum,G,search(G,s->elem[i]),i);
return(sum);
voidfindweight(int*sum,adjlist*G,intm,intn)
for(p=G->vertex[m].firstarc;p!
if(p->num==s->elem[n+1])
*sum+=p->weight;break;
voidbyebye()
system("cls");
printf("\n\n\n\n");
printf("\t\t /\~~~~~~~~~~~~~\ ▓ ^*^ ☆ $$ .☆\n");
printf("\t\t ./ \~~~▓~ ~~~~\◆ 圣诞.快乐 * $◢◣$ *\n");
printf("\t\t /^^\══════\.◆ * * * $◢★◣$ *\n");
printf("\t\t ..▎[] ▎田 田▎|┃◆ . * $◢■■◣$ *\n");
printf("\t\t &&▎ ▎ ▎'|'▎@ *$◢■■■◣$*\n");
printf("\t\t#■■■■■■■■■■〓▄▃▂▁愿你圣诞快乐︸︸||︸︸\n\n\n\n");
printf("制作人:
崔斌\n");
printf("================================================================================\n");
printf("●☆☆Bye-Bye☆☆●\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("☆☆☆☆☆☆☆☆☆☆☆\n");
printf("★★★★★★★★★★★\n");
print
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1