实习报告题目:图遍历的演示编译环境: Microsoft Visual Studio 2010 功能实现:以邻接表为存储结构,演示在连通无向图上访冋全部节点的操作; 实现连通无向图的深度优先遍历和广度优先遍历;建立深度优先生成树和广度优先生成树,按凹入表或树形打印生成树。
1.以邻接表为存储结构,演示在连通无向图上访问全部节点的操作。
该无向图为一个交通网络,共25个节点,30条边,遍历时需要以用户指定的节点为起点, 建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。
2.程序的测试数据:graph.txt 文件所表示的无向交通图。
//边表结点//邻接点域,即邻接点在顶点表中的下标//顶点表结点 //数据域struct TNode // 树结点{stri ng data;struct TNode *fristchild, * nextchild; };2.邻接表类设计:class GraphTraverse{public:需求分析二、概要设计1.主要数据结构设计:struct ArcNode{int vex In dex; ArcNode* n ext;};struct VertexNode {stri ng vertex; ArcNode* firstArc; };三、详细设计1. 主要操作函数的实现:(1) 建立深度优先生成树函数:TNode* GraphTraverse::DFSForest(i nt v){int i,j;TNode *p,*q,*DT; j=v;for(i=O;i<vertexNumberber;i++) {Visited[i]=0;}for(i=0;i<vertexNumberber;i++) {if(Visited[(i+j)%vertexNumberber]==0) {p=new TNode; p->data=VexList[(i+j)%vertexNumberber].vertex; p->fristchild=NULL; p-> nextchild=NULL; DT=p; q=p;DFSTree(((i+j)%vertexNumberber),p); } }return DT; }(2) 深度优先遍历图函数:VertexNode VexList[MaxSize]; int vertexNumberber; int arcNumberber; bool HasCreated;void ReadFile();void DisplayGraph(); TNode* DFSForest(i nt);void DFSTree(i nt, TNode*); TNode* BFSForest(i nt); void BFSTree(i nt, TNode*); void Prin tTree(TNode*, i nt); };//顶点表数组 //图的顶点数 //图的边数//图是否创建//从文件读取数据,并建立该图 //以邻接表显示图 //建立深度优先生成树 //深度优先遍历图 //建立广度优先生成树 //广度优先遍历图//按照凹入表方式打印树void GraphTraverse::DFSTree( in tv, TNode* DT){int j=0;int i=0;TNode *p,*q;int first=1;Visited[v]=1;for(ArcNode *m=VexList[v].firstArc;m;m=m->n ext) { j=m->vex In dex;if(Visited[j]==0){p=new TNode; p->data=VexList[j].vertex;p->fristchild=NULL;p-> nextchild=NULL;if(first){DT->fristchild=p; first=0;} else q->n extchild=p;q=p;DFSTree(j,q);}}}(3) 建立广度优先生成树函数:TNode* GraphTraverse::BFSForest(i nt v) {int i,j;TNode *p,*q,*BT;BT=NULL;j=v;for(i=0;i<vertexNumberber;i++){Visited[i]=0;} for(i=0;i<vertexNumberber;i++)if(Visited[(i+j)%vertexNumberber]==0) {p=new TNode;{p->data=VexList[(i+j)%vertexNumberber].vertex;p->fristchild=NULL;p-> nextchild=NULL;BT=p;q=p;BFSTree(((i+j)%vertexNumberber),p);}}return BT;}(4) 广度优先遍历图函数:void GraphTraverse::BFSTree(i nt v,TNode*BT) {int fron t=-1;int rear=-1;int j=0;int a,b;int first=1;a=b=0;TNode *m, * n, *r, *cur[MaxSize];r=BT;ArcNode *p;Visited[v]=1;Query[++rear]=v;while(fro nt!=rear){first=1;v=Query[++fr on t];for(p=VexList[v].firstArc;p;p=p->n ext){j=p->vex In dex;if(Visited[j]==0){m=new TNode;m->data=VexList[j].vertex; m->fristchild=NULL;m-> nextchild=NULL;Visited[j]=1;Query[++rear]=j;if(first)r->fristchild=m; first=0;{elsen->n extchild=m; cur[a++]=m; n=m;}} r=cur[b++];}}(5) 打印函数:按照凹入表方式打印树。
void GraphTraverse::Pri ntTree(TNode *T,i nt i){int j;TNode *p; cout«e nds;for(j=1;jv=i;j++){cout«e nds«e nds;}cout<<T->data<<e ndl;for(p=T->fristchild;p;p=p->n extchild) Prin tTree(p,i+1);}2. 主函数的实现:void mai n(){stri ng s1;int flag;TNode *DT,*BT;GraphTraverse graph net;stri ng beg in;int i;flag=atoi(s1.c_str());while(flag>5||flag<1){coutvv"输入错误,请重新输入!"<<endl;cout«endlvv"请输入操作序号:"; cin> >s1;flag=atoi(s1.c_str());} _while(flag!=5)switch(flag){{{case 1:graph net.ReadFile(); break; case 2:graph net.DisplayGraph(); break; case 3:coutvv"请输入遍历起点:"; cin> >beg in;for(i=0;i<graph net.vertexNumberber;i++){if(graph net.VexList[i].vertex==begi n)break; }if(i==graph net.vertexNumberber) {cout«"输入的起点不存在! "<<endl; break; } else {DT=graph net.DFSForest(i);coutvv"深度优先遍历结果如下(凹入表): graph net.Pri ntTree(DT,0); break;} case 4:coutvv"请输入遍历起点:";cin> >beg in;for(i=0;i<graph net.vertexNumberber;i++) {if(graph net.VexList[i].vertex==begi n)break; }if(i==graph net.vertexNumberber) {coutvv"输入的起点不存在! "<<endl; break; } elseBT=graph net.BFSForest(i);coutvv"广度优先遍历结果如下(凹入表):"vve ndl;"vve ndl;graph net.Pri ntTree(BT,O); break;}flag=atoi(s1.c_str());while(flag>5||flag<1){coutvv"输入错误,请重新输入!"<<endl;cout«endlvv"请输入操作序号:"; cin> >s1;flag=atoi(s1.c_str());} _}}四、用户手册1. 本程序的执行文件为:GraphTraverse.exe2. 进入程序的用户界面,并根据程序提示,输入文件名及其路径,读取文件中的数据:* 图堀历演示*-1.读取文件2.显示当前图3-探麹免遍房4.广度优先遍历5.退岀-请输入操作序号:1\CodeSpace\GraphT pau e rs e \g paph-txt :1:读取文件2:显示当前图3:探IWtl 4:广度优先遍历5:退岀:3. 显示当前图:1:读取文件2=显示当前图3= 4:广度优先遍历5:退岀:巒紹n创北存天肄>1<徐州-嘲中徐州-〉天津£>->徐旷南训南昌-〉上海g株洲->广州株洲->南昌株洲->武汉足I-I-I珂M 匚_______________丄」匸_ ■- —H 赫粪鈣如长春H贵阳-〉昆明贵阳成都柳州-〉贵阳柳州-〉南宁L■历演示4.输入遍历起点,进行深度优先遍历(或者广度优先遍历)五、测试结果程序的主要测试结果如下: 1.读取文件,并显示当前图:1:读取文件2=显示当前图3:探1 勰翳4:广度优先遍历氐退岀:1:读取文件2:显示当前图3:深4:广度优先遍历5=退岀:请输入操作序号:1英算入文籠名-E- MCodeSpace ^jGi^aphTi^auerse Xarraph-txt春阳刑长沈兰兰春Afl->->明2霉Lc>>j一-津刃Rr畫->->=>->2接津州嘗上南ff7->:2^肄阳^^3-->莎7衣.^=->>>>>>>>>>>>>>>J-J口&早>>>>>>>曬京津州窖常宀阳连明坦丁州->->宁洲州西株郑|'|->州谢广->TT->特洲州宀贏忙株郑西路乎^^京州阳->D->->->->->「兰木2.输入遍历起点,进行深度优先遍历:1:徴取交件2:显示当前图3-跺厲輕霸乩广度优先遍历「退出:1:诵取文件2:显示当前图4躁!I 勰霸4:广度优先遍历G 退出: 倩输入操作序号*3. 输入遍历起点,进行广度优先遍历:京下匕Q 3 J J S A :果 号点结哇冃--iL 冃深d 齐 木 特昌hHH 蛊 $- 杀呼 J Z 4Z 宁圳卅 洲柳广南 阳株 明贵 都昆 * ■1:读取文件显示当前圉轧深融盂齬4:广度优先遍历久退出:六、附录源程序文件清单:GraphTraverse.hGraphTraverse.cppGraphMa in. cpp 涼QT 4TT 女 :果 号占结 序起历 作历遍 f i 和.三ip ; I ; ■ ! 羸乌西宀盘 州上 州西 徐 »b i 关 【宁圳 一 哪漏探 洲柳广 武 一 昊长 f c r r L I L 天〃邻接表类以及主要数据结构的声明 〃邻接表类成员函数的实现。