Удаление элементов из конца списка, Си |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Удаление элементов из конца списка, Си |
18192123 |
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Как можно удалить определённое число элементов из конца односвязного линейного списка?
|
volvo |
Сообщение
#2
|
Гость |
Я тебе уже говорил: пробегать по ВСЕМУ списку, считать число элементов в нем, потом сначала отсчитывать столько, сколько должно остаться, а остальные - удалять...
|
18192123 |
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Я тебе уже говорил: пробегать по ВСЕМУ списку, считать число элементов в нем, потом сначала отсчитывать столько, сколько должно остаться, а остальные - удалять... Я не пойму, как это сделать... попробывала иначе (берём 2 подряд элемента, пусть p1 и p2. продвигаем их по списку пока p2 не станет нулём. значит,p1 - указатель на последний, этот элемент можно удалять. и так 5 раз) - не получилось....ничего не выводится в файл ( а должны быть оставшиеся элементы)
|
volvo |
Сообщение
#4
|
Гость |
Цитата Я не пойму, как это сделать... Как-то вот так:for(n = 0, p = lst; p; p = p -> next, n += 1); |
18192123 |
Сообщение
#5
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Так? (по-моему у меня сново что-то не то...) А вывод оставшегося в списке с последующим освобождение динамической памяти правильный:
|
volvo |
Сообщение
#6
|
Гость |
Цитата по-моему у меня сново что-то не то Естественно... Ты же удаляешь элемент T, а потом у уже удаленного переходишь по указателю next? Так нельзя... Надо так, например:(T=p) -> next = NULL; |
18192123 |
Сообщение
#7
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Естественно... Ты же удаляешь элемент T, а потом у уже удаленного переходишь по указателю next? Так нельзя... Надо так, например: (T=p) -> next = NULL; Ага..теперь поняла А теперь, чтобы вывести оставшиеся элементы, я должна в цикле идти от головы списка до последнего оставшегося элемента (а что у нас после удаления выступает в качестве него?) |
volvo |
Сообщение
#8
|
Гость |
Зачем? Ты должна идти пока указатель ненулевой, не зря же я тебе отдельно сказал, что его обязательно надо обнулить...
Добавлено через 3 мин. Стой, стой... Не так: Цитата (T=p) -> next = NULL;
Не злоупотребляй сдвоенными операциями - это очень легко приводит к ошибкам... Сообщение отредактировано: volvo - |
18192123 |
Сообщение
#9
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
|
volvo |
Сообщение
#10
|
Гость |
Ты постоянно наступаешь на те же грабли...
lst=p; Я больше не буду повторять эти прописные истины... Только в этом треде я написал правильный код минимум 4 раза, ты опять все переворачиваешь по-своему... |
18192123 |
Сообщение
#11
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
|
18192123 |
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
сделала всё, как было объяснено, но оставшиеся элементы не выводятся (а должны).
В чём же может быть причина? |
volvo |
Сообщение
#13
|
Гость |
Вот этот вариант только что у меня прекрасно отработал:
... |
Текстовая версия | 4.05.2024 18:12 |