西安邮电大学数据结构校园导游系统课程设计报告.docx

上传人:b****5 文档编号:11759988 上传时间:2023-03-31 格式:DOCX 页数:34 大小:318.22KB
下载 相关 举报
西安邮电大学数据结构校园导游系统课程设计报告.docx_第1页
第1页 / 共34页
西安邮电大学数据结构校园导游系统课程设计报告.docx_第2页
第2页 / 共34页
西安邮电大学数据结构校园导游系统课程设计报告.docx_第3页
第3页 / 共34页
西安邮电大学数据结构校园导游系统课程设计报告.docx_第4页
第4页 / 共34页
西安邮电大学数据结构校园导游系统课程设计报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

西安邮电大学数据结构校园导游系统课程设计报告.docx

《西安邮电大学数据结构校园导游系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《西安邮电大学数据结构校园导游系统课程设计报告.docx(34页珍藏版)》请在冰豆网上搜索。

西安邮电大学数据结构校园导游系统课程设计报告.docx

西安邮电大学数据结构校园导游系统课程设计报告

 

西安郵電大學

数据结构课程设计报告书

 

系部名称

计算机学院

学生姓名

崔斌

专业名称

计算机科学与技术专业

班级

计科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");

G->vertex[m-1].flag=1;

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;

编号

名称

简介

邻接点个数

Flag

firstarc

五、详细设计及运行结果

六、调试情况,设计技巧及体会(重点)

1、测试数据

包括合法与非法的测试数据、预期结构和实测结果(最好用表格列出)

读文件后本应为:

1超市同学们购物的天堂!

20

2100

3150

2宿舍楼同学们就寝,玩游戏的宝地。

20

1100

530

3体育馆锻炼身体,高校的体育交流之地。

20

1150

670

4旭日苑就餐之地1.30

590

6300

7120

5网吧锻炼大脑,手指灵活性的地方。

30

230

490

7120

6图书馆书的海洋。

30

370

4300

840

7美广就餐之地2.30

4120

520

10110

8大活娱乐晚会举办地。

30

640

930

12200

9喷泉哈哈,你懂得!

30

830

1070

1340

10实验楼下一个产生钱学森的圣地!

30

7110

970

1130

11教学楼园丁与花朵!

20

1030

13100

12行政楼学校领导办公之地。

20

8200

1390

13北门学校的正门。

20

11100

1290

但确只有:

(每个邻接点的邻接点都少一个)

1超市同学们购物的天堂!

20

2100

2宿舍楼同学们就寝,玩游戏的宝地。

20

1100

3体育馆锻炼身体,高校的体育交流之地。

20

1150

4旭日苑就餐之地1.30

590

6300

5网吧锻炼大脑,手指灵活性的地方。

30

230

490

6图书馆书的海洋。

30

370

4300

7美广就餐之地2.30

4120

520

8大活娱乐晚会举办地。

30

640

930

9喷泉哈哈,你懂得!

30

830

1070

10实验楼下一个产生钱学森的圣地!

30

7110

970

11教学楼园丁与花朵!

20

1030

12行政楼学校领导办公之地。

20

8200

13北门学校的正门。

20

11100

非法数据:

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;i

if(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++;

}

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);

}

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

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

当前位置:首页 > 工程科技 > 电子电路

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

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