C:执行过程中链接列表值丢失

时间:2019-03-15 14:06:05

标签: c linked-list breadth-first-search

我实际上试图在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 room1-> room2-> ....-> start,因为start的索引值为0。

下面是我的主要结构“ 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

0 个答案:

没有答案