Правильно ли я удаляю элемент из цепочки?
От: Dale_ee Эстония www.ammyui.com
Дата: 10.03.04 11:26
Оценка:
_Section *s = m_Section;
    _Section *prev,*next;
    
    while(s)
    {
        if(s->next)
        {
            if(s->next->id == sid)
            {
                prev = s;
                if(s->next->next)
                {
                    next = s->next->next;
                }
                            
                delete s->next;
                prev->next = next;
                break;
            }
        }
    }

Вроде как работает, но хотелось бы удостовериться. Я в таких вещах ещё совсем новичок
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: Правильно ли я удаляю элемент из цепочки?
От: Dale_ee Эстония www.ammyui.com
Дата: 10.03.04 11:30
Оценка:
Здравствуйте, Dale_ee, Вы писали:


D_>
D_>_Section *s = m_Section;
D_>    _Section *prev,*next;
    
D_>    while(s)
D_>    {
D_>        if(s->next)
D_>        {
D_>            if(s->next->id == sid)
D_>            {
D_>                prev = s;
D_>                if(s->next->next)
D_>                {
D_>                    next = s->next->next;
D_>                }
                            
D_>                delete s->next;
                prev->>next = next;
D_>                break;
D_>            }
D_>        }
D_>    }    
D_>

D_>Вроде как работает, но хотелось бы удостовериться. Я в таких вещах ещё совсем новичок
Кроме того, что я забал поставить s = s->next; в конце цикла Это просто очепятка.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Правильно ли я удаляю элемент из цепочки?
От: Ozone Россия  
Дата: 10.03.04 12:16
Оценка:
typedef struct Turn *pTurn
struct Turn{
  /*...*/
  pTurn prev, next;
}

/*...*/
p->prev = p->next; // p - указывает на эл-т, который хотим удалить
free(p);
Re[3]: Правильно ли я удаляю элемент из цепочки?
От: Dale_ee Эстония www.ammyui.com
Дата: 10.03.04 12:19
Оценка:
Здравствуйте, Ozone, Вы писали:

O>
O>typedef struct Turn *pTurn
O>struct Turn{
O>  /*...*/
O>  pTurn prev, next;
O>}

O>/*...*/
p->>prev = p->next; // p - указывает на эл-т, который хотим удалить
O>free(p);
O>


У меня нет prev в структуре.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: Правильно ли я удаляю элемент из цепочки?
От: Ozone Россия  
Дата: 10.03.04 12:22
Оценка:
Здравствуйте, Dale_ee, Вы писали:

D_>У меня нет prev в структуре.


Дык, сделай — это не сложно
Re: Правильно ли я удаляю элемент из цепочки?
От: Pashka R. Украина  
Дата: 10.03.04 16:13
Оценка:
[ccode]
_Section *s = m_Section;
if(s) {
if(s->id == sid) {
// сохраняешь новый корень
root = s->next;
delete s;
} else {
for(; s->next; s = s->next->next)
if(s->next->id == sid) {
_Section *s1 = s->next;
s->next = s1->next;
delete s1;
break;
}
}
}
[ccode]

правильно, но мне кажется что так будет красивее (и первый ты тоже удилишь, если надо).

а prev — не нужен. двусвязный список вообще используй если это действительно надо... почти всегда можно обойтись односвязным
-----
Best regards, Pashka R. <pashka@land.ru>
ICQ: 860730
Re[2]: Правильно ли я удаляю элемент из цепочки?
От: Pashka R. Украина  
Дата: 10.03.04 16:14
Оценка:
сорри....

_Section *s = m_Section;
if(s) {
if(s->id == sid) {
// сохраняешь новый корень 
root = s->next;
delete s;
} else {
for(; s->next; s = s->next->next) 
if(s->next->id == sid) {
_Section *s1 = s->next;
s->next = s1->next;
delete s1;
break;
}
}
}
-----
Best regards, Pashka R. <pashka@land.ru>
ICQ: 860730
Re[3]: Правильно ли я удаляю элемент из цепочки?
От: Pashka R. Украина  
Дата: 10.03.04 16:16
Оценка:
_Section *s = m_Section;
if(s) {
    if(s->id == sid) {
        // сохраняешь новый корень 
        root = s->next;
        delete s;
    } else {
        for(; s->next; s = s->next->next) 
            if(s->next->id == sid) {
                _Section *s1 = s->next;
                s->next = s1->next;
                delete s1;
                break;
            }
    }
}



, пора пойти покурить
-----
Best regards, Pashka R. <pashka@land.ru>
ICQ: 860730
Re[2]: Правильно ли я удаляю элемент из цепочки?
От: Ozone Россия  
Дата: 11.03.04 06:15
Оценка:
Здравствуйте, Pashka R., Вы писали:

PR>а prev — не нужен. двусвязный список вообще используй если это действительно надо... почти всегда можно обойтись односвязным


Можно, но геморойно (это мое мнение) — хотя бы на примере того же удаления.
С prev можно сделать все в одно действие, а без него тратиться, как мне кажется, драгоценное время.
Re[3]: Правильно ли я удаляю элемент из цепочки?
От: Pashka R. Украина  
Дата: 11.03.04 10:24
Оценка:
Здравствуйте, Ozone, Вы писали:

O>Можно, но геморойно (это мое мнение) — хотя бы на примере того же удаления.

O>С prev можно сделать все в одно действие, а без него тратиться, как мне кажется, драгоценное время.

ну это на любителя времени тратиться столько же, просто ты удаляешь текущий элемент, а я следущий — таже самая фигня... а вот лишнее поле...

двусвязный список может помочь, если ты удаляешь не по контенту, а по указателю... во всех остальный — излишество... но это мое мнение
-----
Best regards, Pashka R. <pashka@land.ru>
ICQ: 860730
Re: Правильно ли я удаляю элемент из цепочки?
От: Кодт Россия  
Дата: 14.03.04 15:00
Оценка:
Здравствуйте, Dale_ee, Вы писали:

struct chain
{
    chain* next; // NULL если это последнее звено
    something meaningful;
};

void remove_it(chain* start, chain* it) // удалить it из цепочки
{
    if(start == NULL || it == NULL) return;

    while(start != NULL && start->next != it)    // ищем звено, предшествующее удаляемому
        start = start->next;

    if(start != NULL && start->next == it)
    {
        start->next = it->next;
        it->next = NULL;
        delete it;
    }
}

template<class Pred> // bool()(const chain&)
void remove_if(chain* start, Pred pred)
{
    // удаляем головные элементы...
    while(start != NULL && pred(*start))
    {
        chain* it = start;
        start = it->next;
        it->next = NULL;
        delete it;
    }
    
    while(start != NULL)
    {
        while(start->next != NULL && pred(*start))
        {
            chain* it = start->next;
            start->next = it->next;
            it->next = NULL;
            delete it;
        }
        start = start->next;
    }
}
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.