![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Toyamatokanava |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.10.2012 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Задание: постройте класс,представляющий однонаправленный список элементов, каждый из которых является структурой, состоящей из двух полей: первое некая информация, а второе- указатель на следующий элемент. Класс должен содержать методы добавить элемент , удалить элемент, выдать информацию н-ного элемента, печать значений информационных полей. Вопрос в том как в однозначном списке удалять элементы? Для меня это не однозначно), направте меня, пожалуйста.)
|
|||
|
||||
rudolfninja |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Удаление происходит просто: получаете адрес элемента, который нужно удалить; запоминаете куда-нибудь указатель на следующий после него элемент; пишите delete <адрес удаляемого элемента>; а предыдущему элементу в поле Next записываете то, что запомнили во втором пункте.
Допустим, нам надо удалить элемент to_del
Этот код должен работать при удалении всех элементов кроме первого. Для первого надо сделать проверку, что удаляемый элемент является первым и в этом случае, просто перенаправить "голову" списка на следующий элемент, а прошлую "голову" удалить.
Если все это объединять в одну функцию, то надо сделать return, после удаления первого элемента. Вообще, по спискам очень много подробной разъясняющей информации в интернете. Для своего ознакомления поищите там и прочитайте пару статеек с примерами и объяснениями. Если сами не найдете, напишите, подкину ссылок. Это сообщение отредактировал(а) rudolfninja - 23.9.2015, 10:42 |
||||
|
|||||
Toyamatokanava |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.10.2012 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Да, скиньте пожалуйста статьи, буду очень благодарен. |
||||||
|
|||||||
rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Я в свое время по этой статье разибрался в теме списков.
Вот еще нашел, на первый взгляд нормально написано, но особо не вчитывался. Удачи. Будут вопрсы - пишите сюда. |
|||
|
||||
baldina |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
1. удаление следующего за указанным. исключаем из списка, переустанавливая указатель на следующий. освобождаем память. функция возвращает новый следующий за указанным. будем использовать эту функцию во всех остальных
2. удаление первого. используем псевдо-елемент, у которого следующим будет голова (это необязательно, просто для единообразия)
3. удаление последнего. ищем предпоследний, удаляем следующий за ним.
3. удаление указанного. для удаления используем нехитрый трюк: меняем значения удаляемого и следующего за ним, после чего удаляем следующий.
Добавлено через 5 минут и 29 секунд пожалуй последнюю функцию можно сократить
|
||||||||||
|
|||||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Я, лично, выступаю против такого подхода))) Если сказано удалить текущий элемент, то и нужно удалить текущий элемент, мало ли какие связи между элементами списка и экземплярами других классов/структур в программе образуются в процессе её развития. Но в данном случае можно себе позволить. Я, собственно, просто хочу поправить: если мы решили удалять следующий вместо текущего, то тогда это будет выглядеть приблизительно так:
Это сообщение отредактировал(а) feodorv - 23.9.2015, 19:10 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Здесь мы имеем дело с ADT, поэтому особенности реализации никого не должны волновать.
нет, будет выглядеть как надо: DeleteNext(e) удаляет next->e Добавлено через 6 минут и 44 секунды однако исходя из void del(const int y), где y - явно порядковый номер, все несколько проще)) |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Вы перемещаете данные, поэтому эта особенность может как раз волновать. Указатели на элементы в вызывающей программе (если таковые были), становятся не валидными. std::list например гарантирует валидность итераторов при удалении/добавлении, чем и ценен. мне кажется это хотел сказать feodorv, (кроме того операция копирования может быть сама по себе дорога) зы по коду вроде верно. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Прошу прощения, туплю))) baldina, красиво, конечно, но я всё равно против ![]() Это сообщение отредактировал(а) feodorv - 23.9.2015, 19:27 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Toyamatokanava |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.10.2012 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Я вот чего не пойму. Допустим у нас есть 5 элементов в списке. Мы вызывая temp=temp-》next листаем до 4-го. Как мы вернемся назад, ведь список даже не кольцевой?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
такой момент есть, но он касается типа перемещаемых данных. для int мне показалось безопасным ![]() в общем случае лучше использовать swap, но это имхо усложнит понимание для ТС сам факт манипуляции данными внутри этой структуры мне кажется не слишком важным, т.к. если копирование затруднено, то должна вызывает сомнение и функция add(). кстати, вас не смущает, что vector может перемещать элементы и не сохраняет итераторы? это вопрос требований к типу, а список славен не только итераторами (которых в нашем классе кстати нет). что вы думаете насчет наличия в классе двух разных функций удаления с разными гарантиями? ломать копья тут нечего, задача сферическая, а любое решение будет иметь потенциальные недостатки. в данном случае хотелось показать, что необязательно бегать по списку. но за такую возможность надо платить, да)) |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
признаться не понял сразу истинный смысл)) да, согласен, указатели на элементы списка могут перестать указывать куда надо, это действительно может быть проблемой. злоупотребление указателями на внутренние структуры имхо неплохая попытка выстрелить себе в ногу. |
|||
|
||||
Toyamatokanava |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.10.2012 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Допустим у нас есть список и программка зашла в бесконечный цикл, которые предлагает нам либо вывести список, либо удалить какой-то элемент, либо вывести на экран определенный элемент. Допустим мы вывели элемент n из общего количества элементов N,где n<N и программка вернулась в наш бесконечный цикл. Если после этого выбрать вариант вывести на экран список, то нужно же как-то вернуться на самый первый указатель списка? Возможно вопрос пришел в связи явным непониманием темы, поправьте пожалуйста. |
|||
|
||||
Toyamatokanava |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.10.2012 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Или проще. Ввели 5 элементов. Далее вывели на экран их, значит temp будет указывать на 0 после вывода. Допустим мы хотим вывести 3 элемент, как указатель вернуть назад?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |