1. 程式人生 > >資料結構7-關於“圖”的生成與操作的例項

資料結構7-關於“圖”的生成與操作的例項

程式實現用鄰接表儲存的形式建立一棵無向圖,應用深度優先搜尋的方法遍歷圖中各點,並打印出資料,程式碼如下所示:

#include"stdio.h"

typedef struct ArcNode{
	/*單鏈表中的結點的型別*/
	int adjvex; /*該邊指向的頂點在順序表中的位置*/
	struct ArcNode *next; /*下一條邊*/
}ArcNode;

typedef struct VNode{
	/*頂點型別*/
	int data; /*頂點中的資料資訊*/
	ArcNode *firstarc; /*指向單鏈表,即指向第一條邊*/
}VNode;

int visited[5]={0,0,0,0,0};

CreatGraph(int n,VNode G[]){
	int i,e;
	ArcNode *p,*q;
	printf("Input the information of the vertex\n");
	for(i=0;i<n;i++){
		scanf("%d",&G[i]);
		G[i].firstarc = NULL; /*初始化第一條邊為空*/
	}
	for(i=0;i<n;i++){
		printf("Creat the edges for the %dth vertex\n",i);
		scanf("%d",&e);
		while(e!=-1){
			p = (ArcNode *)malloc(sizeof(ArcNode)); /*建立一條邊*/
			p->next = NULL;
			p->adjvex = e;
			if(G[i].firstarc == NULL)
				G[i].firstarc = p; /*i結點的第一條邊*/
			else
				q->next = p; /*下一條邊*/
			q = p;
			scanf("%d",&e);
		}
	}
}

int FirstAdj(VNode G[],int v){
	if(G[v].firstarc != NULL)
		return (G[v].firstarc)->adjvex;
	return -1;
}

int NextAdj(VNode G[],int v){
	ArcNode *p;
	p=G[v].firstarc;
	while(p!=NULL){
		if(visited[p->adjvex])
			p=p->next;
		else
			return p->adjvex;
	}
	return -1;
}

void DFS(VNode G[],int v){
	int w;
	printf("%d ",G[v]); /*訪問當前頂點,打印出該頂點中的資料資訊*/
	visited[v]=1; /*將頂點v對應的訪問標記置1*/
	w=FirstAdj(G,v); /*找到頂點v的第一個鄰接點,如果無鄰接點,返回-1*/
	while(w != -1){
		if(visited[w] == 0) /*該頂點未被訪問*/
			DFS(G,w); /*遞迴地進行深度優先搜尋*/
		w = NextAdj(G,v); /*找到頂點v的下一個鄰接點,如果無鄰接點,返回-1*/
	}
}

main(){
	VNode G[5];
	CreatGraph(5,G);
	DFS(G,0);
	getche();
}