Списки
struct Node
{
int Value;
bool Key;
Node *Up;
Node *Down;
Node *Next;
Node *Prev;
};
и вот ф-я удаления:
void Del(Node **f_node)
{
Node *t_node=*f_node;
...
//тут я связываю разорваную цепь
...
t_node=NULL;
delete t_node;
}
У меня получается, что цепь связана, узел как бы удален, но на самом деле он не удаляется..
По идее при создании нового узла он должен размещатся по адресу удаленого, но он размещается по другому адресу.
Я провел эксперемент: создал 200 узлов, глянул в диспечере сколько объема занимает прога, а потом удалил.. и как ни странно, объем программы увеличился.. ИМХО, так не должно быть. Может я не правильно удаляю? Подскажите, plz.
void Del(Node **f_node)
{
...
t_node=NULL;
delete t_node;
}
Может я не правильно удаляю? Подскажите, plz.
Посмотри что делает delete - фактически ты обнуляешь указатель, а потом удаляешь объект на который он указывает; а он уже ни на что не указывает.
По идее при создании нового узла он должен размещатся по адресу удаленого...
Не обязательно, за время прошедшее после удаления этот адрес, например, уже может быть занят. Нельзя делать предположений относительно адреса.
ПС: тему стоило разместить не здесь
Вот к примеру моя структура узла:
struct Node
{
int Value;
bool Key;
Node *Up;
Node *Down;
Node *Next;
Node *Prev;
};
и вот ф-я удаления:
void Del(Node **f_node)
{
Node *t_node=*f_node;
...
//тут я связываю разорваную цепь
...
t_node=NULL;
delete t_node;
}
У меня получается, что цепь связана, узел как бы удален, но на самом деле он не удаляется..
По идее при создании нового узла он должен размещатся по адресу удаленого, но он размещается по другому адресу.
Я провел эксперемент: создал 200 узлов, глянул в диспечере сколько объема занимает прога, а потом удалил.. и как ни странно, объем программы увеличился.. ИМХО, так не должно быть. Может я не правильно удаляю? Подскажите, plz.
Переделай ссылку предыдущего элемента на слудующий, минуя удаляемый. А затем удали узел. При этом не будет происходить копирования данных
Переделай ссылку предыдущего элемента на слудующий, минуя удаляемый. А затем удали узел. При этом не будет происходить копирования данных
Связать предыдущий и следующий не проблема.. проблема, как правильно удалить.. поменял местами
delete t_node;
t_node=NULL;
Теперь начало создавать по тому же адресу, но память по прежнему не овобождает..
t_node=NULL;
delete t_node;
Скорей всего наоборот. Т.е. сперва delete, а потом NULL.
{
if(f_node->Up!=NULL)
f_node->Up->Down = f_node->Down;
if(f_node->Down!=NULL)
f_node->Down->Up = f_node->Up;
if(f_node->Next!=NULL)
f_node->Next->Prev = f_node->Prev;
if(f_node->Prev!=NULL)
f_node->Prev->Next = f_node->Next;
delete f_node
}
...
t_node=NULL;
delete t_node;
Скорей всего наоборот. Т.е. сперва delete, а потом NULL.
{
if(f_node->Up!=NULL)
f_node->Up->Down = f_node->Down;
if(f_node->Down!=NULL)
f_node->Down->Up = f_node->Up;
if(f_node->Next!=NULL)
f_node->Next->Prev = f_node->Prev;
if(f_node->Prev!=NULL)
f_node->Prev->Next = f_node->Next;
delete f_node
}
Я пременную типа Node объявляю как указатель.. по-этому в функции объявляю как указатель на указатель, иначе я не удалю нужный узел. А во-вторых у меня структура немного сложней, по-этому я по другому связываю разорваную цепь.
На счет
delete t_node;
Я же написал, что поменял..
У меня сомнение на счет деспечера, может не нужно на него полагаться.
...
у меня структура немного сложней, по-этому я по другому связываю разорваную цепь.
...
Если структура немного сложней, расскажи нам об этом по подробней.
...
У меня сомнение на счет деспечера, может не нужно на него полагаться.
А кто такой "деспечер" ? :D
Если структура немного сложней, расскажи нам об этом по подробней.
А кто такой "деспечер" ? :D
Деспечер задач (Alt_Ctrl_Del)
а вот удаление:
{
short int i(0);
if(f_node->Next!=NULL) i++;
if(f_node->Up!=NULL) i+=2;
if(f_node->Down!=NULL) i+=4;
if(f_node->Prev!=NULL) i+=8;
return i;
}
//-------------------
void Del(Node **f_node)
{
Node *t_node=new Node;
if(Index(*f_node)==0)
cout<<"List has one node!\n";
else
{
t_node=*f_node;
switch(Index(*f_node))
{
case 1:
*f_node=(*f_node)->Next;
(*f_node)->Prev=NULL;
break;
case 2:
*f_node=(*f_node)->Up;
(*f_node)->Down=NULL;
break;
case 3:
(*f_node)->Up->Down=(*f_node)->Next;
(*f_node)->Next->Up=(*f_node)->Up;
*f_node=(*f_node)->Next;
(*f_node)->Prev=NULL;
break;
case 4:
*f_node=(*f_node)->Down;
(*f_node)->Up=NULL;
break;
case 5:
(*f_node)->Down->Up=(*f_node)->Next;
(*f_node)->Next->Down=(*f_node)->Down;
*f_node=(*f_node)->Next;
(*f_node)->Prev=NULL;
break;
case 6:
(*f_node)->Up->Down=(*f_node)->Down;
(*f_node)->Down->Up=(*f_node)->Up;
*f_node=(*f_node)->Down;
break;
case 7:
(*f_node)->Up->Down=(*f_node)->Next;
(*f_node)->Down->Up=(*f_node)->Next;
(*f_node)->Next->Up=(*f_node)->Up;
(*f_node)->Next->Down=(*f_node)->Down;
*f_node=(*f_node)->Next;
(*f_node)->Prev=NULL;
break;
case 8:
*f_node=(*f_node)->Prev;
(*f_node)->Next=NULL;
break;
case 9:
(*f_node)->Prev->Next=(*f_node)->Next;
(*f_node)->Next->Prev=(*f_node)->Prev;
*f_node=(*f_node)->Next;
break;
default: cout<<"Index error! ["<<(*f_node)->Value<<", "<<Index(*f_node)<<"]\n";
}
delete t_node;
t_node=NULL;
}
}
//-------------------
2. Node *t_node=new Node; - утечка памяти
3. Коммент, только к одной case
(*f_node)->Up->Down=(*f_node)->Next;
(*f_node)->Next->Up=(*f_node)->Up;
*f_node=(*f_node)->Next;
(*f_node)->Prev=NULL;
break;
1. Есть 16 вариантов, а не 10.
Только 10.. попробую объяснить свою структуру..
[]-[]-..-[]
|
[]-[]-..-[]
|
..
|
[]-[]-..-[]
2. Node *t_node=new Node; - утечка памяти
Как избежать этой утечки?
Только 10.. попробую объяснить свою структуру..
[]-[]-..-[]
|
[]-[]-..-[]
|
..
|
[]-[]-..-[]
Как избежать этой утечки?
просто объявить
Node *t_node;
Или совместить две команды
Node *t_node = *f_node;
Только 10.. попробую объяснить свою структуру..
[]-[]-..-[]
|
[]-[]-..-[]
|
..
|
[]-[]-..-[]
Как избежать этой утечки?
А зачем тебе тогда четыре указателя в узле (Up, Down, Next, Prev)? Разве не проще сделать обычный одно- или дву-направленный список списков? Тем более, что классы для работы со связными списками широко распространены, и доступны в ms VC++.
Пользуй готовые классы, и избавишься от утечек.
А зачем тебе тогда четыре указателя в узле (Up, Down, Next, Prev)? Разве не проще сделать обычный одно- или дву-направленный список списков? Тем более, что классы для работы со связными списками широко распространены, и доступны в ms VC++.
Пользуй готовые классы, и избавишься от утечек.
Таково задание.. так что двусвязный список тут не катит..