我实际上试图在C中实现广度优先搜索算法,作为输入,我从文件中获取任何图形并将所有节点和顶点存储在结构中。 然后,我创建一个邻接矩阵,遍历所有列,将遇到的节点压入堆栈,将其弹出等等,直到获得所有路径为止。
仍然我在将这些路径存储在链表中时遇到问题,我的意思是有时候,在某些特定情况下,我会丢失存储路径的最后一个值(每个链接一个int数组),这非常令人惊讶它仅在长度为5的路径上发生(我无法测试所有长度,但最多可以测试12个)。
这很奇怪,因为这些值在函数退出时丢失了(我尝试使用LLDB进行调试,并在创建链接的函数中丢失了最后一个字节,但是一旦离开函数,它就不存在了),而且并非一直(10次执行中就可以执行一次)。
对我来说,这是一个malloc问题,因此我检查了程序中的每个malloc,以解决(未成功)该问题。检查了所有变量,并且一切都很好,除了5个长度的情况(我假设我的程序有一个“缺陷”,这种情况仅在这种情况下才明显,但是为什么?)。
我很乐意接受一些帮助,因为我没有什么要检查的东西。
这是BFS主要功能的代码:
void bfs(t_lemin *e)
{
t_path *save;
//set needed variables
set_bfs_base_var(e);
save = e->p;
while (paths_remain(e))
{
//Special Start-End case
if (e->map[e->nb_start][e->nb_end] == 1)
{
create_single(e);
break ;
}
e->x = e->nb_start;
reset_tab(e);
while (e->x != e->nb_end)
{
e->y = 0;
while (e->y < e->nb_rooms)
{
if (e->map[e->x][e->y] == 1 && !e->visited[e->y])
##push_on_stack the nodes
push_stack(e);
e->y++;
}
//go_to first elem on stack
e->x = e->stack[0];
if (e->x == e->nb_end || is_stack_empty(e->stack, e->nb_rooms - 1))
break ;
e->visited[e->x] = 1;
//set_it as visited than pop it
pop_stack(e, e->nb_rooms);
}
if (is_stack_empty(e->stack, e->nb_rooms - 1))
break ;
e->find_new[add_path(e)] = 1;
discover_more_paths(e, save);
}
print_paths(e, save);
e->p = save;
}
这里是将路径存储在链接列表中的2个函数:
void create_path(t_lemin *e, int *pa, int len)
{
int j;
j = 1;
//create_new_node if required
if (e->p->path)
{
if (!(e->p->next = malloc(sizeof(t_path))))
return ;
e->p = e->p->next;
}
//create_the_array_for_path_storing
e->p->path = malloc(sizeof(int) * len + 2);
e->p->next = NULL;
e->p->size_path = len + 2;
//copy_in_it
while (--len >= 0)
{
e->p->path[j++] = pa[len];
}
//copy_end_and_start_at_end_and_start
e->p->path[e->p->size_path - 1] = e->nb_end;
e->p->path[0] = e->nb_start;
e->nb_paths++;
}
int add_path(t_lemin *e)
{
int i;
int save;
int *path;
int next_path;
i = 0;
if (!(path = malloc(sizeof(int) * e->nb_rooms)))
exit(-1);
save = e->nb_end;
//in_order_to_save_the_path_i store the previous value of each node so I can find the path by iterating backward
next_path = -1;
while (e->prev[save] != e->nb_start)
{
path[i] = e->prev[save];
save = e->prev[save];
next_path = next_path == -1 && get_nb_links(e, path[i])
> 2 ? path[i] : -1;
i++;
}
//path_contains all values of the path except for start and end
save = i;
while (i < e->nb_rooms)
{
path[i] = 0;
i++;
}
create_path(e, path, save);
i = next_path == -1 ? path[0] : next_path;
//ft_printf("to_block : %d\n", i);
return (next_path == -1 ? path[0] : next_path);
}
如果这里需要复制整个存储库,则可以在主目录https://github.com/Caribou123/bfs_agesp.git
中使用maptest运行该程序,可以看到问题制作&& ./lem_in
下面是我的主要结构“ e”。 (它很大,不要害怕):
typedef struct s_lemin
{
int x;
int y;
char *av;
int nb_ants;
int st;
int nd;
int nb_rooms;
int nb_paths;
int max_sizep;
int nb_links;
int nb_start;
int nb_end;
int **map;
int *stack;
int *visited;
int *prev;
int *find_new;
int maxy;
int maxx;
int minx;
int conti;
int miny;
char ***saa;
struct s_rooms *r;
struct s_ants *a;
struct s_rooms **table_r;
struct s_links *l;
struct s_hash **h;
struct s_rooms *start;
struct s_rooms *end;
struct s_info *i;
struct s_path *p;
struct s_path *select_p;
}
在此先感谢您的帮助,对不起,这是我不知所措的愚蠢的malloc。
Artiom