1、数据结构实验3报告doc任课教师:孙树森数据结构与算法(2012-2013学年第2学期)实验报告学号:2011329700214姓名:周咪咪 班级:11数字媒体技术(2)班实验3 图的建立与操作一、实验目的和要求在熟悉图的存储、遍历、及其应用的基础上,通过键盘输入数据,建立一个无向图的邻接表,输出该邻接表,并计算每个顶点的度。达到巩固图的存储思想及其存储实现。二、实验内容完成下图的邻接表表示,并计算每个顶点的度。附加要求:进行深度优先和广度优先遍历3、程序源码#include#include#includeusing namespace std;/-无向图的邻接存储表示-#define MAX
2、_VERTEX_NUM 8 /顶点最大个数 int arcMAX_VERTEX_NUMMAX_VERTEX_NUM;/数组用于存储边信息bool visitedMAX_VERTEX_NUM;typedef struct ArcNode/边表结点 int adjvex; /邻接点域,存储该顶点对应的下标 struct ArcNode *next;/链域,指向下一个邻接点 int weight; /存储边的权值ArcNode; #define VertexType char /顶点元素类型typedef struct VNode/顶点表结构 int degree;/顶点的度 VertexType
3、data;/顶点域,存储顶点信息 ArcNode *firstarc;/边表头指针VNode/*头结点*/,AdjListMAX_VERTEX_NUM; typedef struct AdjList vertices;/顶点 int numNodes,numEdges;/当前顶点数,边数ALGraph;typedef struct int *elem; int front, rear; Queue;void InitQueue(Queue &Q) Q.elem = new intMAX_VERTEX_NUM; Q.front = Q.rear = 0;int QueueEmpty(Queue
4、Q) if(Q.front=Q.rear) return 0; else return 1; void EnQueue(Queue &Q, int e) if(Q.rear + 1)%MAX_VERTEX_NUM != Q.front) Q.elemQ.rear = e; else printf(队列满!n); Q.rear = (Q.rear + 1)%MAX_VERTEX_NUM; void DeQueue(Queue &Q, int &e) if(Q.rear != Q.front) e = Q.elemQ.front; else printf(队列空!n); Q.front = (Q.
5、front+1)%MAX_VERTEX_NUM;/-建立无向图-void CrateALGraph(ALGraph *G)int i,j,k;/ArcNode *e;printf(输入顶点数和边数:n);scanf(%d,%d,&G-numNodes,&G-numEdges);for(i=0;inumNodes;i+)/读入顶点信息,建立顶点表printf(输入顶点信息:n);cinG-verticesi.data;G-verticesi.firstarc=NULL;/将边表置为空表visitedi=false;for(k=0;knumEdges;k+)/建立边表printf(输入边(vi,v
6、j)上的顶点序列:n);scanf(%d,%d,&i,&j); /输入边(vi,vj)上的顶点序号arcij=1;/两个顶点之间有边记作1ArcNode *s1,*s2;s1=(ArcNode *)malloc(sizeof(ArcNode);/向内存申请空间,生成边表结点s1-adjvex=j;/邻节序号为js1-next=G-verticesi.firstarc;/将e的指针指向当前顶点上指向的结点G-verticesi.firstarc=s1;/将当前顶点的指针指向es2=(ArcNode *)malloc(sizeof(ArcNode);/向内存申请空间,生成边表结点s2-adjvex
7、=j;/邻节序号为is2-next=G-verticesi.firstarc;/将e的指针指向当前顶点上指向的结点G-verticesi.firstarc=s2;/将当前顶点的指针指向e/-输出邻接表-void display(ALGraph *G)ArcNode *p;printf(邻接表如下:n); for(int i=0;inumNodes;i+) printf(%d),%c:,i,G-verticesi.data);/输入下标和对应顶点的信息 p=G-verticesi.firstarc; while (p!=NULL) /输出相关顶点 printf(-%c,p-adjvex); p=
8、p-next; printf(n); /-计算无向图的度-void DegreeNum(ALGraph *G)/与顶点相关的度 int i,j; int degreenum; for(j=1;jnumNodes;j+) degreenum=0; for(i=0;inumNodes;i+) if(arcji=1|arcij=1)/v,i有边相连 degreenum+; printf(与顶点%c度为:%dn,G-verticesi.data,degreenum); /-深度优先搜索遍历-void DFS(ALGraph G,int i) ArcNode *p; visitedi=true; pri
9、ntf(%c,G.verticesi.data); p=G.verticesi.firstarc;while(p)if(!visitedp-adjvex)DFS(G,p-adjvex);/对为访问的邻接顶点递归调用p=p-next;/-广度优先搜索-void BFS(ALGraph G)int i;ArcNode *p;Queue Q;InitQueue(Q);for(i=0;iadjvex)/若此顶点为被访问visitedp-adjvex=true;printf(%c,G.verticesp-adjvex.data);EnQueue(Q,p-adjvex);p=p-next;printf(n
10、);int main() ALGraph G; int i;/ G=(ALGraph *)malloc(sizeof(ALGraph); CrateALGraph(&G);/创建无向图,输入数据 printf(输出每个顶点的度:n); /for(int m=0;iG.numNodes;i+) DegreeNum(&G); printf(深度优先搜索遍历:n); DFS(G,0);for(i=0;iG.numNodes;i+)visitedi=false; printf(n); printf(广度优先搜索遍历:n); BFS(G); printf(输入邻接表:n); display(&G); i
11、nt c;scanf(%d,&c);return 0;4、运行结果与测试分析运行结果:(1)输入顶点信息:(2)输入边信息:(3)输出每个顶点度:(4)邻接表分析:(1)首先定义无向图邻接表的结构,分别声明边表结点、顶点结构、当前图的顶点和边数的结构。(2)建立无向图的邻接存储结构,通过CrateALGraph函数在内部实现顶点数据的输入,边表的置空和建立,构建顶点之间的边结构。(3)定义display函数实现邻接表的输出。通过结点指针实现当前顶点信息的索引和向下索引相关联的顶点。(4)通过DegreeNum函数实现对应顶点的度,在函数中通过在for循环语句中的if语句判断这两个顶点是否有度,
12、实现所以顶点度的查找。(5)再根据书上深度优先索引遍历和广度优先遍历的代码实现遍历。(6)在main函数中通过定义一个图输入顶点信息和边的数量。再调用各种函数实现题目需要的效果。五、实验心得与体会在这次试验中,需要之前了解无向图的基本概念。通过实验知道了图的建立、存储方式和图的遍历。在实验之前,因为对图的概念不是很了解,所以在看到实验时有些迷茫。后来在查阅了课本和请教了同学后,开始了程序的编写。实验过程中,在图的遍历的理解上有一定的混淆导致错误连连,后来通过在网上查找相应的错误解决方案和同学商讨后完成了程序的编写。在此次实验中,了解到了有向图和无向图在顶点度的计算时的区别,在深度优先搜索遍历和广度优先搜索遍历的可以利用递归调用的方法简化程序,在广度优先搜索遍历时需要定义大量函数实现遍历。通过此次学习,希望可以对以后的实验和学习会有很大的帮助。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1