图形数据结构实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ArcNode *p; cout<<"创建一个无向图:"<<endl; cout<<"顶点数:"; cin>>G.vexnum;cout<<endl; cout<<"边数:"; cin>>G.arcnum; cout<<endl; for(i=0;i<G.vexnum;i++) { G.vertices[i].data=i; G.vertices[i].firstarc=NULL; } for(k=0;k<G.arcnum;k++) { cout<<"请输入第"<<k+1<<"条边:"; cin>>i>>j; p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j; p->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p; } } void Disp(ALGraph G) { int i,j; ArcNode *p; cout<<"输出图为:"<<endl; for(i=0;i<G.vexnum;i++) { p=G.vertices[i].firstarc; j=0; while(p!=NULL) { cout<<"("<<i<<","<<p->adjvex<<")"; p=p->nextarc; j=1; } if(j==1) cout<<endl;
例2 有向图
3 实验步骤与源程序 #include <iostream.h> #include <stdio.h> #include <stdlib.h> #define INFINITY 0 #define MAX_VERTEX_NUM 20 //最大顶点数 typedef enum {DG,DN,UDG,UDN}Graphkind; #define MAX_EDGE_NUM 40 //最大边数 #define True 1; #define False 0; int visited[ MAX_VERTEX_NUM]; typedef int VertexType ArcNode ; //顶点数据类型
2 实验内容或题目
题目: 一、图形数据结构实验——图的建立与遍历。 内容: 1) 使用邻接矩阵和邻接表储表示分别实现如下给定的图1和或图2所示图的物理存 储结构。 2) 在1)所建立的图形存储结构上分别实现深度优先搜索遍历和广度优先搜索遍 历,并给出遍历结果(序列)。 图1 无向图
V1 V2 V4 V5 V3 V7 V6 V8 V1 V2 V4 V5 V3 V7 V6 V8
{ int i; for(i=0;i<MG.vexnum;i++) if(MG.vexs[i]==v1) return i; return -1; } int CreatUDN(MGraph &MG) // 采用数组表示法,构造有向向网 G { VertexType v1,v2; int j; cout<<"利用邻接矩阵创建有向网:"<<endl; cout<<"输入图的顶点数:"; cin>>MG.vexnum; cout<<"输入图的弧数:"; cin>>MG.arcnum; cout<<"请依次输入顶点向量"<<endl; for(int i=0;i<MG.vexnum;i++) { cin>>MG.vexs[i]; } for(i=0;i<MG.vexnum;i++) for(j=0;j<MG.vexnum;j++) { MG.arcs[i][j].adj=INFINITY; } cout<<"输入边依附的两个顶点"<<endl; for(int k=0;k<MG.arcnum;++k) //构造邻接矩阵 { cin>>v1>>v2; i=LocateVex(MG,v1); j=LocateVex(MG,v2); MG.arcs[i][j].adj=1; MG.arcs[j][i].adj=MG.arcs[i][j].adj; }
} } void dfs(ALGraph G,int { ArcNode *p; cout<<v<<" "; visited[v]=1; p=G.vertices[v].firstarc; while(p!=NULL) { if(!visited[p->adjvex]) dfs(G,p->adjvex); p=p->nextarc; } } void dfs1(ALGraph G) { int i; for(i=0;i<G.vexnum;i++) if(visited[i]==0) dfs(G,i); } typedef struct ArcCell { int adj; //无权图,1或0表示相邻否;带权图则是权值。 //int *info; }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数。 Graphkind kind; }MGraph; int LocateVex(MGraph MG,VertexType v1) v) //深度优先遍历
case(1): ALGraph G; CreateDG(G); Disp( G) ; int v; cout<<"选择:1.深度优先遍历,2.广度优先遍历."<<endl; int n; found1:cout<<"输入n:"; cin>>n; switch(n) { case(1): cout<<"输入顶点:"; cin>>v; cout<<"深度优先序列:"; Disp(G); dfs1(G); goto found; case(2): break; } goto found; break; case(2): MGraph MG; CreatUDN(MG); dispMGraph(MG); cout<<"选择:1.深度优先遍历,2.广度优先遍历."<<endl; int b; cout<<"输入b:"; cin>>b; switch(b) {
return 1; } void dispMGraph(MGraph MG) { cout<<"图的邻接矩阵图是:"<<endl; for(int i=0;i<MG.vexnum;i++) { for(int j=0;j<MG.vexnum;j++) cout<<" "<<MG.arcs[i][j].adj; cout<<endl; } } void DepthFirstSearch(MGraph MG,int v) { int vj; visited[v]=True; int n= MAX_VERTEX_NUM ; for(vj=0;vj<n;vj++) if(!visited[vj]&&MG.arcs[v][vj].adj==-1) DepthFirstSearch( MG, v); } void main() { int i; printf("\n\n---------------------------------------------------------------------------\n\n"); printf("* * * *欢迎使用本程序!本程序将用深度搜索和广度搜索进 行无向图的遍历。* * * *\n\n"); printf("---------------------------------------------------------------------------\n"); found: cout<<"请选择:1:邻接表。2:邻接矩阵。3:结束操作" <<endl; cout<<"请输入:i="; cin>>i; switch(i) {
typedef struct { int adjvex; int weight; struct ArcNode }ArcNode;
*nextarc;
typedef struct VNode { VertexType data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum,arcnum; int kind; }ALGraph; void { int CreateDG(ALGraph i,j,k; &G)
2):利用邻接表创建wk.baidu.com向网:
3)广度优先遍历:
4)利用邻接矩阵创建有向图:
5)深度优先遍历:
6)结束操作:
5 结果分析与实验体会 这道题真是太难了,我足足做了两个星期,头都做晕了。回想一下,主 要是理解不了,这就给组合上增加了困难,每当加入一项操作,需要考 虑的东西真是太多了,就比方说深度遍历有向图与无向图的区别是什 么,广度遍历邻接表与邻接矩阵的具体操作,再如何使用语句将其整 合,一个又一个难点,不得不突破。总体感觉上,这次试验最难。 虽然如此,但无论何事都有其两面性,就像这次试验,花了时间,耗 费了精力,可我知道了自己的弱点再何处,以后努力的方向是什么,这 才是实验的真正的价值意义。说到底,做完了,心情还是蛮好的,毕 竟,有了这么一次难得的体验,没有浪费,挺欣慰,希望以后也能够这 样,努力着,拼搏着,想着未来,无论是什么坎坷,终将好好到达,我 相信!
case(1): cout<<"深度优先序列:"; DepthFirstSearch( MG, v); goto found; case(2): break; } goto found; break; case 3: printf("\n\n\n\n"); printf("---------------------------------\n\n"); printf("* * * *谢谢使用!欢迎指正!* * * *\n\n"); printf("---------------------------------\n\n"); printf("作者:徐洪卫 学号:110831205 时间: 2009.11.21\n"); printf("\n\n\n\n"); break; } } 4 测试数据与实验结果(可以抓图粘贴) 1):初始界面:
淮海工学院计算机科学系 实验报告书
课 程 名 : 《数据结构》 题 目: 图形数据结构实验 班 级: 学 号: 姓 名:
评语:
软件082 110831205 徐洪卫
成绩:
指导教师: 批阅时间: 年 月 日
图形数据结构实验报告要求
1目的与要求:
1)掌握图的邻接矩阵、邻接表、十字链表、邻接多重链表存储结构表示及其创建算法 的c语言实现; 2)掌握图的深度优先搜索遍历算法和图的广度优先搜索遍历算法及C语言实现; 3)掌握AOV-网普里姆构造最小生成树算法的数据结构和算法实现; 4)掌握AOE-网关路经的生成算法和实现; 5)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行 结果); 6)认真书写实验报告,并按时提交(第12周周一提交)。