2012-06-29 2 views
0
void insert_KD_tree(noKD **tree, Queue *queue, int counter) { 


    if ((*tree)!=NULL) { 
      *tree = new_KD_node(queue->first->pointer,NULL,NULL); 
    } 
    else if (((*tree)->pointer[counter]) > (queue->first->pointer[counter])) { 
      counter++; 
      insert_KD_tree(&(*tree)->left,queue); 
    } 
    else { 
      counter++ 
      insert_KD_tree(&(*tree)->right,queue,counter); 
    } 
    pop(queue); 
} 

Хорошо, так что это в основном функция вставки двоичного дерева, но для вставки массивов в узлы. Массивы хранятся в очереди, но у меня проблема с указателем на указатель. Когда я пытаюсь получить доступ к массиву с помощью gdb, он дает сообщение, что он не может получить доступ к ячейке памяти 0x10, но если я попытаюсь получить к ней доступ к другой функции, это покажет мне, что местоположение просто отлично, и я могу получить доступ к массиву ,Функция ввода вставки Kdtree

Я заметил, что проблема заключается в указателе на указатель, и если я накладываю только одну астерическую при вызове insert_KD_function, моя программа может без проблем обращаться к указателю tree->. Таким образом, проблема связана с указателем на указатель, он каким-то образом теряет ссылку на указатель.

Может ли кто-нибудь мне помочь?

+0

Когда вы создаете новый узел дерева, указатели 'left' и' right' инициализируются символом 'NULL'? –

ответ

0
if ((*tree)!=NULL) { 

Разве это не означает, что вы перезаписать корень, если он существует? Не должно быть == NULL?

Кроме того, вы не должны делать, чтобы kd-деревья не очень хорошо работали на обновлениях. Если у вас много обновлений, вы, вероятно, лучше с R * -tree, который сбалансирован. В противном случае обратите внимание на структуру дерева и повторно загрузите его, если он станет слишком неуравновешенным.