图的深度优先遍历和广度优先遍历实现

// g1.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h> 
#include <stdlib.h>


#define fileName "book.txt"
#define ROWS    10
#define INFI    10000
#define NODES 6

typedef struct Node
{
	bool isVist;
	char name;
}Node;

typedef struct
{
	Node ver[NODES];
	int arc[NODES][NODES]; 
	int vernum;
	int arcnum;
	int kind;
}AdjMatrix;

typedef struct
{
	int que[20];
	int top;
	int tail;
}Que;

void EnterQue(Que *Q,int v)
{
	Q->que[Q->tail]=v;
	Q->tail=(Q->tail++)%10;
}
void PopQue(Que *Q,int *v)
{
	*v=Q->que[Q->top];
	Q->top=(Q->top++)%10;
}
void InitQue(Que *Q)
{
	int i=10;
	for(i=0;i<20;i++)
		Q->que[i]=0;
	Q->tail=0;
	Q->top=0;
}

bool isEmpty(Que *Q)
{
	if(Q->tail==Q->top)
		return true;
	else
		return false;
}

typedef int length;
length dest[6];
char path[6][6];
int p[6];
int flg[6];




void createG(AdjMatrix *G);
void visit(AdjMatrix *G,int v);
int Get(AdjMatrix *G,char c);
int GetNextNode(AdjMatrix *G,int v);
void BreathFristSearch(AdjMatrix *G,int v);


static int count=0;

void main(int argc, char* argv[])
{
	int j;
	AdjMatrix G;
	createG(&G);
	DepFristSearch(&G,0);
	//BreathFristSearch(&G,0);
	// for(j=0;j<6;j++)
	//	printf("到%c的距离为%d,路径为%s\n",G.ver[j].name,dest[j],path[j]);
	printf("一共调用%d次",count);
}

void initdest(AdjMatrix *G,length *des,char start)
{
	int i,j;
	int k=Get(G,start);
	for(i=0;i<6;i++)
		if(G->arc[k][i]!=INFI)
			des[i]=G->arc[k][i];
		else
			des[i]=INFI;
	for(i=0;i<6;i++)
		for(j=0;j<6;j++)
				path[i][j]='\0';
	for(i=0;i<6;i++)
	{
		flg[i]=1;
		p[i]=0;
		if(G->arc[k][i]!=INFI)
		{
			path[i][0]=start;
			path[i][1]=G->ver[i].name;
			p[i]=1;
		}

	}
}

void createG(AdjMatrix *G)
{
	char a,b;
	int x,y,num,i,j,power;
	for(i=0;i<6;i++)
	{
		G->ver[i].isVist=false;
		scanf("%c",&(G->ver[i].name));
	}
	for(i=0;i<6;i++)
		for(j=0;j<6;j++)
			G->arc[i][j]=INFI;

	int row;

	FILE * infile; 
     
    if ((infile = fopen("C:\\Users\\hp\\Desktop\\g.txt", "r")) == NULL) 
    { 
        fprintf(stderr, "Could not open data file.\n"); 
        exit(EXIT_FAILURE); 
    } 
     
    for (row = 0; row < ROWS; row++) 
	{
           fscanf(infile, "%c,%c,%d\n",  &a, &b,&power);
		   printf("%c,%c,%d\n",a,b,power);
		   	x=Get(G,a);
			y=Get(G,b);
			G->arc[x][y]=power;
			G->arc[y][x]=power;
	}
    if (ferror(infile)) 
    { 
        fprintf(stderr, "Error getting data from file.\n"); 
        exit(EXIT_FAILURE); 
    } 


}

void DepFristSearch(AdjMatrix *G,int v)
{
	count++;
	visit(G,v);
	G->ver[v].isVist=true;
	int w=GetNextNode(G,v);
	while(w!=-1)
	{
		if(w!=-1)
			DepFristSearch(G,w);
		w=GetNextNode(G,v);
	}
}
int GetNextNode(AdjMatrix *G,int v)
{
	int j=-1,i;
	for(i=0;i<10;i++)
		if(G->arc[v][i]!=INFI&&G->ver[i].isVist==false&&i!=v)
		{
			j=i;
			break;
		}
	return j;
}
void visit(AdjMatrix *G,int v)
{
	printf("访问%c\n",G->ver[v].name);
}

int Get(AdjMatrix *G,char c)
{
	int i;
	for(i=0;i<10;i++)
		if(G->ver[i].name==c)
			return i;
	return -1;
		
}

void BreathFristSearch(AdjMatrix *G,int v)
{
	int lev=1;
	visit(G,v);
	G->ver[v].isVist=true;
	Que Q1,Q2;
	InitQue(&Q1);
	InitQue(&Q2);
	EnterQue(&Q1,v);
	EnterQue(&Q2,lev);
	int w,temp;
	while(!isEmpty(&Q1))
	{

		PopQue(&Q1,&w);
		PopQue(&Q2,&lev);
		temp=GetNextNode(G,w);
		while(temp!=-1)
		{
			if(lev<4)
			{
				visit(G,temp);
				G->ver[temp].isVist=true;
				EnterQue(&Q1,temp);
				EnterQue(&Q2,lev+1);
				temp=GetNextNode(G,w);
			}

		}
	}
	
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/my_et/article/details/8853509
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞