數據結構 之 圖的存儲和遍歷

////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輸出錯誤!請從新輸入!");
		} 
	}
}
相關文章
相關標籤/搜索