Ошибка во время выполнения: назначение нулевого указателя и аварийное завершение программы в 16-битной системе DOS

class node{
unsigned long int data;
node *lchild,*mchild,*rchild;         //childs of ternery tree
unsigned long int *stack1,*stack2;
static int count,top1,top2;
public:
node()
{
data=0;
lchild->data=0;
mchild->data=0;
rchild->data=0;
}
node(int x)
{
data=0;
lchild->data=0;
mchild->data=0;
rchild->data=0;
}
node(unsigned long int d)
{
data=d;
lchild->data=floor(d/2);
mchild->data=floor(d/3);
rchild->data=floor(d/4);
}
node(node* n)
{
data=n->data;
lchild->data=n->lchild->data;
mchild->data=n->mchild->data;
rchild->data=n->rchild->data;
}
void mallocate(int x)
{
stack1=new unsigned long int[x];
stack2=new unsigned long int[x];
}
void free()
{
delete[] stack1;
delete[] stack2;
}void storedata(node *);
void backtrack(node *);

}root,temp,*block;

-1

Решение

В этом конструкторе:

 node()
{
data=0;
lchild->data=0;
mchild->data=0;
rchild->data=0;
}

вы используете еще неинициализированные указатели lchild, mchild и rchild. Вы должны удалить эти 3 строки:

         lchild->data=0;
mchild->data=0;
rchild->data=0;

И тогда вы должны переосмыслить свой дизайн. Новый узел должен просто инициализировать себя. Вы должны построить древовидную структуру вне вашего класса узлов. Если вы настаиваете на построении чего-либо в классе узлов, вы должны правильно распределить его.

У вас есть больше методов конструктора, которые обращаются к несуществующим данным:

node(int x);
node(unsigned long int d);
node(unsigned long int d);
node(node* n);

Я бы посоветовал вам просто построить дерево … данные будут установлены в ноль для каждого узла в конструкторе со строкой, которая у вас уже есть: data=0;, Все ваши специальные вычисления должны быть помещены вне конструкторов, вы можете иметь только один конструктор node и, возможно, один для установки данных для построенного узла.

Тогда вы не вызываете метод mallocate ни в одном из ваших конструкторов, вы должны делать это во всех них. Далее вы должны сделать деструктор ~node и позвонить this->free метод из этого. В любом случае, метод имеет неоднозначное имя для стандартной свободной функции из stdlib.hЯ бы переименовал его, например, в другое cleanup,

Обычно в конструкторе вы устанавливаете все три указателя на null:

 node()
{
data=0;
lchild=NULL;
mchild=NULL;
rchild=NULL;
}

И тогда вы бы построили структуру следующим образом:

int main()
{
node n1;
node *l = new node;
n1.lchild = l;
...
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]