![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
Здравствуйте. Прошу прощения за вмешательство в жизнь вашего форума. Однако хотелось бы получить пару советов.
Задание, в сущности простое - надо удалить n (в данном случае - два) повторяющихся значением элемента односвязного списка. При удалении последнего (если он равен какому-либо еще элементу) элемента программа завершает работу, выдав сообщение об ошибке. Код ниже (C++ VS 6.0):
Использовать Remove нельзя Это сообщение отредактировал(а) Thundaga - 25.5.2009, 18:19 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
что за Remove? не хотите std::list использовать? Это сообщение отредактировал(а) zim22 - 25.5.2009, 17:59 |
|||
|
||||
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
Remove - функция стандартной библиотеки, убирающая элемент с определенным значением в конец списка и не выводящая его на печать. Здесь же требуется освобождение памяти.
Проблема не в этом, а в том что при тестовых значениях вроде: 4 элемента (1 2 3 2) - программа выдаст сообщение об ошибке при запуске. Дебаггер, увы, не помогает. Хотелось бы выяснить причину ошибки и устранить её. std::list тоже не рекомендуется использовать, хм. Это сообщение отредактировал(а) Thundaga - 25.5.2009, 18:04 |
|||
|
||||
gosn1ck |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 18.4.2009 Репутация: 1 Всего: 1 |
код может быть коряв, но я новичок
![]()
останется урбать элементы, которые остануться висеть в памяти ![]() Это сообщение отредактировал(а) gosn1ck - 25.5.2009, 18:08 |
|||
|
||||
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
gosn1ck
Здравствуйте, хотелось бы вас попросить пояснить ваш вариант комментариями. Однако, спасибо за столь быстрый ответ. Сейчас постараюсь провести тесты. |
|||
|
||||
gosn1ck |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 18.4.2009 Репутация: 1 Всего: 1 |
суть такова, что я перебираю все элементы до того как встречу нужный для удалению if (p->value == val) break;, сохраняю адресс следующего элемента temp = p->pnext; и номер по счету в списке i. перебираю опять весь список до этого элемента while (y+1 < i) (другого метода в голову не пришло (: ) и меняю у него адресс следующего в списке p->pnext = temp;. получается прыжок через элемент, который мы хотим удалить, но он до сих пор висит в памяти.
|
|||
|
||||
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
gosn1ck.
Как я понял вы пытаетесь разьяснить типичный алгоритм удаления элемента, однако в выложенной программе уже присутствует вспомогательная функция:
Проблема в другом - если необходимо удалять пару элементов и один из них - последний, то происходит сбой программы. Хочется выяснить причину сбоя и возможность устранения. Однако, спасибо за помощь. |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
ничто не мешает освободить память после того, как remove переместит дубликаты в конец списка. рекомендациями можно пренебречь. |
|||
|
||||
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
zim22
Можно, однако хотелось бы все оставить максимально близко к текущему варианту. В случае с ремувом будет, конечно немного муторно - придется 2*K раз удалять последний элемент (к - число пар). Однако это самый крайний случай. Пока что хочется узнать, можно исправить ошибку, и как это сделать. Но с вами я согласен - уже давно хочется пренебречь рекомендациями и сделать как хочется, но увы, моветон. |
|||
|
||||
gosn1ck |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 18.4.2009 Репутация: 1 Всего: 1 |
может я чего не понимаю, но как вообще понять эту последовательность ? |
||||
|
|||||
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
gosn1ck
Если элемент последний - удалить и сделать его окончанием списка. |
|||
|
||||
gosn1ck |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 18.4.2009 Репутация: 1 Всего: 1 |
а зачем вообще проверять последний он или нет ?
![]() прикрутите конструтор как у меня и при удалении последнего тут q=c->ref; q будет null |
|||
|
||||
Thundaga |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.5.2009 Репутация: 1 Всего: 1 |
gosn1ck
Удаление первых и последних элементов всегда отличается от удаления остальных элементов списка. Хорошо, сейчас попробую. |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Thundaga, уточните задачу.
вам нужно удалить все дубликаты из списка?
или удалять только тогда, когда количество подряд идущих одинаковых элементов >=n ? |
|||
|
||||
gosn1ck |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 18.4.2009 Репутация: 1 Всего: 1 |
последний удаляется также как и все остальные, а первый - заменой адреса "головного" указателя. имхо
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |