在二进制树中插入数据时出错
Error inserting data in binary tree
我复制了这段代码(西班牙语)http://www.elrincondelc.com/nuevorincon/index.php?pag=codigos&id=4,并写了一个新的。
这是我的代码:
#include <cstdlib>
#include <conio.h>
#include <iostream>
using namespace std;
struct nodoarbol {
int dato;
struct nodoarbol *izq;
struct nodoarbol *der;
};
typedef nodoarbol Nodo;
typedef Nodo *Arbol;
void insertar(Arbol *, int);
void inorden(Arbol);
void postorden(Arbol);
void preorden(Arbol);
void insertar(Arbol *raiz, int nuevo){
if (*raiz==NULL){
*raiz = (Nodo *)malloc(sizeof(Nodo));
if (*raiz != NULL){
(*raiz)->dato=nuevo;
(*raiz)->der=NULL;
(*raiz)->izq=NULL;
}
else{
cout<<"No hay memoria suficiente u ocurrio un error";
}
}
else{
if (nuevo < (*raiz)->dato)
insertar( &((*raiz)->izq), nuevo );
else if (nuevo > (*raiz)->dato)
insertar(&((*raiz)->der), nuevo);
}
}//inseertar
void inorden(Arbol raiz){
if (raiz != NULL){
inorden(raiz->izq);
cout << raiz->dato << " ";
inorden(raiz->der);
}
}
void preorden(Arbol raiz){
if (raiz != NULL){
cout<< raiz->dato << " ";
preorden(raiz->izq);
preorden(raiz->der);
}
}
void postorden(Arbol raiz){
if (raiz!=NULL){
postorden(raiz->izq);
postorden(raiz->der);
cout<<raiz->dato<<" ";
}
}
int main() {
int i;
i=0;
int val;
Arbol raiz = NULL;
for (i=0; i<10; i++){
cout<<"Inserte un numero";
cin>>val;
insertar( (raiz), val);
}
cout<<"nPreordenn";
preorden(raiz);
cout<<"nIneordenn";
inorden(raiz);
cout<<"nPostordenn";
postorden(raiz);
return 0;
}
我使用的是netbeans 7.1.1,mingw32编译器
这是输出:
make[2]: Leaving directory `/q/netbeans c++/NetBeansProjects/treek'
make[1]: Leaving directory `/q/netbeans c++/NetBeansProjects/treek'
main.cpp: In function 'int main()':
main.cpp:110:30: error: cannot convert 'Arbol {aka nodoarbol*}' to 'Nodo** {aka nodoarbol**}' for argument '1' to 'void insertar(Nodo**, int)'
make[2]: *** [build/Release/MinGW-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 11s)
我不明白哪里出了问题,因为我只是复制了代码(并将其重写为我自己的代码)。我真的很擅长php、asp.net(vb)和其他语言,但c对我来说是个难题
我已经和这个问题斗争了大约一个小时。有人能告诉我可能是什么吗?
for (i=0; i<10; i++){
cout<<"Inserte un numero";
cin>>val;
insertar( (raiz), val);
}
应该(至少)是:
for (i=0; i<10; i++){
cout<<"Inserte un numero";
cin>>val;
insertar( &raiz, val);
}
此外,您的插入功能会用覆盖现有节点
if (*raiz != NULL){
(*raiz)->dato=nuevo;
(*raiz)->der=NULL;
(*raiz)->izq=NULL;
}
更新:上述说法不正确。if (*raiz != NULL){}
处于以(*raiz ==NULL)
为条件的子块中。
尝试(未经测试!)删除递归。
void insertar(Arbol *raiz, int nuevo){
while (*raiz) {
if (nuevo == (*raiz)->dato) return;
raiz = (nuevo < (*raiz)->dato)
? &(*raiz)->izq
: &(*raiz)->der
;
}
*raiz = (Nodo *)malloc(sizeof(Nodo));
if (*raiz != NULL){
(*raiz)->dato=nuevo;
(*raiz)->der=NULL;
(*raiz)->izq=NULL;
}
else{
cout<<"No hay memoria suficiente u ocurrio un error";
}
}
}//inseertar
额外注释:原始代码看起来更像C而不是C++。(我不做C++)在C中,可以而不是强制转换malloc的返回,最好不要将指针隐藏在typedef后面。在C++中(有人告诉我)不应该使用malloc()。
main.cpp:10:30:错误:无法将参数"1"的"Arbol{aka nodoarbol*}"转换为"Nodo**{aka-nodoarbol*}",转换为"void insertar(Nodo*,int)"
void insertar(Arbol *raiz, int nuevo) { ... }
Arbol raiz = NULL;
替换:
- insertar( (raiz), val);
带有:
+ insertar( &raiz, val);
相关文章:
- 将数据从 std::Vector 存储到 Eigen::Vector 时出错
- 为什么双精度数据类型在C++中出错?
- 将私有数据成员作为默认参数传递给该类的公共方法时出错
- 将运算符<<与隐式转换的非基本数据类型一起使用时出错
- 使用来自串行端口的字符串数据来操作振镜扫描仪在更高的速度下会出错
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- 尝试将数据添加到结构内部的矢量时出错
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 尝试从 csv 文件输入大量数据时出错
- 为什么我在尝试从istringstream读取数据时出错
- 保存/加载C++数据时出错
- 使用矢量<数据类型>进行 arm 编译时出错
- C++中矢量中的数据存储出错
- C++中的模板仅在长数据类型上出错
- 为什么我在尝试将opencv图像数据指针转换为char*时出错
- C++executeQuery()在显示表中的MySQL数据时出错
- 使用 Boost::asio::async_send_to 发送加密数据时出错
- C++在尝试编写对象读取器时,在尝试从一个向量获取数据时出错
- 创建缓冲区以加载数据时出错