您的位置:首页 > 其它

图的深度优先遍历,基于邻接链表的非递归实现

2014-01-24 16:26 483 查看


测试数据基于上图,新增4->1的路径。程序存在内存泄漏。

使用时可以修改depth_first_search第二个参数,指定开始遍历的结点,只适用与连通图。如果错误,欢迎指正!!

#include <iostream>

#include <stack>

using namespace std;

/***************************************

* 图的深度优先遍历

* 基于邻接链表的非递归实现

**************************************/

typedef char vertex_t; //结点数据类型

//边结点

typedef struct _tag_edge_node_t

{

int node_num; //边终点所在数组序号

_tag_edge_node_t* next_node; //下一条边

}edge_node_t;

//顶点结点

typedef struct _tag_head_node_t

{

vertex_t data; //结点数据

edge_node_t* first_edge; //第一条边

}head_node_t;

#define MAX_NUMBER 20 //图中最大结点数目

//图结构

typedef struct _tag_graph_t

{

head_node_t head_data[MAX_NUMBER]; //顶点数组

unsigned int head_node_count; //顶点数目

}graph_t;

void create_adjacency_list(graph_t* graph)

{

edge_node_t* p_edge = NULL;

if (graph == NULL)

return;

graph->head_node_count = 6;

for (unsigned int i = 0; i < graph->head_node_count; ++i)

{

graph->head_data[i].data = 'A' + i;

graph->head_data[i].first_edge = NULL;

}

graph->head_data[0].first_edge = new edge_node_t;

p_edge = graph->head_data[0].first_edge;

p_edge->node_num = 2;

p_edge->next_node = new edge_node_t;

p_edge = p_edge->next_node;

p_edge->node_num = 4;

p_edge->next_node = new edge_node_t;

p_edge = p_edge->next_node;

p_edge->node_num = 5;

p_edge->next_node = NULL;

graph->head_data[1].first_edge = new edge_node_t;

graph->head_data[1].first_edge->node_num = 2;

graph->head_data[1].first_edge->next_node = NULL;

graph->head_data[2].first_edge = new edge_node_t;

graph->head_data[2].first_edge->node_num = 3;

graph->head_data[2].first_edge->next_node = NULL;

graph->head_data[3].first_edge = new edge_node_t;

graph->head_data[3].first_edge->node_num = 5;

graph->head_data[3].first_edge->next_node = NULL;

graph->head_data[4].first_edge = new edge_node_t;

graph->head_data[4].first_edge->node_num = 1;

graph->head_data[4].first_edge->next_node =

new edge_node_t;

p_edge = graph->head_data[4].first_edge->next_node;

p_edge->node_num = 3;

p_edge->next_node = new edge_node_t;

p_edge = p_edge->next_node;

p_edge->node_num = 5;

p_edge->next_node = NULL;

}

void depth_first_search(graph_t* graph, int start_pos)

{

stack<int> visit_node;

bool is_visit[MAX_NUMBER]; //访问标志数组

for (int i = 0; i < MAX_NUMBER; ++i)

is_visit[i] = false;

cout<<graph->head_data[start_pos].data<<endl;

is_visit[start_pos] = true;

visit_node.push(start_pos); //将第一个元素压栈

while (!visit_node.empty())

{

int num = visit_node.top();

edge_node_t* next = graph->head_data[num].first_edge;

for (; next != NULL; next = next->next_node) //存在边,且该边的终点未被访问

{

if (!is_visit[next->node_num])

{

cout<<graph->head_data[next->node_num].data<<endl;

is_visit[next->node_num] = true;

visit_node.push(next->node_num);

break;

}

}

if (next == NULL) //以该结点为起点的所有终点访问完毕

visit_node.pop();

}

}

int main(int argc, char* argv[])

{

graph_t graph;

create_adjacency_list(&graph);

depth_first_search(&graph, 0);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: