Я на самом деле пытаюсь реализовать алгоритм поиска в ширину в C, поскольку в качестве входных данных я беру любой граф из файла и сохраняю все узлы и вершины в структуре.Затем я создаю матрицу смежности и пробегаю все столбцы, помещаю встречающиеся узлы в стек, извлекаю их и так далее, пока у меня не появятся все пути.
Тем не менее у меня возникают проблемы с сохранением этих путей в связанном списке,и под проблемой я подразумеваю, что иногда в некоторых конкретных случаях я теряю последнее значение моего сохраненного пути (один массив int на ссылку), что довольно удивительно, поскольку оно происходит только на путях длиной 5 (я не могу проверить все длины, нодо 12 кажется, что все в порядке).
Это странно, потому что эти значения теряются при выходе из функции (я пытался отладить с использованием LLDB и в функции, которая создает ссылку, существует последний байт, но как только я покидаюфункция, это не так) и не всегда (выполнение 1 из 10 все в порядке).
Для меня это проблема 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);
}
Если здесь необходим клон всего хранилища, проблема может быть вызвана запуском программы с maptest в главном каталоге: https://github.com/Caribou123/bfs_agesp.git
Make && ./lem_in room1-> room2 -> ....-> start в качестве значения индекса start0. 0. 1020 *
Вот взгляд на мое '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