4.总结
通过这次数据结构课程设计,我对《数据结构》这门课程有了更深一步的了解,使我对《数据结构》这门课程掌握以及运用更加灵活。同时也让我发现了自己在这门课上的不足与缺陷,同时也明确了自己在以后的类似课程中的具体学习方法。
这次在应用中,我发现了自己的很多不足,在编写城市交通咨询系统的过程中,自己C语言方面的只是掌握太少,很多功能需求只能退而求其次,一次又一次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。如此次对于邻接矩阵的存储于读取,以及最短路径算法的实现,两个及其重要的算法,狄克斯特拉算法和佛洛依德算法,在具体的应用上还是有很多不足。
通过此次课程设计,我也明白了对于一个完成的程序而言,想要完成它最重要的代码,最初,也是最为重要的一个部分就是算法思想,以及具体程序功能规划,只有最重要的地基部分完美实现,才可以进行接下来的具体代码编程,以及更多细节上的完美。
通过这次的课程设计我有懂得了好多数据结构的知识,以前上课没有听的,不知道的,这次都有所了解了,像有向图的构建,弗洛伊德算法,迪克斯特拉算法。这些知识从曾经的听说到现在的了解,进了一大步。不但如此,这次的课设也是我感觉到了数据结构的强大与神奇。渐渐的爱上他了。不仅让我了解了数据结构更加深了对它与C语言的联系的理解。
因为自己的不学习,导致这次的课设变得如此的艰难。且因为自己生病住院也更是浪费了很大的时间,对于我自己做课程设计的时间就少的可怜,这也无疑是对我更大的挑战。在临近答辩,我的代码才基本完成,夜以继日的努力也终于是让我完成
5.致谢
本次课程设计我遇到了极大的问题,不管是时间方面还是内容方面,自己都显得慌乱过,我能够完成本次课程设计也完全感谢舍友的支持与帮助,在难点上能够对我进行帮助。尤其感谢我的知道老师张老师。感谢她在百忙之中抽出时间
来为我解答疑惑,解决问题,她对我此次的课程设计有极大的帮助。再次感谢张老师。课程设计马上结束,同时也谢谢所有的负责老师,谢谢她们这几天对我们的付出,老师辛苦了。
6.附录
#include
#define MVNum 100//最大顶点数 #define Maxint 32767 enum boolean{FALSE,TRUE}; typedef char VertexType; typedef int Adjmatrix; typedef struct{
VertexType vexs[MVNum];//顶点数组,类型假定为char
Adjmatrix arcs[MVNum][MVNum];//邻接矩阵,类型假定为int型 }MGraph;
int D1[MVNum],P1[MVNum];
int D[MVNum][MVNum],P[MVNum][MVNum]; /*建立有向图的储存结构*/
void CreateMGraph(MGraph * G,int n,int e)
{//采用邻接矩阵表示法构造有向图G,n、e表示图的当前顶点数和边数 int i,j,k,w;
for(i=1;i<=n;i++)//输入顶点信息 G->vexs[i]=(char)i; for(i=1;i<=n;i++) for(j=1;j<=n;j++)
G->arcs[i][j]=Maxint;//初始化邻接矩阵
printf(\ === 输入%d条边人(i起点)、(j终点)及w(路径长度):\\n\ for(k=1;k<=e;k++)//读入e条边,建立邻接矩阵 { printf(\ ===\ scanf(\
G->arcs[i][j]=w;
}
printf(\ === 有向图人存储结构建立完毕! ===\\n\ }
/*迪杰斯特拉算法*/
void Dijkstra(MGraph *G,int v1,int n)
{//利用迪杰斯特拉算法,求出有向图G的v1顶点到其他顶点v 的最短路径P[v]及权D[v] int D2[MVNum],P2[MVNum]; int v,i,w,min;
enum boolean S[MVNum]; for(v=1;v<=n;v++)//初始化S和D {
S[v]=FALSE;//置空最短路径终点集 D2[v]=G->arcs[v1][v];//置初始的最短路径值 if(D2[v] P2[v]=v1;//v1是v的前趋(双亲) else P2[v]=0;//v无前趋(双亲) } D2[v1]=0;S[v1]=TRUE;//S集初始时只有源点,距离为0 for(i=2;i min=Maxint; for(w=1;w<=n;w++) if(!S[w] && D2[w] { v=w;min=D2[w]; }//w顶点离v1顶点更近 S[v]=TRUE; for(w=1;w<=n;w++)//更新当前最短路径及距离 if(!S[w]&&(D2[v]+G->arcs[v][w] printf(\ === 路径长度,路径 ===\\n\ for(i=1;i<=n;i++) { printf(\ === ]\ printf(\ while(v!=0) {printf(\-%d\ v=P2[v];} printf(\ } } /*费洛伊德算法*/ void Floyd(MGraph *G,int n) {//利用费洛伊德算法,求出最短路径 int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(G->arcs[i][j]!=Maxint) P[i][j]=j; else P[i][j]=0; D[i][j]=G->arcs[i][j]; } for(k=1;k<=n;k++) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(D[i][k]+D[k][j] D[i][j]=D[i][k]+D[k][j]; P[i][j]=P[i][k]; } } } } void main() { printf(\ ***********欢迎使用城市交通咨询系统**********\\n\ printf(\ printf(\ =============================================\\n\ MGraph *G; int n,e,v,w,k; int xz=1; G=(MGraph *)malloc(sizeof(MGraph)); printf(\ === 输入城市个数和路径个数n,e: \ scanf(\ CreateMGraph(G,n,e);//建立图的存储结构 while(xz!=0) { printf(\ **************求城市之间的最短距离*************\\n\ printf(\ ===============================================\\n\ printf(\ =======1.求一个城市到所有城市的最短距离========\\n\ printf(\ =======2.求任意的两个城市之间的最短距离========\\n\ printf(\ ===============================================\\n\ printf(\ printf(\ printf(\ ======请选择:1或2,选择0 退出: \ scanf(\ %d\ if(xz==2) { Floyd(G,n);////调用费洛伊德算法 printf(\ =============================================\\n\ printf(\ =======输入源点和终点:v,w: \ scanf(\ k=P[v][w]; if(k==0) printf(\ =====顶点 %d 到 %d 无路径!==================\\n\ else { printf(\ =====从顶点 %d 到 %d 最短路径是 %d \ while(k!=w) { printf(\->%d\ k=P[k][w];//k为v的后继顶点 } printf(\->%d\\n\输出后继顶点 printf(\ ======路径长度:%d ===\\n\ } } else if(xz==1) { printf(\ ===============求单源路径,输入源点v: \ scanf(\ Dijkstra(G,v,n);//调用迪杰斯特拉算法 } } printf(\ ***************结束求最短路径,再见*****************\\n\ }
相关推荐: