有向网 无向网的创建(数组表示法) 和深度优先访问

#include <stdio.h>

#include <stdlib.h>



#define OK 1

#define ERROR -1

#define OVERFLOW 0

#define MAXVER 20  //定义最大定点数

#define MAXINT 200  //定义无穷大



typedef enum{UDG,UDN,DG,DN} GraphKind;// 定义无向图 无向网 有向图 有向网

typedef char verType;  //定义顶点类型

typedef int status ;

typedef struct 

{

	verType verx[MAXINT];  //定义顶点

    int arcs[MAXVER][MAXVER]; //定义弧

	int vernum,arcsnum;//定义最大顶点数 和弧

	GraphKind kind;  //类别

}MGraph;



int visited[MAXVER]={0};  //顶点刚开始都没被访问过 



//查找顶点在数组中的下标

int locate(MGraph G,verType ch){

	int i;

    for(i=0;i<G.vernum&&ch!=G.verx[i];i++);

	return i;

}



//创建无向网

status createUDN(MGraph &G,int &v)

{

	int i,j,w,k;

	verType ch1,ch2;

	printf("请输入无向网的顶点数和弧数:格式如2 3\n");

	scanf("%d%d",&G.vernum,&G.arcsnum); 

	fflush(stdin);

	printf("请输入顶点符号:\n");

	for(i=0;i<G.vernum;i++){

		scanf("%c",&G.verx[i]);

		fflush(stdin);

	}

	for(i=0;i<G.vernum;i++){

		for(j=0;j<G.vernum;j++)

			G.arcs[i][j]=MAXINT;  //赋初值为无穷大

	}

	printf(" 请输入顶点符号和权值:格式A B 3\\n \n");

	for(i=0;i<G.arcsnum;i++){

		printf("请输入第%d对值\n",i+1);

	scanf("%c %c %d",&ch1,&ch2,&w);  //输入顶点符号和权值

	fflush(stdin); 

	k=locate(G,ch1);   //获得顶点下标

	j=locate(G,ch2);

	G.arcs[k][j]=w;  //为临界矩阵赋值

	G.arcs[j][k]=G.arcs[k][j];  //无向图为对称矩阵

	}

	return OK;

}



//创建有向网

status createDN(MGraph &G,int &v)

{

	int i,j,w,k;

	verType ch1,ch2;

	printf("请输入有向网的顶点数和弧数:格式如2 3\n");

	scanf("%d%d",&G.vernum,&G.arcsnum); //  顶点数和弧数输入

	fflush(stdin);  //清除回车

	printf("请输入顶点符号:\n");

	for(i=0;i<G.vernum;i++){

		scanf("%c",&G.verx[i]);   //顶点符号输入

		fflush(stdin);

	}

	for(i=0;i<G.vernum;i++){

		for(j=0;j<G.vernum;j++)

			G.arcs[i][j]=MAXINT;  //赋初值为无穷大

	}

	printf(" 请输入顶点符号和权值:格式A B 3\\n \n");

	for(i=0;i<G.arcsnum;i++){

		printf("请输入第%d对值\n",i+1);

	scanf("%c %c %d",&ch1,&ch2,&w);  //输入顶点符号和权值

	fflush(stdin); 

	k=locate(G,ch1);   //获得顶点下标

	j=locate(G,ch2);

	G.arcs[k][j]=w;  //为临界矩阵赋值

//	G.arcs[j][k]=G.arcs[k][j];  //无向图为对称矩阵

	}

	return OK;

}



//进行深度优先遍历

void DFS(MGraph G,int v){  //参数 1 图 2传递进来下标 

	int i;

    printf("%c ",G.verx[v]); 

	visited[v]=1;

	for(i=0;i<G.vernum;i++)

		if(visited[i]==0 && G.arcs[v][i]<MAXINT){ //类型的判断  是否被访问过 是否是权值或边

		    DFS(G,i);

		}

}





//进行图的遍历

void DFSTravers(MGraph G){ 

	int i;

	for(i=0;i<G.vernum;i++){ 

	  visited[i]=0;

	}

	for(i=0;i<G.vernum;i++){ 

		if(visited[i]==0)

			DFS(G,i);

	}

}



int main()

{

	MGraph G;

	int v=0;

	if(createUDN(G,v)){//创建无向图

		printf("遍历结果为:\n");

	   DFSTravers(G);  //进行无向图的遍历

	}

	if(createDN(G,v)){//创建有向图

		printf("遍历结果为:\n");

	   DFSTravers(G);  //进行有向图的遍历

	}

	return 0;

}

有向网 无向网的创建(数组表示法) 和深度优先访问

你可能感兴趣的:(数组)