C: значение связанного списка потеряно во время выполнения - PullRequest
1 голос
/ 15 марта 2019

Я на самом деле пытаюсь реализовать алгоритм поиска в ширину в 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

...