Правильно ли я удаляю элемент из цепочки?
_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 ;
}
}
}
Вроде как работает, но хотелось бы удостовериться. Я в таких вещах ещё совсем новичок
Re: Правильно ли я удаляю элемент из цепочки?
Здравствуйте, 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; в конце цикла
Это просто очепятка.
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]: Правильно ли я удаляю элемент из цепочки?
Здравствуйте, 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 в структуре.
Re[4]: Правильно ли я удаляю элемент из цепочки?
От:
Ozone
Дата: 10.03.04 12:22
Оценка:
Здравствуйте, Dale_ee, Вы писали:
D_>У меня нет prev в структуре.
Дык, сделай — это не сложно
Re: Правильно ли я удаляю элемент из цепочки?
[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]: Правильно ли я удаляю элемент из цепочки?
сорри....
_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]: Правильно ли я удаляю элемент из цепочки?
_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]: Правильно ли я удаляю элемент из цепочки?
Здравствуйте, 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 >>
Перекуём баги на фичи!
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить