我正在尝试定义一组模板类来表示C ++中的搜索树 在 find 方法中,我需要返回节点的指针(表示为指针),该指针包含给定的键;通过这种方式,我将重用 find 方法来实现插入和删除。
template <class K, class R>
struct Node {
K key;
R record;
inline Node(K k, R r) {
this->key = k;
this->record = r;
}
};
template <class K, class R>
struct BST_Node : public Node<K,R> {
BST_Node<K,R> *sx;
BST_Node<K,R> *dx;
inline BST_Node(K key, R record)
: Node<K,R>(key, record) {
this->sx = NULL;
this->dx = NULL;
}
BST_Node<K,R> **find(K k) {
BST_Node<K,R> **p = k < this->key ? &this->sx : &this->dx;
while (*p && k != (*p)->key)
p = k < (*p)->key ? &(*p)->sx : &(*p)->dx;
return p;
}
/* other methods */
};
只有一个小问题:如果密钥在根目录中会怎样? 我无法返回&amp; this because this,我该怎么办?
原因是因为我想使用指针指针是这样我可以返回NULL指针的地址,所以对于插入我可以这样写:
BST_Node<K,R> *insert(K k, R r) {
BST_Node<K,R> **p = this->find(k);
if (*p == NULL) //if the search fails
*p = new BST_Node<K,R>(k, r);
return *p;
}
答案 0 :(得分:0)
你不清楚。 在您的情况下,Pointer this 的类型为
BST_Node<K,R>* const
这意味着你无法改变方向(我不知道如何具体描述它,就像指针指示的地址一样......)。如果您返回
//BST_Node<K,R>**
return &this;
这意味着您可以通过返回值更改 this 的值。不允许这样做。所以发生错误。
为什么你必须在这里返回双指针?
我看到了你的版本,我想你可以在函数find()中返回一个NULL,表示你在root上找到了密钥。编写递归 find 函数时会有点复杂,但由于您使用了循环,因此只需在find函数的第一个处添加if语句即可。在插入函数中这样写:
if (p == NULL) //if returns the root
/*do sth.*/
只是一个提示,我不会在root用户保存任何数据,而且当我使用树时,我的树根通常会和树一样长。
答案 1 :(得分:-1)
我认为你应该更多地重读这个笔记。
问题在于&amp; this位于内存中的某个位置,它指向当前对象“you'in”(您的代码正在执行的当前对象范围)。
返回&amp;这将指向你的代码所在的当前对象,这不是你想要的(它实际上取决于编译器,我从来没有读过编译器的任何“承诺”,在这种情况下返回任何值) ,它不符合C ++标准)
解决方案很简单:
void* tothis = malloc(sizeof(void*)); // allocate memory that will survive leaving the current scope
tothis=this; // copy the current object memory address to the object
return &tothis; // return what you want
请不要忘记随后释放tothis的内存地址(这样你就不会有泄漏)。