图的遍历(完整代码)

时间:2025-04-22 08:12:34
#include<> #include<> #include<> #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 #define FALSE 0 #define TRUE 1 #define OK 1 #define ERROR -2 #define OVERFLOW -1 typedef int QElemType; bool visited[MAX_VERTEX_NUM]; //图的定义 typedef struct { int vexnum,arcnum;//顶点数,边数 int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; }MGraph; //链队列的定义 typedef struct QNode{ QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }LinkQueue; //创建邻接矩阵 MGraph createUDN(MGraph G){ int i,j,k; printf("请输入顶点数、边数:\n"); scanf("%d,%d",&G.vexnum,&G.arcnum); for(i=0;i<G.vexnum;++i) for(j=0;j<G.arcnum;++j) G.AdjMatrix[i][j]=INFINITY; printf("请输入各边依附的顶点及权值(按照“顶点,顶点,权值”格式输入)\n"); for(k=0;k<G.arcnum;k++){ int x,y,w; scanf("%d,%d,%d",&x,&y,&w); G.AdjMatrix[x][y]=w; G.AdjMatrix[y][x]=w;} return G;} //邻接矩阵输出图的结构 void outputGraph(MGraph G){ int i,j; printf("邻接矩阵输出图的结构如下:\n"); for(i=0;i<G.vexnum;i++){ for(j=0;j<G.vexnum;j++){ if(G.AdjMatrix[i][j]==INT_MAX){ printf("∞ "); }else{ printf("%d ",G.AdjMatrix[i][j]);}} printf("\n"); }} void DFS(MGraph G,int v){ visited[v]=TRUE;//访问后赋值为 1 printf("%d",v); for(int j=0;j<G.vexnum;j++) if(G.AdjMatrix[v][j]!=INT_MAX&&!visited[j]) DFS(G,j);} //深度优先遍历 void DFSTraverse(MGraph G) { int v; for(v=0;v<G.vexnum;v++) visited[v]=FALSE;//数组初始化 for(v=0;v<G.vexnum;v++) if(!visited[v]) DFS(G,v); } //初始化队列Q int InitQueue(LinkQueue &Q) { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; return OK; } //判断队列是否为空 bool QueueEmpty(LinkQueue &Q) { if(Q.front==Q.rear) return TRUE; else return FALSE; } //将e入队 void EnQueue(LinkQueue &Q, QElemType e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if (!p) exit(OVERFLOW) ; p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; } //出队 int DeQueue(LinkQueue &Q){ QElemType e; QueuePtr p; if (Q.front==Q.rear) { printf("空队列!\n");} p = Q.front->next; e=p->data; Q.front->next = p->next; if (Q.rear == p) Q.rear = Q.front; free(p); return e;} //返回队头元素 //广度优先遍历 void EFSTraverse(MGraph G){ QElemType u; int v; for(v=0;v<G.vexnum;++v) visited[v]=FALSE;//所有结点赋初值 0 LinkQueue Q; InitQueue(Q); for(v=0;v<G.vexnum;++v) if(!visited[v]){ //未访问 visited[v]=TRUE;//访问后赋值 1 printf("%d",v); EnQueue(Q,v);//入队列 while(!QueueEmpty(Q)) { u=DeQueue(Q); //队头元素出队并赋值给u for(int j=0;j<G.vexnum;++j) if(G.AdjMatrix[u][j]!=INFINITY && !visited[j]) { visited[j]=TRUE; EnQueue(Q,j); //访问顶点j入队 printf("%d",j); }}}} int main() { MGraph G; G=createUDN(G); outputGraph(G); printf("深度优先遍历:\n"); DFSTraverse(G); printf("\n广度优先遍历:\n"); EFSTraverse(G); return 0; }