1、数据结构实验报告图的深度优先遍历算法 题目: 图的深度优先遍历算法 一、实验题目 前序遍历二叉树二、实验目的 掌握图的逻辑结构; 掌握图的邻接矩阵存储结构; 验证图的邻接矩阵存储及其深度优先遍历操作的实现。三、实验内容与实现 建立无向图的邻接矩阵存储; 对建立的无向图,进行深度优先遍历;实验实现#include #include#define MaxVex 255 #define TRUE 1 #define FALSE 0 typedef char VertexType; typedef int Bool;Bool visitedMaxVex; typedef struct EdgeNode
2、 int adjvex; struct EdgeNode *next; EdgeNode;typedef struct VertexNode VertexType data; EdgeNode *firstedge; VertexNode,AdjListMaxVex; typedef struct Graph AdjList adjList; int numVertexes,numEdges; Graph,*GraphAdjList;typedef struct LoopQueue int dataMaxVex; int front,rear;LoopQueue,*Queue; void in
3、itQueue(Queue &Q) Q-front=Q-rear=0;Bool QueueEmpty(Queue &Q) if(Q-front = Q-rear) return TRUE; else return FALSE; Bool QueueFull(Queue &Q) if(Q-rear+1)%MaxVex = Q-front) return TRUE; else return FALSE; void EnQueue(Queue &Q,int e) if(!QueueFull(Q) Q-dataQ-rear = e; Q-rear = (Q-rear+1)%MaxVex; void D
4、eQueue(Queue &Q,int *e) if(!QueueEmpty(Q) *e = Q-dataQ-front; Q-front = (Q-front+1)%MaxVex; void CreateALGraph(GraphAdjList &G)/* 建立图的邻接表结构*/ int i, j, k; if(G=NULL) G = (GraphAdjList)malloc(sizeof(Graph); printf(输入图的结点数以及边数: ); scanf(%d%d,&G-numVertexes,&G-numEdges); fflush(stdin); printf(=n); prin
5、tf(输入各个顶点的数据:n); for (i=0; inumVertexes; +i) printf(顶点%d: ,i); scanf(%c, &(G-adjListi.data); G-adjListi.firstedge = NULL; fflush(stdin); printf(=n); for (k=0; knumEdges; +k) printf(输入(vi,vj)上的顶点序号: ); scanf(%d%d,&i,&j); EdgeNode *ptrEdgeNode = (EdgeNode*)malloc(sizeof(EdgeNode); ptrEdgeNode-adjvex =
6、 j; ptrEdgeNode-next = G-adjListi.firstedge; G-adjListi.firstedge = ptrEdgeNode; ptrEdgeNode = (EdgeNode*)malloc(sizeof(EdgeNode); ptrEdgeNode-adjvex = i; ptrEdgeNode-next = G-adjListj.firstedge; G-adjListj.firstedge = ptrEdgeNode; void DFS(GraphAdjList &G, int i) visitedi = TRUE; printf(%c , G-adjL
7、isti.data); EdgeNode *p = G-adjListi.firstedge; while(p) if(!visitedp-adjvex) DFS(G,p-adjvex); /递归深度遍历 p= p-next; /* * 深度优先遍历 */void DFSTraverse(GraphAdjList &G) int i; for (i=0; inumVertexes; +i) visitedi = FALSE; /初始化访问数组visited的元素值为false for (i=0; inumVertexes; +i) if(!visitedi) /节点尚未访问 DFS(G,i);
8、 /* * 图的广度优先遍历 */ void BFSTraverse(GraphAdjList &G) int i; Queue Q = (Queue)malloc(sizeof(LoopQueue); for (i=0; inumVertexes; +i) visitedi = FALSE; initQueue(Q); for (i=0; inumVertexes; +i) if(!visitedi) visitedi = TRUE; printf(%c , G-adjListi.data); EnQueue(Q, i); while (!QueueEmpty(Q) DeQueue(Q, &
9、i); EdgeNode *p = G-adjListi.firstedge; while (p) if (!visitedp-adjvex) visitedp-adjvex = TRUE; printf(%c , G-adjListp-adjvex.data); EnQueue(Q, p-adjvex); p = p-next; int main() GraphAdjList G = NULL; CreateALGraph(G); printf(n图的深度优先遍历为: ); DFSTraverse(G); printf(n图的广度优先遍历为: ); BFSTraverse(G); printf(n); return 0;四、实验心得 建立了无向图的邻接矩阵存储; 掌握了对所建立的无向图的深度优先遍历和广度优先遍历;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1