Поэтому я пытаюсь создать BST с помощью массива указателей. Мой алгоритм верен (проверена версия, которая не использует указатели), но при использовании приведенного ниже кода происходит следующее:
НАПРИМЕР. (проследил программу с кучей заглушек)
1. Call add(5, 1)
inserting 5 into position 1
position 1 is now 5
2. Call add(4, 1)
position 1 is now 4
moving right
inserting 4 into position 3
position 1 is now 4
...
template <typename Item> void ABTree<Item>::add(Item input, int index){
if (array[1]==0){
array[1] = &input;
size++;
}else{
if (input < *array[index]){
if (array[2*index] == 0){
array[2*index] = &input;
size++;
}else
add(input, 2*index);
}else{
if (array[(2*index)+1] == 0){
array[(2*index)+1] = &input;
size++;
}else
add(input, (2*index)+1);
}
}
Я изменил код, чтобы принять указатель на элемент, который нужно вставить.
if (array[1]==0){
array[1] = input;
size++;
}else{
if (*input < *array[index]){
if (array[2*index] == 0){
array[2*index] = input;
size++;
}else
add(input, 2*index);
}else{
if (array[(2*index)+1] == 0){
array[(2*index)+1] = input;
size++;
}else
add(input, (2*index)+1);
}
}
В коде, который вы предоставили, есть целая проблема.
Присвоение адреса временной переменной недопустимо. Переменная "input" заканчивается сразу после возврата функции add. Хранение его адреса, чем бессмысленно и приводит к почти неизбежному краху. В частности, когда вы добавляете второй элемент в свой массив, эти условия проверяют:
дает неопределенный результат и, следовательно, неопределенный поток управления.
Я не знаю тип контейнера, который вы используете, но я предполагаю, что это будет своего рода векторный или даже простой массив C. Если мое предположение верно, вы должны выполнить проверку границ перед доступом к элементам массива с индексом.
Итак, основываясь на выходе, вы добавляете следующую последовательность при добавлении второго элемента:
if (array[1]==0)
приведет к неопределенному поведению. Память по адресу может больше не быть доступной, но это не означает, что переменная, хранящая сам адрес, недоступна или что ее значение изменилось, поскольку память больше недоступна.