Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Списки

10K
18 марта 2006 года
-Df-
24 / / 11.03.2006
Вот к примеру моя структура узла:
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.
16K
18 марта 2006 года
Machaon
6 / / 07.03.2006
Цитата:
Originally posted by -Df-

void Del(Node **f_node)
{
...
t_node=NULL;
delete t_node;
}
Может я не правильно удаляю? Подскажите, plz.



Посмотри что делает delete - фактически ты обнуляешь указатель, а потом удаляешь объект на который он указывает; а он уже ни на что не указывает.

Цитата:
Originally posted by -Df-

По идее при создании нового узла он должен размещатся по адресу удаленого...



Не обязательно, за время прошедшее после удаления этот адрес, например, уже может быть занят. Нельзя делать предположений относительно адреса.

ПС: тему стоило разместить не здесь

324
18 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by -Df-
Вот к примеру моя структура узла:
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.



Переделай ссылку предыдущего элемента на слудующий, минуя удаляемый. А затем удали узел. При этом не будет происходить копирования данных

10K
19 марта 2006 года
-Df-
24 / / 11.03.2006
Цитата:
Originally posted by AndreySar
Переделай ссылку предыдущего элемента на слудующий, минуя удаляемый. А затем удали узел. При этом не будет происходить копирования данных


Связать предыдущий и следующий не проблема.. проблема, как правильно удалить.. поменял местами
delete t_node;
t_node=NULL;
Теперь начало создавать по тому же адресу, но память по прежнему не овобождает..

7.9K
19 марта 2006 года
uki_
122 / / 26.01.2006
...
t_node=NULL;
delete t_node;

Скорей всего наоборот. Т.е. сперва delete, а потом NULL.
Код:
void Del(Node [color=red]*[/color]f_node)
{
  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
}
10K
19 марта 2006 года
-Df-
24 / / 11.03.2006
Цитата:
Originally posted by uki_
...
t_node=NULL;
delete t_node;

Скорей всего наоборот. Т.е. сперва delete, а потом NULL.
Код:
void Del(Node [color=red]*[/color]f_node)
{
  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 объявляю как указатель.. по-этому в функции объявляю как указатель на указатель, иначе я не удалю нужный узел. А во-вторых у меня структура немного сложней, по-этому я по другому связываю разорваную цепь.
На счет

 
Код:
t_node=NULL;
delete t_node;

Я же написал, что поменял..
У меня сомнение на счет деспечера, может не нужно на него полагаться.
991
22 марта 2006 года
Zenhipster
157 / / 14.01.2005
Цитата:
Originally posted by -Df-

...
у меня структура немного сложней, по-этому я по другому связываю разорваную цепь.
...



Если структура немного сложней, расскажи нам об этом по подробней.

Цитата:


...
У меня сомнение на счет деспечера, может не нужно на него полагаться.



А кто такой "деспечер" ? :D

10K
23 марта 2006 года
-Df-
24 / / 11.03.2006
Цитата:
Originally posted by Zenhipster
Если структура немного сложней, расскажи нам об этом по подробней.
А кто такой "деспечер" ? :D


Деспечер задач (Alt_Ctrl_Del)
а вот удаление:

Код:
short int Index(Node *f_node)
{
    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;
    }
}
//-------------------
7.9K
23 марта 2006 года
uki_
122 / / 26.01.2006
1. Есть 16 вариантов, а не 10.
2. Node *t_node=new Node; - утечка памяти
3. Коммент, только к одной case
 
Код:
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;
Что если правый сосед удаляемой вершины уже имеет верхнего соседа?
10K
23 марта 2006 года
-Df-
24 / / 11.03.2006
Цитата:
Originally posted by uki_
1. Есть 16 вариантов, а не 10.


Только 10.. попробую объяснить свою структуру..
[]-[]-..-[]
|
[]-[]-..-[]
|
..
|
[]-[]-..-[]

Цитата:
Originally posted by uki_
2. Node *t_node=new Node; - утечка памяти


Как избежать этой утечки?

7.9K
23 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by -Df-
Только 10.. попробую объяснить свою структуру..
[]-[]-..-[]
|
[]-[]-..-[]
|
..
|
[]-[]-..-[]

Как избежать этой утечки?


просто объявить
Node *t_node;

Или совместить две команды

Node *t_node = *f_node;

991
23 марта 2006 года
Zenhipster
157 / / 14.01.2005
Цитата:
Originally posted by -Df-
Только 10.. попробую объяснить свою структуру..
[]-[]-..-[]
|
[]-[]-..-[]
|
..
|
[]-[]-..-[]

Как избежать этой утечки?



А зачем тебе тогда четыре указателя в узле (Up, Down, Next, Prev)? Разве не проще сделать обычный одно- или дву-направленный список списков? Тем более, что классы для работы со связными списками широко распространены, и доступны в ms VC++.
Пользуй готовые классы, и избавишься от утечек.

10K
24 марта 2006 года
-Df-
24 / / 11.03.2006
Цитата:
Originally posted by Zenhipster
А зачем тебе тогда четыре указателя в узле (Up, Down, Next, Prev)? Разве не проще сделать обычный одно- или дву-направленный список списков? Тем более, что классы для работы со связными списками широко распространены, и доступны в ms VC++.
Пользуй готовые классы, и избавишься от утечек.


Таково задание.. так что двусвязный список тут не катит..

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог