无向图邻接表的深度优先遍历

#include<stdio.h>  
#include<malloc.h>  
#define Max 50  
int visited[Max];
//边表节点  
typedef struct EdgeNode  
{  
    int adjvex;//储存对应顶点的下标  
    int weight;//用于储存权值  
    struct EdgeNode * p;//指向下一个边表节点  
}EdgeNode;  
  
//顶点表节点  
typedef struct VertexNode  
{  
    int date;//数据  
    EdgeNode * p;//指向边表节点  
}VertexNode;  
//图节点  
typedef struct Graph  
{  
    VertexNode agjList[Max];//顶点表数组  
    int numVextexes,numEdges;//当前顶点数和边数  
}Graph;  
//创建图的邻接表结构  
void GreateGraph(Graph * G)  
{  
    int i,j,k;  
    EdgeNode * e;  
    printf("输入顶点数和边数");  
    scanf("%d %d",&G->numVextexes,&G->numEdges);   
    for(i=0;i<G->numVextexes;i++)//输入顶点信息  
    {  
		 printf("输入顶点的信息:"); 
        scanf("%d",&G->agjList[i].date);  
        G->agjList[i].p=NULL;  
    }  
    /* 
    1>利用头插法 
    2>因为无向图没有方向,所以创建边表节点的时候,要重复创建两次 
    并进行相反的操作 
    */  
    for(k=0;k<G->numEdges;k++)//建立边表  
    {  
        printf("输入边(Vi,Vj)的下标i和j的值:");  
        scanf("%d %d",&i,&j);  
        e=(EdgeNode *)malloc(sizeof(EdgeNode));//动态分配空间来储存边表节点  
        e->adjvex=j;  
        e->p=G->agjList[i].p;  
        G->agjList[i].p=e;  
        e=(EdgeNode *)malloc(sizeof(EdgeNode));  
        e->adjvex=i;  
        e->p=G->agjList[j].p;  
        G->agjList[j].p=e;  
    }  
}  
void DFS(Graph G,int i)
{
	EdgeNode * p;
	visited[i]=1;//表示已经被访问
	printf("%d\n",G.agjList[i].date);
	p=G.agjList[i].p;
	while(p)
	{
		if(visited[p->adjvex]==0)
		{
			DFS(G,p->adjvex);
		}
		p=p->p;
	}
}
void DFS_search(Graph G)
{
	int i;
	//初始化标志为0代表该顶点没有被访问
	for(i=0;i<G.numVextexes;i++)
	{
		visited[i]=0;
	}
	//判断是否被访问,如果未被访问,就执行深度遍历操作
	for(i=0;i<G.numVextexes;i++)
	{
		if(visited[i]==0)
		{
			DFS(G,i);
		}
	}
}
int main()
{
	Graph G;
	GreateGraph(&G);
	DFS_search(G);
	return 0;
}

说明:

 我在编写代码的时候发现了如果我顶点里面是存放的是char类型的数据的话,代码在执行过程中,会出现错误,我表示很疑问!

我会尽快找出这个问题;

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