哈工大数据结构图建立与遍历.docx
- 文档编号:12142727
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:18
- 大小:208.22KB
哈工大数据结构图建立与遍历.docx
《哈工大数据结构图建立与遍历.docx》由会员分享,可在线阅读,更多相关《哈工大数据结构图建立与遍历.docx(18页珍藏版)》请在冰豆网上搜索。
哈工大数据结构图建立与遍历
哈尔滨工业大学计算机科学与技术学院
实验报告
课程名称:
数据结构与算法
课程类型:
必修
实验项目名称:
图的建立与遍历
实验题目:
图的建立与遍历
设计成绩
报告成绩
指导老师
一、实验目的
1.学会用邻接表、邻接矩阵构建有向图和无向图
2.加深对深度优先搜索和广度优先搜索的理解,并能够在邻接表和邻接矩阵上进行深度优先和广度优遍历。
二、实验要求及实验环境
(1)能够建立(有向和无向)图的邻接矩阵和邻接表存储结构
(2)能够在邻接矩阵和邻接表存储结构上对(有向和无向)图进行深度优先(递归和非递归都要求)和广度优先搜索
(3)能够存储和显示相应的搜索结果(深度优先或广度优先生成森林(或生成树)、深度优先或广度优先序列和编号)
(4)以文件形式输入图的顶点和边,并显示相应的结果。
要求顶点不少于10个,边不少于13个
本程序在win7下codeblock上运行
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)
1.逻辑设计
定义图邻接矩阵的结构体:
typedefstruct{
charvertex[NumVertices];//顶点向量
intedge[NumVertices][NumVertices];//邻接矩阵
intn,e;//图当前的顶点数,边数
}MTGraph;
定义邻接表的结构体:
typedefstructnode{
intadjvex;//弧所指向的顶点位置
intcost;//权值
structnode*next;//指向下一条弧的指针
}EdgeNode;
typedefstruct{
charvertex;//顶点信息
EdgeNode*firstedge;//指向第一条依附于该顶点的弧的指针
}VertexNode;
typedefstruct{
VertexNodevexlist[NumVertices];
intn,e;//顶点数弧数
}AdjGraph;
2.物理设计
程序模块的调用:
四、测试结果
TXT截图
五、系统不足与经验体会
系统不足:
无法实现以文件形式输入由邻接表构建的图。
没有实现递归形式的广度优先搜索。
图中的每个顶点元素只能保存一个字符信息,无法对顶点添加更多的信息。
经验体会:
熟练地使用的邻接矩阵法对图进行构建。
加深了对图搜索遍历操作的应用,进一步理解了几种搜索遍历。
写代码时,因为设置了很多的变量很多的符号,经常一时间不知道应该是用哪一个变量,只得慢慢看下去,所以后来在每设置一个变量时候都给他添加上备注,方便之后查找使用。
六、附录:
源代码(带注释)
#include
#include
#include
#include
#include
usingnamespacestd;
#defineNumVertices20
#definemaxlength20
typedefstruct{
charvertex[NumVertices];//顶点向量
intedge[NumVertices][NumVertices];//邻接矩阵
intn,e;//图当前的顶点数,边数
}MTGraph;
//用邻接矩阵建立无向图
voidCreateMGraph1(MTGraph*G)
{
inti,j,k,w;
for(i=0;i
for(j=0;j
G->edge[i][j]=0;
ifstreamin("D:
\\graph.txt");
if(!
in)
cout<<"failtoopenthefile"< in>>G->n>>G->e;//顶点数和边数 for(i=0;i { in>>G->vertex[i];//顶点向量 } for(i=0;i { intk,j; in>>k>>j;//相邻的顶点对应的矩阵点为1 G->edge[k][j]=1; G->edge[j][k]=1; } in.close(); } //用邻接矩阵建立有向图 voidCreateMGraph2(MTGraph*G) { inti,j,k,w; cin>>G->n>>G->e;//顶点数和边数 for(i=0;i for(j=0;j G->edge[i][j]=0;//初始化邻接矩阵 for(k=0;k cin>>i>>j>>w; G->edge[i][j]=w; } typedefstructnode{ intadjvex;//弧所指向的顶点位置 intcost;//权值 structnode*next;//指向下一条弧的指针 }EdgeNode; typedefstruct{ charvertex;//顶点信息 EdgeNode*firstedge;//指向第一条依附于该顶点的弧的指针 }VertexNode; typedefstruct{ VertexNodevexlist[NumVertices]; intn,e;//顶点数弧数 }AdjGraph; //用邻接表建立无向图 voidCreateGraph1(AdjGraphG) { inti,tail,head,weight; cin>>G.n>>G.e; for(i=0;i { cin>>G.vexlist[i].vertex;//输入顶点信息 G.vexlist[i].firstedge=NULL;//初始化指针 } for(i=0;i { cin>>tail>>head>>weight;//输入顶点起始点,终点权值 EdgeNode*p=newEdgeNode; p->adjvex=head; p->cost=weight; p->next=G.vexlist[tail].firstedge; G.vexlist[tail].firstedge=p; p=newEdgeNode; p->adjvex=tail; p->cost=weight; p->next=G.vexlist[head].firstedge; G.vexlist[head].firstedge=p; } } //用邻接表建立有向图 voidCreateGraph2(AdjGraphG) { inti,tail,head,weight; cin>>G.n>>G.e; for(i=0;i { cin>>G.vexlist[i].vertex; G.vexlist[i].firstedge=NULL; } for(i=0;i { cin>>tail>>head>>weight; EdgeNode*p=newEdgeNode; p->adjvex=head; p->cost=weight; p->next=G.vexlist[tail].firstedge; G.vexlist[tail].firstedge=p; } } //栈的建立和入栈、出栈函数 structQUEUE{ inttop; intelements[NumVertices]; }; voidMAKENULL(QUEUE&S) { S.top=-1; } intEmpty(QUEUES) { if(S.top==-1) return1; else return0; } intDEQUEUE(QUEUES) { if(Empty(S)) return0; else S.top=S.top-1; return(S.elements[S.top+1]); } voidENQUEUE(intx,QUEUE&S) { if(S.top==99) cout<<"stackisfull"; else { S.top=S.top+1; S.elements[S.top]=x; } } intvisited[NumVertices]; intdfn[NumVertices]; intdfn1[NumVertices]; intdfn2[NumVertices]; intdfn3[NumVertices]; intcount; voidPrintf1(intFn[],MTGraph*G) { cout<<"顶点的编号: "; for(inti=0;i cout< cout< } voidPrintf2(intFn[],AdjGraph*G) { cout<<"顶点的编号: "; for(inti=0;i cout< cout< } //邻接表深度优先遍历 voidDFS1(AdjGraph*G,inti) { EdgeNode*p; cout< visited[i]=1; dfn1[i]=count++; p=G->vexlist[i].firstedge; while(p){ if(! visited[p->adjvex]) DFS1(G,p->adjvex); p=p->next; } } voidDFSTraverse1(AdjGraph*G) { inti,count=1; for(i=0;i visited[i]=0; for(i=0;i if(! visited[i]) { DFS1(G,i); } Printf2(dfn1,G); } //邻接矩阵递归深度优先遍历 voidDFSM(MTGraph*G,inti) { intj; cout< visited[i]=1; dfn2[count++]=i; for(j=0;j if(G->edge[i][j]==1&&! visited[j]) DFSM(G,j); } voidDFS1(MTGraph*G) { inti; count=0; for(i=0;i visited[i]=0;// for(i=0;i if(! visited[i]) DFSM(G,i); cout< Printf1(dfn2,G); } //邻接矩阵非递归深度优先遍历 voidDFSNonrecur(MTGraph*G,intindex) { inti; stack cout< visited[index]=1; dfn3[count++]=index; s.push(index); while(! s.empty()) { for(i=0;i { if((G->edge[i][index]==1)&&(visited[i]==0)) { index=i; cout< visited[index]=1; dfn3[count++]=index; s.push(index); break; } } if((i==G->n)&&(! s.empty())) { s.pop(); if(! s.empty()) { index=s.top(); } } } } voidDFS2(MTGraph*G) { inti; count=0; for(i=0;i visited[i]=0; for(i=0;i if(! visited[i]) DFSNonrecur(G,i); cout< Printf1(dfn3,G); } //邻接矩阵广度优先遍历 voidBFS1(MTGraph*G,intk) { inti; queue cout< visited[k]=1; dfn[count++]=k; Q.push(k); while(! Q.empty()) { i=Q.front(); Q.pop(); for(intj=0;j { if((G->edge[i][j]==1)&&(visited[j]==0)) { cout< visited[j]=1; dfn[count++]=j; Q.push(j); } } } } voidBFSTraverse1(MTGraph*G) { inti; count=0; for(i=0;i visited[i]=0; for(i=0;i if(! visited[i]) BFS1(G,i); cout< Printf1(dfn,G); } //邻接表广度优先遍历 voidBFS2(AdjGraph*G,intk) { inti; EdgeNode*p; QUEUEQ; MAKENULL(Q); cout< visited[k]=1; ENQUEUE(k,Q);//进队列; while(! Empty(Q)){ i=DEQUEUE(Q);//v1出队列; p=G->vexlist[i].firstedge; while(p){ if(! visited[p->adjvex]){ cout< visited[p->adjvex]=1; ENQUEUE(p->adjvex,Q); } p=p->next; } } } voidBFSTraverse2(AdjGraph*G) { inti,count=0; for(i=0;i visited[i]=0; for(i=0;i if(! visited[i]) BFS2(G,i); } intmain() { MTGraph*G; G=newMTGraph; CreateMGraph1(G);//此处只调用了无向图邻接矩阵构建 cout<<"递归深度优先遍历为: "< DFS1(G); cout<<"非递归深度优先遍历为: "< DFS2(G); cout<<"非递归广度优先遍历为: "< BFSTraverse1(G); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 数据 结构图 建立 遍历