Основная проблема заключается в том, что вы освобождаете узлы сразу после вставки их в дерево ...
arvore = insere(arvore, aux);
fprintf(fout, "Cliente %s cadastrado\n", aux->nome);
//printf("Cliente %s cadastrado\n", aux->nome);
//printf("%s\n", arvore->nome);
free(aux->nome);
free(aux);
Чтобы иметь дерево, у вас должна быть память для узлов, и эта память должна сохраняться,Бесконечный цикл вызван повторным использованием старых узлов, которые были неправильно освобождены, и в итоге вы получаете узел, который указывает на себя, и цикл обхода вращается.
Обновление : нормальноЯ нашел еще кое-что ...
Во-первых, ваша функция удаления пыталась освободить узел дважды, один раз внутри функции, а затем снова в main()
.
В другом случаеВаш код, возможно, был в порядке, но я не понял его, поэтому я заменил код в remover (), который вызывается в конце условий, когда есть и левая, и правая ссылка.Смотрите фрагмент ниже.Вы должны проверить это, поскольку ваша версия, возможно, была более правильной.
} else {
p = raiz->esq;
p2 = raiz->dir;
free(raiz);
return insere(p, p2);
}
Вам нужно будет заранее объявить insere()
или изменить его порядок с помощью remover()
.
И, наконец,хотя пример вывода ясно показывает, что вам будет будет предложено удалить несуществующий ключ, на самом деле вы не проверили NULL-возврат из buscar()
, который взрывает программу.Код, который я добавил, точно не создает указанный вывод, но я уверен, что вы можете это исправить:
} else if (strcmp(str, "Remover") == 0) {
fscanf(fin, "%d", &chave);
//printf("O Programa vai remover o no de chave %d\n", chave);
aux = buscar(arvore, chave);
char *s = aux == NULL ? "no such key" : aux->nome;
fprintf(fout, "Cliente %s removido\n", s);
//printf("Cliente %s removido\n", aux->nome);
arvore = remover(arvore, chave);
Обновление 2: моя версия tree.c здесьPastebin .