Я реализую кодировщик Хаффмана. Деревья Хаффмана строятся снизу вверх с использованием очереди приоритетов. У меня есть простой класс узлов с указателями на два других узла. Цикл, который строит дерево:самоопределения узла в цикле enqueing
while(q.size() > 1)
{
huffnode n1 = q.top();
q.pop();
huffnode n2 = q.top();
q.pop();
q.push(huffnode((char)0, n1.freq+n2.freq, &n1, &n2));
}
Оставшийся узел, когда цикл завершается корень дерева.
Этот код выглядит достаточно невинно, но на моем тестовом входе он дает дерево, где правый ребенок корня указывает на себя и на левый дочерний корень, а не на два узла, которые только что выскочили из очереди. Я подтвердил, что очередь сортируется правильно.
Я думаю, что n1 и n2 являются локальными переменными, которые всегда имеют один и тот же адрес, как показано в отладчике. Когда новый узел нажат, он указывает на эти адреса. Когда этот узел появляется позже, его копия попадает в один из этих адресов, один из которых он уже указывает, поэтому он указывает на себя.
Как это исправить? Я не могу сделать n1 и n2 указателей, потому что тогда они должны быть const
так сверху() возвращает константную ссылку, и назначая результат сверху() к константной ссылке или константный указатель делает очередь неизменна.
Адреса '& п1, & n2' аннулируются после' while' цикл влево. Вы имеете дело с оборванными указателями (что бы вы ни делали). –
Если это так, то почему я могу следовать указателям root после завершения цикла? – BenK