Я работаю над назначением сжатия / распаковки. Я пытаюсь написать метод C ++ для построения дерева, используя следующий обход предзаказа из заголовка моего сжатого файла:
001c1b01a01e1d
0 представляет внутренний узел, а 1 представляет лист. Каждый раз, когда я создаю узел, я устанавливаю код этого узла в 0 или 1, потому что я буду использовать другой метод для декодирования дерева, и он должен знать, как пройти через разные стороны с помощью этих кодов. Всякий раз, когда я достигаю 1 в строке обхода предзаказа, я устанавливаю в поле «символ» узла следующий символ в строке предзаказа. Я не могу заставить его работать, хотя Кто-нибудь может помочь? Вот мой код («bitsToRead» просто представляет длину строки предзаказа, поэтому метод знает, когда остановиться) Спасибо!
void HCTree::buildFromHeader(ifstream& in, HCNode* n, int codeToUse) {
if( bitsToRead > 0) {
char c = in.get();
bitsToRead--;
if(c == '0') {
n = new HCNode(0, 0, 0, 0, 0, codeToUse);
if(rootSet == 0) {
root = n;
rootSet = true;
}
HCNode* left;
n->c0 = left;
HCNode* right;
n->c1 = right;
buildFromHeader(in, left, 0);
buildFromHeader(in, right, 1);
}
else {
byte symbol = in.get();
n = new HCNode(0, symbol, 0, 0, 0, codeToUse);
bitsToRead--;
n->c0 = n->c1 = NULL;
}
}
}
Кажется меняется
void HCTree::buildFromHeader(ifstream& in, HCNode* n, int codeToUse) {
в
void HCTree::buildFromHeader(ifstream& in, HCNode* &n, int codeToUse) {
сделаю работу.
Плюс rootSet
логика может быть опущена. Вы просто позвоните
buildFromHeader(in, root, codeToUse)
от звонящего.
РЕДАКТИРОВАТЬ:
Я неправильно прочитал ваш код. n = new HCNode(0, symbol, 0, 0, 0, codeToUse);
Код, сделанный мной, предлагает использовать ссылку. Потому что здесь вы хотите изменить указатель, передаваемый от предка листа ( n->c0 = left
а также n->c1 = right
материал). Чтобы все работало, в дополнение к изменениям, приведенным выше, измените
HCNode* left;
n->c0 = left;
HCNode* right;
n->c1 = right;
buildFromHeader(in, left, 0);
buildFromHeader(in, right, 1);
в
buildFromHeader(in, n->c0, 0);
buildFromHeader(in, n->c1, 0);
Это позволит вызываемому пользователю назначать значения прозрачно указатели внутри struct
используя ссылки.
Других решений пока нет …