二叉树,C语言

时间:2010-10-02 21:15:48

标签: c binary-tree

代码在这里: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 个答案:

答案 0 :(得分:3)

主要问题是您在将节点插入树后立即释放节点...

                            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()或撤销其订单。

最后,虽然示例输出清楚地表明您要求删除不存在的密钥,但实际上您没有检查buscar()的NULL返回炸毁了该计划。我添加的代码并没有精确地创建指定的输出,但我相信你可以解决这个问题:

                    } 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 is here at pastebin版本。