Программа заканчивает работу с кодом ошибки 3221225477
Пытаюсь реализовать почти полное строго бинарное дерево; на вход даётся N - количество уровней, K - количество элементов на последнем уровне. Для поочерёдного добавления элементов в левое и правое поддерево используется очередь из указателей на указатели на узлы tnode **.
Программа, в теории, работает, но выдаёт ошибку 3221225477. Неоднократно с ней сталкивался, но каждый раз не могу найти причину, вызывающую эту ошибку. Прошу прощения за большое количество кода.
Реализация очереди:
#include <stdlib.h>
#include <stdio.h>
typedef struct btree_node
{
unsigned int data;
struct btree_node * left, * right;
} tnode;
typedef struct queue_node
{
tnode ** pointer;
queue_node * next;
} qnode;
typedef class queue
{
private:
qnode * begin, * end;
public:
queue ();
~queue ();
void push (tnode ** new_tnode);
tnode ** pop ();
} QUEUE;
queue :: queue ()
{
begin = end = NULL;
}
queue :: ~queue ()
{
qnode * temp = begin;
while (temp)
{
temp = begin;
begin = begin->next;
free (temp);
}
}
void queue :: push (tnode ** new_tnode)
{
qnode * element = (qnode *) malloc (sizeof (qnode));
element->pointer = new_tnode;
if (begin == NULL)
{
begin = end = element;
return;
}
end->next = element;
end = element;
}
tnode ** queue :: pop ()
{
if (begin == NULL) return NULL;
tnode ** ret_node = begin->pointer; //Дебаг ругается здесь
qnode * del_node = begin;
begin = begin->next;
if (begin == NULL) end = NULL;
free (del_node);
return ret_node;
}
Реализация дерева:
#include "queue_class_2.cpp"
#include <iostream>
typedef class binary_tree
{
private:
tnode * root;
QUEUE pointers;
public:
binary_tree ();
bool empty ();
void add_node (unsigned int data);
void print ();
} TREE;
binary_tree :: binary_tree ()
{
root = NULL;
tnode ** temp = &root;
pointers.push (temp);
}
bool binary_tree :: empty ()
{
return root == NULL;
}
void binary_tree :: print ()
{
printf ("PRINT\n");
printf ("%u %u %u\n", root->data, root->left->data, root->right->data);
printf ("PRINT\n");
}
void binary_tree :: add_node (unsigned int data)
{
tnode * new_node = (tnode *) malloc (sizeof (tnode));
new_node->data = data;
new_node->left = new_node->right = NULL;
tnode ** cur = pointers.pop ();
*cur = new_node;
tnode ** temp = &(new_node->left);
pointers.push (temp);
temp = &(new_node->right);
pointers.push (temp);
}
Основная программа (N и K считываются верно, код сократил):
void build_tree (TREE &new_tree, unsigned int N, unsigned int K)
{
if (!new_tree.empty()) return;
unsigned int n, k, max_k, count;
for (n = 0; n < N; n++)
{
max_k = 1; count = n;
while (count)
{
max_k *= 2;
count -= 1;
}
for (k = 1; k <= max_k; k++)
new_tree.add_node (n);
}
for (k = 1; k <= K; k++)
new_tree.add_node (n);
}
int main ()
{
unsigned int N, K;
TREE tree;
N = read_N ();
K = read_K (N);
build_tree (tree, N, K);
tree.print ();
return 0;
}