图的深度 广度 遍历

#ifndef _ALGRAPH_H #define _ALGRAPH_H #include <iostream> // #include "Queue.h" /* * 邻接表 存储 图 */ #define MAX 50 unsigned char visited[MAX]; void (*VisitFunc)(int v); #define MAX_VERTEX_NUM 20 #define MAX_QUEUE_SIZE 100 typedef struct { int *base; int front; int rear; }SqQueue; int InitQueue(SqQueue& Q) { Q.base = (int*)calloc(MAX_QUEUE_SIZE , sizeof(int)); if (!Q.base) { return 0; } Q.rear = Q.front = 0; return 1; } // 返回Q中已有元素的长度 int QueueLength(SqQueue Q) { return (Q.rear - Q.front + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE; } int EnQueue(SqQueue &Q , int e) { if ((Q.rear + 1)%MAX_QUEUE_SIZE == Q.front) { return 0; //队列满 } Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAX_QUEUE_SIZE; return 1; } int DeQueue(SqQueue &Q , int &e) { if (Q.rear == Q.front) { return 0; //队列空 } e = Q.base[Q.front]; Q.front = (Q.front + 1) % MAX_QUEUE_SIZE; return 1; } // 弧结点 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; int info; }ArcNode; // 顶点结点 typedef struct VNode { int data; ArcNode *firstarc; }VNode , AdList[MAX_VERTEX_NUM]; // 图 typedef struct ALGraph { AdList vertices; int vexnum , arcnum; int kind; }ALGraph; void CreateALGraph(ALGraph &G){ // 创建图的邻接表存储 int i,j,k; int flag; ArcNode *s; std::cout<<"选择图类型(0-有向图,1-无向图)"<<std::endl; std::cin>>flag; std::cout<<"输入图的顶点数与边数"<<std::endl; std::cin>>G.vexnum>>G.arcnum; for(i=1; i<=G.vexnum; i++){ //构造一个含n个顶点,边数为0的图 G.vertices[i].data = i; //输入顶点的内容 G.vertices[i].firstarc = NULL; //将顶点结点的firstarc域置为空 }//for for(k=1; k<=G.arcnum; k++){ //输入对应于一条边的顶点序号序偶对,要求顶点序号为0~n-1 std::cout<<"输入弧的两端 i,j:"<<std::endl; std::cin>>i>>j; s = (ArcNode*)malloc(sizeof(ArcNode)); //申请一个边结点*s s->adjvex = j; //将序号j放入边结点*s的adjvex域 //将边结点*s作为第一个邻接点插入到序号为i的顶点的边表中 s->nextarc = G.vertices[i].firstarc; G.vertices[i].firstarc = s; if (flag){ //若要建立无向图 s=(ArcNode*)malloc(sizeof(ArcNode)); //申请一个边结点*s s->adjvex = i; //将序号放入边结点*s的adjvex域 //将边结点*s作为第一个邻接点插入到序号为j的顶点的边表中 s->nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = s; }//if }//for }//CreateALGraph // 返回v的第一个邻接点 int FirstAdjVex(ALGraph G , int v) { ArcNode* p = G.vertices[v].firstarc; while (p != NULL) { if (visited[p->adjvex] == 0) { return p->adjvex; } p = p->nextarc; } return -1; //表示已不存在每访问过的第一邻接点 } // 返回v 相对于w的下一个邻接点 int NextAdjVex(ALGraph G , int v , int w) { ArcNode* p = G.vertices[v].firstarc; while (p != NULL) { if (p->adjvex != w && visited[p->adjvex] == 0) { return p->adjvex; } p = p->nextarc; } return -1; } void DFS(ALGraph G , int v) { visited[v] = 1; VisitFunc(v); for (int w = FirstAdjVex(G , v) ; w > -1 ; w = NextAdjVex(G , v , w)) { if (!visited[w]) { DFS(G , w); } } } void DFSTraverse(ALGraph G , void (*Visit)(int v)) { VisitFunc = Visit; for (int i = 1 ; i <= G.vexnum ; i++) { visited[i] = 0; } for (i = 1 ; i <= G.vexnum ; i++) { if (visited[i] == 0) { DFS(G , i); } } } void BFSTraverse(ALGraph G , void (*Visit)(int v)) { SqQueue Q; InitQueue(Q); VisitFunc = Visit; for (int i = 1 ; i <= G.vexnum ; i++) { visited[i] = 0; } for (i = 1 ; i <= G.vexnum ; i++) { if (visited[i] == 0) { int e = 0; visited[i] = 1; VisitFunc(i); EnQueue(Q , i); while(!QueueLength(Q)) { DeQueue(Q , e); for (int w = FirstAdjVex(G , e) ; w >= 0 ; w = NextAdjVex(G , e , w)) { if (!visited[w]) { visited[w] = 1; VisitFunc(w); EnQueue(Q , w); } } } } } } #endif// _ALGRAPH_H 

 

#include <stdio.h> #include "ALGraph.h" void kkvisit(int i) { printf("visit %d success!/n" , i); } void main() { ALGraph G; CreateALGraph(G); DFSTraverse(G , kkvisit); puts("---------------------------------"); BFSTraverse(G , kkvisit); }  

你可能感兴趣的:(图的深度 广度 遍历)