В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
1 | ||||||
Реализовать двунаправленный список в духе списка из STL11.02.2011, 20:37. Показов 6387. Ответов 44
Метки нет (Все метки)
Все-таки видимо у меня всегда останутся с этим проблемы.
Само определение скидывать не буду, я пытаюсь сделать, что-то вроде STL-ного списка. Спросить хочу только одно.
Хотя вообще как я понял это для однонаправленного только катит... А вот как сделать для двунаправленного - второй день догнать не могу.
0
|
11.02.2011, 20:37 | |
Ответы с готовыми решениями:
44
Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) Двунаправленный список. Отрицательные элементы списка перенести в начало списка Двунаправленный список - реализовать работу с данными о ПК Реализовать пользовательский класс "Двунаправленный список"; реализовать добавление и удаление элементов |
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
11.02.2011, 20:53 | 2 | |||||
Ну так вы перед тем, как tail'у присваивать tmp, установите в tmp prev-указатель на tail.
Добавлено через 2 минуты Т.е. так:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
11.02.2011, 20:56 [ТС] | 3 |
silent_1991, Офигеть... столько проколебался а все так просто... шок)
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
11.02.2011, 20:56 | 4 | |||||
Ссылки на предыдущий элемент нет, потому что ты её не устанавливаешь.
Опоздал...
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
11.02.2011, 21:01 | 5 |
ForEveR, когда списки пишешь - очень удобно на бумажке рисовать квадратики и стрелочки, соответствующие установке связок в алгоритме. Вот так нарисовал стрелочки и увидел, что одной не хватает - сразу понятно, что надо добавить. Попробуйте)))
Не по теме: С "Ну так вы перед..." как-то грубовато вышло, извиняюсь)))
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
11.02.2011, 22:21 [ТС] | 6 | |||||
Ниже код. Есть несколько вопросов.
Не могу понять как сделать push_back/front через итераторы. Не получается. Хотелось бы увидеть простой пример на одну из данных функций. функция back() - выдает ошибку, ибо end() у меня указывает на элемент за последним, то есть tail->next. Так как tail->next == 0 то --end() не выходит, ибо curr=curr->prev где curr == tail->next, вследствие чего - ошибка. Как исправить? Ну и плоховато дело с erase. Буду благодарен за помощь.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
11.02.2011, 23:47 | 7 |
ForEveR, если я не ошибаюсь, std::list является кольцевым двусвязным списком, и при этом даже когда он пуст, в нём присутствуют два элемента — начало и конец. А новые элементы при добавлении встраиваются между ними. Таким образом решается проблема с итераторами.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
11.02.2011, 23:55 [ТС] | 8 |
volovzi, Не очень хочется делать список кольцевым... Есть какая-то другая возможность, без переделывания списка?
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
12.02.2011, 00:00 | 9 |
Точно не скажу, но список в стл всё-таки по-моему не кольцевой. А то, что все его элементы вставляются между start (первым элементом) и end (фиктивным элементом, следующим за последним) - это да. Собственно, я и не понимаю, как список с такими параметрами может быть кольцевым (когда есть чёткое начало и, хоть и фиктивный, но всё же конец).
1
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
12.02.2011, 00:01 | 10 |
ForEveR, как сделать без зацикливания так сходу не соображу, надо подумать.
Добавлено через 1 минуту Вот цитата из СБШ: Код
a %list conceptually represented as * @code * A <---> B <---> C <---> D * @endcode * is actually circular; a link exists between A and D. The %list * class holds (as its only data member) a private list::iterator * pointing to @e D, not to @e A! To get to the head of the %list, * we start at the tail and move forward by one. When this member * iterator's next/previous pointers refer to itself, the %list is * %empty. @endif
2
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
12.02.2011, 00:03 | 11 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
12.02.2011, 00:28 [ТС] | 12 |
То есть, чтобы закольцевать, должен быть фиктивный элемент, при этом фиктивный элемент - элемент за последним и фикт элем->next указывает на голову списка? При этом должен ли head->prev указывать на фикт элемент?
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
12.02.2011, 00:29 | 13 |
ForEveR, да, так там сделано.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
12.02.2011, 00:33 [ТС] | 14 |
volovzi, Это ответ на оба вопроса?
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
12.02.2011, 00:39 | 15 |
Ага, на оба.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
12.02.2011, 00:42 [ТС] | 16 |
Можешь приблизительно показать реализацию и использование такого фиктивного элемента? А то у меня что-то совсем туго...
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|||||||||||
12.02.2011, 13:50 | 17 | ||||||||||
Сообщение было отмечено как решение
Решение
Если совсем приблизительно, то будет выглядеть примерно так:
Добавлено через 11 часов 36 минут Хм, я erase неправильно написал. Так будет неправильно работать. Добавлено через 43 минуты Сложность в том, что, функция «erase» удаляет узел, на который в данный момент ссылается итератор, и из-за этого итератор в дальнейшем не может быть изменён из-за того, что его узел ссылается на нули. Как это реализовано в СБШ пока не понял. Видимо, там какой-то небольшой сборщик мусора, который удаляет уже неиспользуемые узлы. Добавлено через 19 минут Придумал, как мне кажется, приемлимое решение: итератор запоминает указатели на следующий и предыдущий узлы на стадии инициализации, и поэтому удаление текущего узла на работа не сказывается:
3
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
13.02.2011, 00:59 [ТС] | 18 |
volovzi, Однако действительно красиво. Попробую, спасибо
Добавлено через 34 минуты Очень сильно помогло. Спасибо! Даже с алгоритмами пашет. Прекрасно. Буду доделывать дальше. Буду спрашивать, если не смогу справится. Спасибо огромное)
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
13.02.2011, 01:06 | 19 |
Да не за что, самому интересно.
Добавлено через 4 минуты Только нужно в удаления и добавлениях исправить корректировку размера списка, я там в нескольких местах забыл это сделать.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||
13.02.2011, 01:50 [ТС] | 20 | |||||||||||||||
volovzi, Я пока с конструкторами занимаюсь. Ща разберусь и дальше продолжу) Спасибо огромное за помощь
Добавлено через 13 минут Не могу понять вот такой фигни... Есть два конструктора.
Добавлено через 6 минут Решилось все вот таким способом
0
|
13.02.2011, 01:50 | |
13.02.2011, 01:50 | |
Помогаю со студенческими работами здесь
20
Двунаправленный список: элементы добавляются и просматриваются с конца, а удаляются с начала списка STL: реализовать кольцевой упорядоченный двусвязный список Реализовать удаление элемента из пользовательского класса "Двунаправленный список" реализовать без применения STL, абстрактные типы данных (по одной программе для каждого из типов) список, стек Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |