Двоичное дерево, язык Си - PullRequest
0 голосов
/ 03 октября 2010

код здесь: http://pastebin.com/9vswg7b0

здесь возможный ввод:

Inserir Jose 30264221 15
Inserir Carlos 304 1
Inserir Maria 887745 7
Inserir Paulo -147 -8 
Inserir Isabel 7845 38 
Inserir Ana 4578 5
Inserir Danilo 5474 4
Inserir Jose 3641 36
Inserir Pedro 1234 1
Remover 4
Remover 1
Remover 12
Buscar 14
Buscar 5
Imprimir in
Fim

Inserir Tiago 1245 2
Remover 2
Imprimir pre
Fim

вывод должен быть:

Conjunto #1
Cliente Jose cadastrado
Cliente Carlos cadastrado
Cliente Maria cadastrado
Cliente Paulo cadastrado
Cliente Isabel cadastrado
Cliente Ana cadastrado
Cliente Danilo cadastrado
Cliente Jose cadastrado
Cliente com a chave 1 ja existe
Cliente Danilo removido
Cliente Carlos removido
Cliente com a chave 12 nao existe
Cliente nao encontrado
Nome: Ana, Telefone  4578
Visita in
Altura=0, Nome: Paulo, Telefone -147
Altura=1, Nome: Ana, Telefone 4578
Altura=0, Nome: Maria, Telefone 887745
Altura=2, Nome: Jose, Telefone 30264221
Altura=0, Nome: Jose, Telefone 3641
Altura=1, Nome: Isabel, Telefone 7845
Conjunto #2
Cliente Tiago cadastrado
Cliente Tiago removido
Visita pre
Banco de Dados vazio

Программа неработая правильно, он заканчивается каким-то бесконечным циклом.В чем дело?Я поставил несколько printf для отладки.

1 Ответ

3 голосов
/ 03 октября 2010

Основная проблема заключается в том, что вы освобождаете узлы сразу после вставки их в дерево ...

                            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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...