/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* push_ants.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/06 11:37:56 by tmaze #+# #+# */ /* Updated: 2019/04/09 18:54:54 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "lem_in.h" t_ants *add_ant(t_ants **ants, int nb_ant, int nb_path, t_ind **paths) { t_ants *new; t_ants *it; if ((new = (t_ants*)ft_memalloc(sizeof(t_ants))) != NULL) { new->nb_ant = nb_ant; new->nb_path = nb_path; new->nb_node = paths[nb_path]->index; new->end = 0; new->next = NULL; if (*ants == NULL) *ants = new; else { it = *ants; while (it->next) it = it->next; it->next = new; } } return (new); } void del_ants(t_ants **ants) { t_ants *tmp; while (*ants) { tmp = *ants; *ants = (*ants)->next; ft_memdel((void**)&tmp); } } t_node *get_node(t_lmdata *data, int index) { t_node *it; it = data->nodes_data; while (it && it->ind != index) it = it->next; return (it); } void push_ants(t_lmdata *data, t_ind **paths, int nb_paths) { t_ants *ants; t_ants *it; t_ants *tmp; int i; int ant_c; char has_start[nb_paths]; ant_c = 1; ants = NULL; ft_bzero(has_start, nb_paths); if (add_ant(&ants, ant_c, 0, paths) == NULL) return ; ant_c++; has_start[0] = 1; while (ants) { i = 0; while (i < nb_paths) { if (ant_c <= data->nbants && !has_start[i]) { if (add_ant(&ants, ant_c, i, paths) == NULL) { del_ants(&ants); return ; } ant_c++; has_start[i] = 1; } i++; } it = ants; while (it) { ft_printf("L%d-%s", it->nb_ant, get_node(data, it->nb_node)->name); if (get_node(data, it->nb_node)->next) it->nb_node = get_node(data, it->nb_node)->next->ind; else it->end = 1; if (it->next) ft_putchar(' '); else ft_putchar('\n'); has_start[it->nb_path] = 0; it = it->next; } it = ants; while (ants && ants->end) { it = ants; ants = ants->next; ft_memdel((void**)&it); } it = ants; while (it && it->next && it->next->end) { tmp = it->next; it->next = tmp->next; ft_memdel((void**)&tmp); } } }