数据结构课程设计烟台大学.docx
- 文档编号:23589228
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:10
- 大小:97.95KB
数据结构课程设计烟台大学.docx
《数据结构课程设计烟台大学.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计烟台大学.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构课程设计烟台大学
烟台大学
数据结构课程设计报告
站点分布图
(二)
班级:
计123-2
姓名:
樊磊
学号:
201258503232
问题描述:
尽可能多的列出烟台的公交站点。
用图创建一个站点分布图,包括站点的增加、删除、从一点出发深度优先搜索所有的站点、从一点出发广度优先搜索所有的站点。
数据结构与算法的设计:
通过分析决定采用无向图结构,采用了深度优先遍历(DFS),广度优先遍历(BFS)等算法。
程序实现:
实现了深度优先输出所有站点,广度优先输出所有站点,增加站点,删除站点。
测试及分析:
源代码选摘:
//------邻接矩阵转化成邻接表------//
voidMatToList(MGraphg,ALGraph*&G)
{
inti,j;
ArcNode*p;
G=(ALGraph*)malloc(sizeof(ALGraph));
for(i=1;i<=g.n;i++)//给邻接表中所有头结点指针赋初值
{
G->adjlist[i].firstarc=NULL;
}
for(i=1;i<=g.n;i++)
{
for(j=g.n;j>=1;j--)
{
if(g.edges[i][j]!
=0)
{
p=(ArcNode*)malloc(sizeof(ArcNode));//创建一个节点*p
p->adjvex=j;//该边的终点号
p->nextarc=G->adjlist[i].firstarc;//采用头插法插入*p
G->adjlist[i].firstarc=p;
}
}
}
G->n=g.n;
G->e=g.e;
}
//------深度优先遍历-----//
intvisited[MAXV];
voidDFS(ALGraph*G,intv)//v表示顶点
{
ArcNode*p;
visited[v]=1;//置已访问标记
cout<<"输出访问顶点编号:
"< p=G->adjlist[v].firstarc; while(p! =NULL) { if(visited[p->adjvex]==0)//p->adjvex顶点未访问,递归访问它 { DFS(G,p->adjvex); } p=p->nextarc;//p指向顶点V的下一个邻接点 } } //------广度优先遍历-----//i既是他的顶点编号 voidBFS(ALGraph*G,intv) { ArcNode*p; intqueue[MAXV],front=0,rear=0;//定义循环队列并初始化队头队尾 intvisited[MAXV];//定义存放顶点的访问标志的数组 intw,i; for(i=0;i<=G->n;i++)//访问标志数组初始化 { visited[i]=0; } cout<<"被访问的顶点编号: "< visited[v]=1;//置已访问标记为1 rear=(rear+1)%MAXV; queue[rear]=v;//v进队 while(front! =rear)//若队列不为空时循环 { front=(front+1)%MAXV; w=queue[front];//出队并赋给W p=G->adjlist[w].firstarc;//找顶点W的第一个邻接点 while(p! =NULL) { if(visited[p->adjvex]==0)//若当前邻接顶点未被访问 { cout<<"被访问的顶点编号: "< visited[p->adjvex]=1;//置顶点已被访问的标志为1 rear=(rear+1)%MAXV;//该顶点进队 queue[rear]=p->adjvex; } p=p->nextarc;//找顶点W的下一个邻接点 } } cout< } //-------增加站点------// voidADD(MGraphg) { cout<<"增加1个站点数: "; intn=1; g.n=g.n+n; cout<<"请输入增加的站点边数: "; intm; cin>>m; g.e=g.e+m; inti,j; intp=0; while(p { cout<<"请输入所增加边的两个顶点: "< cout<<"请输入头: "; cin>>i; cout<<"请输入尾: "; cin>>j; g.edges[i][j]=1; g.edges[j][i]=1; p++; } outputLJJZ(g); MatToList(g,G); //-----深度优先遍历-----// for(intk=0;k<=G->n;k++)//初始化访问标记数组 { visited[k]=0; } intstart=0;//从哪开始遍历 cout<<"输入从哪个节点开始遍历: "; cin>>start; cout<<"执行深度优先遍历。 。 。 。 。 。 "< cout< DFS(G,start); cout< //-----广度优先遍历-----// cout<<"执行广度优先遍历。 。 。 。 。 。 "< cout< BFS(G,start); } //------删除站点------// voidDEL(MGraphg) { cout<<"删除1个站点数: "< //intn=1; //g.n=g.n-1; cout<<"请输入删除的站点: "; intm; cin>>m; intp=0; while(p<=g.n) { g.edges[m][p]=0; g.edges[p][m]=0; p++; } outputLJJZ(g); MatToList(g,G); //-----深度优先遍历-----// for(intk=0;k<=G->n;k++)//初始化访问标记数组 { visited[k]=0; } intstart=0;//从哪开始 cout<<"输入从哪个节点开始遍历: "; cin>>start; cout<<"执行深度优先遍历。 。 。 。 。 。 "< cout< DFS(G,start); cout< //-----广度优先遍历-----// cout<<"执行广度优先遍历。 。 。 。 。 。 "< cout< BFS(G,start); } 总结: 以前做实验题目的时候总是感觉很难,因为根本就不知道从哪里开始。 这次课程设计让我对编程有了新的认识。 拿到题目的时候也是很困惑,后来看了很多有关的例子,仔细看了书上的线性表部分的知识,觉得就是上课讲到的一些内容,不题目难,是自己先把自己吓住了。 后来,参照书上的和网上的诸多例子,一个模块一个模块的编写,调试,一个功能一个功能去完善。 发现越做越顺利,由于以前的实验中对于改错的经验积累和几个学得不错的同学的帮助,我的程序中的错误也一个一个的顺利解决。 其实,从这次实验中我认识到,我的差距还很大,编程有很多的乐趣也有很多的技巧性和知识性。 我将在以后的日子里继续认真的学习知识,积累经验,让自己的编程能力提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 烟台 大学