代码在这里: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用于重新布局。
答案 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版本。