//深度优先遍历(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的顶点的第一个邻接点,有返回,没有返回NULL Edge* first_adjacent_vertex (Undigraph *ud,int v) { if (v < 0 || v >= ud->ver_num) { return NULL; } return ud->vertexs[v].first; } //返回edge后的第一个邻接点,有返回,没有返回NULL Edge* 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; }
深度优先遍历
最新推荐文章于 2022-07-30 08:00:00 发布