图的邻接表存储与深度优先遍历算法

#include <stdio.h>

#include <stdlib.h>

#define MAX 20 //最大顶点数

 

typedef struct node{

    int adjvex;

    struct node  *next;

 }ENode;/*表示邻接单链表结点的数据类型*/

 

typedef struct {

       int data;

       ENode* firstedge;

}VNode; /*表示邻接表表头结点的数据类型*/

typedef struct 

{

int n,e;

VNode adjlist[MAX];

}ALGraph;

/*ALGraph 表示邻接表的数据类型*/

/*—————————————————————————————————*/

/*邻接表的构建算法。根据所读入的边, 建立图的邻接表,*/

int visited[MAX] = {0} ;

void getLocal(ALGraph* g ,int *v0,int *v1){

int i =0 ;

for(i =0 ; i <g->n ;i++){

if(*v0 == g->adjlist[i].data)

*v0 =i ;

if(*v1 == g->adjlist[i].data)

*v1 =i ;

}

}

void  createalgraph (ALGraph *g)

{

int i =0 ;

int v0 =0 ;

int v1 =0 ;

ENode *p ;

printf(“输入节点数和边数(n,e):”) ;

scanf(“(%d,%d)”,&g->n , &g->e) ;

 

for(i =0 ; i <g->n ; i++){

printf(“输入第%d个节点的信息:”,i+1);

scanf(“%d” ,&g->adjlist[i].data) ;

g->adjlist[i].firstedge = NULL ;

}

 

for(i =0 ; i < g->e ; i++){

printf(“输入第%d条边v0->v1:”,i+1) ;

scanf(“%d,%d”,&v0 , &v1) ;

getLocal(g,&v0,&v1) ;

 

p = (ENode *)malloc(sizeof(ENode)) ;

p->adjvex =v1 ;

p->next = g->adjlist[v0].firstedge ;

g->adjlist[v0].firstedge =p ;

}

}

/*—————————————————————————————————*/

/*图的深度优先遍历搜索递归算法。g为存储图的邻接表,i为遍历的初始顶点编号, */

void  dfs(ALGraph* g,int i)

{

ENode *p =NULL ;

printf(“%d ” ,g->adjlist[i].data) ;

visited[i] =1 ;

p =g->adjlist[i].firstedge ;

while(p != NULL){

if(visited[p->adjvex] == 0)

dfs(g,p->adjvex) ;

p =p->next ;

}

}

void main()

ALGraph graph;

/*创建邻接表 */

createalgraph(&graph) ;

 

printf(“/n深度优先搜索结果:/n”);

/*图的深度优先遍历搜索*/

dfs(&graph,0) ;

}

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