int ArrNum(Graph G,int ver) { for(int i=0;i<G.VerNum;i++) if(G.Ver[i]==ver) return i; else return -1; } int FirstNeighbor(Graph G,int ver) { int x=ArrNum(G,ver); for(int i=0;i<G.VerNum;i++) { if(G.Edge[x][i]==1) return i; } return -1; } int NextNeighbor(Graph G,int ver,int w) { int x=ArrNum(G,ver); for(int i=w+1;i<G.VerNum;i++) { if(G.Edge[x][i]==1) return i; } return -1; } bool visited[MaxSize]; //记录遍历过的结点 void BFS(Graph G,int vnum) { printf("%d ",G.Ver[vnum]); visited[vnum]=true; Queue Q; InitQueue(Q); int ver; int w; EnQueue(Q,G.Ver[vnum]); while(!isEmpty(Q)) { DeQueue(Q,ver); for(w=FirstNeighbor(G,ver);w>=0;w=NextNeighbor(G,ver,w)) { if(!visited[w]) { printf("%d ",G.Ver[w]); visited[w]=true; EnQueue(Q,G.Ver[w]); } } } } void BFSTraverse(Graph G) { for(int i=0;i<G.VerNum;i++) visited[i]=false; //将visited中元素置为false,遍历过置为true for(int i=0;i<G.VerNum;i++) //开始遍历 { if(!visited[i]) BFS(G,i); } }
#include <stdio.h> #include <stdlib.h> #define MaxSize 20 typedef struct{ int Ver[MaxSize]; int Edge[MaxSize][MaxSize]; int VerNum; int EdgeNum; }Graph; void CreateGraph(Graph &G) { int x,i,j; printf("输入顶点元素:\n"); for(i=0;i<MaxSize;i++) { scanf("%d",&x); if(x==-1) break; else { G.Ver[i]=x; G.VerNum++; } } printf("输入边(0/1):\n"); for(i=0;i<G.VerNum;i++) { for(j=0;j<G.VerNum;j++) { scanf("%d",&x); G.Edge[i][j]=x; if(x==1) G.EdgeNum++; } } G.EdgeNum=G.EdgeNum/2; } int ArrNum(Graph G,int ver) { for(int i=0;i<G.VerNum;i++) if(G.Ver[i]==ver) return i; else return -1; } int FirstNeighbor(Graph G,int ver) { int x=ArrNum(G,ver); for(int i=0;i<G.VerNum;i++) { if(G.Edge[x][i]==1) return i; } return -1; } int NextNeighbor(Graph G,int ver,int w) { int x=ArrNum(G,ver); for(int i=w+1;i<G.VerNum;i++) { if(G.Edge[x][i]==1) return i; } return -1; } void DisplayGraph(Graph G) { int i,j; printf("顶点元素有%d个,边有%d个\n顶点元素分别是:",G.VerNum,G.EdgeNum); for(i=0;i<G.VerNum;i++) printf("%d ",G.Ver[i]); printf("\n"); printf("邻接矩阵为:\n"); for(i=0;i<G.VerNum;i++) for(j=0;j<G.VerNum;j++) { printf("%d ",G.Edge[i][j]); if(j==G.VerNum-1) printf("\n"); } } typedef struct{ int data[MaxSize]; int front; int rear; }Queue; void InitQueue(Queue &Q) { Q.front=Q.rear=0; } bool isEmpty(Queue Q) { if(Q.front==Q.rear) return true; return false; } bool isFull(Queue Q) { if((Q.rear+1)%MaxSize==Q.front) return true; return false; } bool EnQueue(Queue &Q,int ver) { if(isFull(Q)) return false; Q.data[Q.rear]=ver; Q.rear=(Q.rear+1)%MaxSize; return true; } bool DeQueue(Queue &Q,int &ver) { if(isEmpty(Q)) return false; ver=Q.data[Q.front]; Q.front=(Q.front+1)%MaxSize; return true; } bool visited[MaxSize]; //记录遍历过的结点 void BFS(Graph G,int vnum) { printf("%d ",G.Ver[vnum]); visited[vnum]=true; Queue Q; InitQueue(Q); int ver; int w; EnQueue(Q,G.Ver[vnum]); while(!isEmpty(Q)) { DeQueue(Q,ver); for(w=FirstNeighbor(G,ver);w>=0;w=NextNeighbor(G,ver,w)) { if(!visited[w]) { printf("%d ",G.Ver[w]); visited[w]=true; EnQueue(Q,G.Ver[w]); } } } } void BFSTraverse(Graph G) { for(int i=0;i<G.VerNum;i++) visited[i]=false; //将visited中元素置为false,遍历过置为true for(int i=0;i<G.VerNum;i++) //开始遍历 { if(!visited[i]) BFS(G,i); } } int main() { Graph G; CreateGraph(G); DisplayGraph(G); BFSTraverse(G); return 0; }
标签:Ver,int,Graph,邻接矩阵,BFS,MaxSize,printf,visited From: https://www.cnblogs.com/simpleset/p/17671548.html