////2012.03.26 by zhengshihao #include<stdio.h> #define GRAPHMAX 10 #define FALSE 0 #define TRUE 1 #define Error printf #define QueueSize 30 typedef struct { char vexs[GRAPHMAX]; int edges[GRAPHMAX][GRAPHMAX]; int n,e; }Mgraph; int visited[10]; typedef struct { int front,rear,count; int data[QueueSize]; }CirQueue; void InitQueue(CirQueue* q) { q->front=q->rear=0; q->count=0; } int QueueEmpty(CirQueue* q) { return q->count==0; } int QueueFull(CirQueue* q) { return q->count==QueueSize; } void EnQueue(CirQueue* q,int x) { if(QueueFull(q)) Error("Queue overflow"); else{ q->count++; q->data[q->rear]=x; q->rear=(q->rear+1)%QueueSize; } } int DeQueue(CirQueue* q) { int temp; if(QueueEmpty(q)){ Error("Queue underflow"); return NULL; } else{ temp=q->data[q->front]; q->count--; q->front=(q->front+1)%QueueSize; return temp; } } void CreateMGraph(Mgraph* g) { int i,j,k; char ch1,ch2; printf("\n\t\t請輸入定點數,邊數並按回車(格式如:3,4):"); scanf("%d,%d",&(g->n),&(g->e)); for(i=0;i<g->n;i++) { getchar(); printf("\n\t\t請輸入第%d個定點並回車:",i+1); scanf("%c",&(g->vexs[i])); } for(i=0;i<g->n;i++) for(j=0;j<g->n;j++) g->edges[i][j]=0; for(k=0;k<g->e;k++) { getchar(); printf("\n\t\t請輸入第%d條邊的頂點序號(格式如:i,j):",k+1); scanf("%c,%c",&ch1,&ch2); for(i=0;ch1!=g->vexs[i];i++); for(j=0;ch2!=g->vexs[j];j++); g->edges[i][j]=1; } } void DFSM(Mgraph* g,int i) { int j; printf("\n\t\t深度優先遍歷序列:%c\n",g->vexs[i]); visited[i]=TRUE; for(j=0;j<g->n;j++) if(g->edges[i][j]==1&&!visited[j])DFSM(g,j); } void BFSM(Mgraph *g,int k) { int i,j; CirQueue q; InitQueue(&q); printf("\n\t\t廣度優先遍歷序列:%c\n",g->vexs[k]); visited[k]=TRUE; EnQueue(&q,k); while(!QueueEmpty(&q)) { i=DeQueue(&q); for(j=0;j<g->n;j++) if(g->edges[i][j]==1&&!visited[j]) { visited[j]=TRUE; printf("\n\t\t廣度優先遍歷序列:%c\n",g->vexs[j]); EnQueue(&q,j); } } } void DFSTraverseM(Mgraph* g) //深度優先遍歷 { int i; for(i=0;i<g->n;i++) visited[i]=FALSE; for(i=0;i<g->n;i++) if(!visited[i])DFSM(g,i); } void BFSTraverseM(Mgraph* g) //廣度優先遍歷 { int i; for(i=0;i<g->n;i++) visited[i]=FALSE; for(i=0;i<g->n;i++) if(!visited[i])BFSM(g,i); } int main() { Mgraph *g,a; char ch1; int i,j,ch2; g=&a; printf("\n\t\t創建一個有向圖的鄰接矩陣表示\n"); CreateMGraph(g); printf("已創建一個有向圖的鄰接矩陣存儲\n"); for(i=0;i<g->n;i++) { printf("\n\t\t"); for(j=0;j<g->n;j++) printf("%5d",g->edges[i][j]); } getchar(); ch1='y'; while(ch1=='y'||ch1=='Y') { printf("\n"); printf("\n\t\t 圖的存儲和遍歷 "); printf("\n\t\t*****************************"); printf("\n\t\t 1----更新鄰接矩陣 "); printf("\n\t\t 2----深度優先遍歷 "); printf("\n\t\t 3----廣度優先遍歷 "); printf("\n\t\t 0----退 出 "); printf("\n\t\t*****************************"); printf("\n\t\t 請選擇菜單號(0--3):"); scanf("%d",&ch2); getchar(); switch(ch2) { case 1:CreateMGraph(g); printf("\n\t\t圖的鄰接矩陣創建完成\n");break; case 2:DFSTraverseM(g);break; case 3:BFSTraverseM(g);break; case 0:ch1='n';break; default:printf("\n\t\t輸出錯誤!請從新輸入!"); } } }