DFS非递归实现图的遍历

                   代码还要自己敲呢,越敲越熟练,自己也就慢慢有感觉了,反正有时候的那感觉真的好难受啊,那种感觉就是高三后半期的感觉,颓废的不能再颓废了,糜烂的不能再糜烂,什么事情都不要敷衍了,什么事要做就做好,不做就不做,要做就从现在开始做,不要在一拖再拖了,,,,,,,

            这个代码还在舍友的帮助下敲出来的,不会了就问吧,代码:

 

            

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define n 10

#define max 32678

int visited[n]={0}; //定义全局变量

typedef struct{
	char vertex[n];
	int array[n][n];
	int numVertex,numEdge;
}adjMatrix;
typedef struct {
	int  top;
    int   data[n];
}stack;


void  visit(adjMatrix ,int );
int NextAdjVertex(adjMatrix G,int vo,int w);
int NextAdjVertex(adjMatrix G,int vo,int w);
void initstack(stack **s)
{   
	*s=(stack *)malloc(sizeof(stack));
    memset(*s,0,sizeof(**s));
	(*s)->top=-1;
}
void push(stack *s,int v)
{   
    
    s->top++;
	s->data[s->top]=v;
}

int empty(stack *s)
{
    if(s->top==-1)
        return 0;
    else
		return 1;
}
int pop(stack *s,int *v)
{
   if(!empty(s))
       return 0;
   else
   {
      *v=s->data[s->top];
	   s->top--;
        return 1;
   }
}
void visit(adjMatrix G,int vo)
{   
	printf("%c ",G.vertex[vo]);
}

int FirstAdjvertex(adjMatrix G,int vo)
{
     int j;
	    for(j=0;j<G.numVertex;j++)
			if(G.array[vo][j]<max)
				return j;

    return -1;
}
int NextAdjVertex(adjMatrix G,int vo,int w)
{
    int j;
		for(j=w+1;j<G.numVertex;j++)
             if(G.array[vo][j]<max)
				 return j;
	return -1;
}


void  CreateadjMatrix(adjMatrix *G){
	int i,j;
	int vn,vm,weight;
	printf("请你输入顶点的个数和边数: ");
	scanf("%d%d",&G->numVertex,&G->numEdge);
	for(i=0;i<G->numVertex;i++)
	   for(j=0;j<G->numVertex;j++)
        G->array[i][j]=max;
	for(i=0;i<G->numVertex;i++)
	{
	    getchar();
		printf("\n请你输入%d个顶点信息: ",i+1);
		scanf("%c",&G->vertex[i]);
	}
	for(i=0;i<G->numEdge;i++)
	{   
		printf("请你输入Vi到Vj的顶点信息和权值 vn,vm,weight :");
        scanf("%d%d%d",&vn,&vm,&weight);
		G->array[vn][vm]=weight;
		G->array[vm][vn]=weight;
	}

}


void DFS(adjMatrix G,int vo)
{   
	int v,w;
	stack *s;
	initstack(&s);
    push(s,vo);
	
    while(empty(s))
	{
        pop(s,&v);
		if(!visited[v])
		{
			visit(G,v);
			visited[v]=1;
		}
		w=FirstAdjvertex(G,v);
		while(w!=-1)
		{
			if(!visited[w])
                push(s,w);
			w=NextAdjVertex(G,v,w);
		}

	}
}
void TravelG(adjMatrix G)
{
	int v;
    for(v=0;v<G.numVertex;v++)
		if(!visited[v])
           DFS(G,v);
	printf("\n");
}
int main()
{
    adjMatrix G;

	CreateadjMatrix(&G);

	TravelG(G);
  
	return 0;
}


DFS非递归实现图的遍历_第1张图片

 

 

你可能感兴趣的:(DFS非递归实现图的遍历)