深度优先遍历

来源:互联网 发布:淘宝支付可以用花呗吗 编辑:程序博客网 时间:2024/04/29 21:46
//深度优先遍历(depth_first_search)#include "stdio.h"#include "string.h"#include "stdlib.h"#define MAX_VERTEX_NUM 20//最大的顶点数//边结点typedef struct Edge {struct Edge *next;//指向下一个边的指针int index;//该边所依赖的顶点的位置}Edge;//顶点typedef struct  {char name[10];//顶点的名字Edge * first;//指向依赖该顶点的第一条边}Vertex;typedef struct  {int ver_num;//顶点的数int edge_num;//边数Vertex vertexs[MAX_VERTEX_NUM];}Undigraph;//根据名字找到顶点的位置int get_location (Undigraph *ud,char * name) {int i;for (i = 0;i < ud->ver_num;i++) {if (0 == strcmp(name,ud->vertexs[i].name)) {return i;}}return -1;}//创建一个边Edge* new_edge () {Edge *edge = (Edge*)malloc(sizeof(Edge));if (NULL == edge) {exit(-1);}edge->next = NULL;return edge;}//建立无向图void create_undigraph (Undigraph * ud) {int k,i,j;char v1[10],v2[10];Edge *edge = NULL;scanf ("%d%d",&(ud->ver_num),&(ud->edge_num));//输入顶点数和边的数量//初始化顶点for (k = 0;k < ud->ver_num;k++) {scanf("%s",ud->vertexs[k].name);ud->vertexs[k].first = NULL;}//初始化边for (k = 0; k < ud->edge_num;k++) {scanf ("%s %s",v1,v2);i = get_location (ud,v1);j = get_location (ud,v2);edge = new_edge ();edge->index = j;edge->next = ud->vertexs[i].first;ud->vertexs[i].first = edge;edge = new_edge ();edge->index = i;edge->next = ud->vertexs[j].first;ud->vertexs[j].first = edge;}}//返回下标为v的顶点的第一个邻接点,有返回,没有返回NULLEdge* first_adjacent_vertex (Undigraph *ud,int v) {if (v < 0 || v >= ud->ver_num) {return NULL;}return ud->vertexs[v].first;}//返回edge后的第一个邻接点,有返回,没有返回NULLEdge* next_adjacent_vertex (Edge *edge ) {if (NULL == edge) {return NULL;}return edge->next;}//用于记录顶点是否被访问过的标志数组int visited[MAX_VERTEX_NUM];void depth_first_search (Undigraph *ud) {int i;memset (visited,0,sizeof(visited));//初始化visited,0表示没有访问过,1表示访问过for (i = 0;i < ud->ver_num;i++) {if (visited[i] == 0) {one_depth_search(ud,i);}}}void one_depth_search (Undigraph *ud,int v) {Edge *edge = NULL;visited[v] = 1;printf ("%s-",ud->vertexs[v].name);edge = first_adjacent_vertex (ud,v);while (NULL != edge) {if (0 == visited[edge->index]) {one_depth_search(ud,edge->index);}edge = next_adjacent_vertex(edge);}}int main () {Undigraph ud;create_undigraph (&ud);depth_first_search (&ud);return 0;}


原创粉丝点击