1、计算机实验报告经典 中国矿业大学矿业工程学院实验报告课程名称 计算机软件设计基础姓名 黄开文 班级 采矿09-8班学号 01090253 日期 2011年10月成绩 教师 谢耀社 实验三:图的存储与遍历一:实验目的(1)掌握图的概念和相关术语;(2)掌握图的邻接矩阵和邻接链表表示;(3)掌握图的两种遍历方式:深度遍历和广度遍历。二:实验内容(1)使用邻接矩阵作为存储结构建立无向图;(2)使用邻接链表作为存储结构建立有向图;(3)以邻接链表为存储结构实现图有向图的深度遍历;(4)以邻接链表为存储结构实现有向图的广度遍历;三:实验程序及结果(1)邻接矩阵建立图:#include#include#d
2、efine VEXTYPE int /*顶点的类型设为整型*/#define MAXSIZE 100 /*数组最多存储单元为100*/#define ADJTYPE int /*边的类型为整型*/typedef struct VEXTYPE vexsMAXSIZE; /*一维数组存储顶点信息*/ ADJTYPE arcsMAXSIZEMAXSIZE; /*二维数组存储邻接矩阵*/ int vexnum,arcnum; /*顶点和边的数目*/MGRAPH;void create_graph(MGRAPH*g) int i,j,k; printf(输入顶点数和边数:); scanf(%d,%d,&
3、i,&j); g-vexnum=i; g-arcnum=j; for(i=1;ivexnum;i+) /*0单元空出不存储顶点的信息*/ printf(第%d个顶点的信息:,i); scanf(%d,&g-vexsi); for(i=1;ivexnum;i+) /*初始化邻接矩阵*/ for(j=1;jvexnum;j+) g-arcsij=0; for(k=1;karcnum;k+) printf(输入第%d条边的起点和终点的编号:,k); scanf(%d,%d,&i,&j); while(ig-vexnum|jg-vexnum) printf(编号超出范围,请重新输入!); scanf(
4、%d,%d,&i,&j); g-arcsij=1; g-arcsji=1; main() MGRAPH graph,*g; int i,j; g=&graph; create_graph(g); printf(顶点信息为:n); for(i=1;ivexnum;i+) /*输出顶点信息*/ printf(%d,g-vexsi); printf(n); printf(该图的邻接矩阵为:n); for(i=1;ivexnum;i+) /*输出邻接矩阵*/ for(j=1;jvexnum;j+) printf(%d,g-arcsij); printf(n); 结果:(2.)邻接链表建立图:#incl
5、ude#include#define MAXSIZE 100#define VEXTYPE inttypedef struct adjnode VEXTYPE adjvex; struct adjnode *next;ADJNODE;typedef struct VEXTYPE vertex; ADJNODE*link;VEXNODE;typedef struct VEXNODE adjlistMAXSIZE; int vexnum,arcnum;ADJGRAPH;void create_adjgraph(ADJGRAPH*g) /*用邻接链表建立有向图*/ int i,j,k; ADJNOD
6、E*p; printf(输入顶点数和边数:); scanf(%d,%d,&i,&j); g-vexnum=i; g-arcnum=j; for(i=1;ivexnum;i+) printf(请输入顶点的信息:); scanf(%d,&g-adjlisti.vertex); g-adjlisti.link=NULL; for(i=1;iarcnum;i+) printf(请输入第%d条边的起点和终点:,i); scanf(%d,%d,&j,&k); while(jg-vexnum|kg-vexnum) printf(编号超出范围,请重新输入!); scanf(%d,%d,&i,&j); p=(A
7、DJNODE*)malloc(sizeof(ADJNODE); p-adjvex=k; p-next=g-adjlistj.link; g-adjlistj.link=p; main() ADJGRAPH graph,*g; int i; ADJNODE*p; g=&graph; create_adjgraph(g); printf(该有向图的邻接链表为:n); for(i=1;ivexnum;i+) /*输出邻接链表*/ p=g-adjlisti.link; if(p!=NULL) printf(%3d|,g-adjlisti.vertex);阿 while(p!=NULL) printf(
8、-); printf(%5d,p-adjvex); p=p-next; printf(n); else printf(%3d|n,g-adjlisti.vertex); 结果:(3)广度优先遍历:(此程序用到队列的基本操作,写在头程序中了)源程序:#include#includeseqqueue.h#include#define MAXSIZE 100#define VEXTYPE inttypedef struct adjnode VEXTYPE adjvex; struct adjnode *next;ADJNODE;typedef struct VEXTYPE vertex; ADJNO
9、DE*link;VEXNODE;typedef struct VEXNODE adjlistMAXSIZE; int vexnum,arcnum;ADJGRAPH;void create_adjgraph(ADJGRAPH*g) /*用邻接链表建立图*/ int i,j,k; ADJNODE*p; printf(输入顶点数和边数:); scanf(%d,%d,&i,&j); g-vexnum=i; g-arcnum=j; for(i=1;ivexnum;i+) printf(请输入顶点的信息:); scanf(%d,&g-adjlisti.vertex); g-adjlisti.link=NU
10、LL; for(i=1;iarcnum;i+) printf(请输入第%d条边的起点和终点:,i); scanf(%d,%d,&j,&k); while(jg-vexnum|kg-vexnum) printf(编号超出范围,请重新输入!); scanf(%d,%d,&i,&j); p=(ADJNODE*)malloc(sizeof(ADJNODE); p-adjvex=k; p-next=g-adjlistj.link; g-adjlistj.link=p; int visitedMAXSIZE=0;void bfs(ADJGRAPH*g,int i) /*从顶点i开始进行广度优先搜索*/ A
11、DJNODE*p; SEQQUEUE*q,queue; int v; q=&queue; Init_Queue(q); visitedi=1; printf(%4d,g-adjlisti.vertex); Add_Queue(q,i); while(!Queue_Empty(q) v=Gethead_Queue(q); Del_Queue(q); p=g-adjlistv.link; while(p!=NULL) if(visitedp-adjvex=0) visitedp-adjvex=1; printf(%4d,g-adjlistp-adjvex.vertex); Add_Queue(q,
12、p-adjvex); p=p-next; main() ADJGRAPH*g,adjg; int i; g=&adjg; create_adjgraph(g); printf(广度遍历的结果:n); for(i=1;ivexnum;i+) if(visitedi!=1) bfs(g,i); printf(n);头程序:seqqueue.h#define datatype int#define MAXSIZE 100typedef struct datatype dataMAXSIZE; /*队列的最大存储空间*/ int front,rear; /*队头队尾指针*/SEQQUEUE;SEQQUEUE *q;void Init_Queue(SEQQUEUE*q) /*初始化队列*/ q-front=0; q-rear=0;int Queue_Empty(SEQQUEUE*q) /*判断队空操作*/ if(q-rear=q-front) return 1; else return 0;void Add_Queue(SEQQUEUE *q,datatype x) /*入队操作*/ if(q-rear+1)%MAXSIZE=q-front) printf(Queue fulln); else q-rear=(q-rear+1)%MAXSIZE; q-dataq-rear=x;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1