233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
|||||||||||
1 | |||||||||||
Дек символов15.02.2013, 20:23. Показов 3789. Ответов 24
Метки нет (Все метки)
Доброго времени суток всем.
У меня такая проблема: есть задача - Реализовать класс "Дек символов" (на базе списка). Реализовать класс "Массив деков". Длина массива определяется во время инициализации и в дальнейшем не меняется. Массив должен хранить сами деки, а не указатели на них. Доступ к элементам массива осуществляется с помощью квадратных скобок. Начал делать, но поскольку с классами работаю впервые, то не совсем разобрался как это делать. вот моя реализация: файл L2.h
0
|
15.02.2013, 20:23 | |
Ответы с готовыми решениями:
24
дек Полный дек Простой дек Простой дек |
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
15.02.2013, 20:50 | 2 |
элемент данных next не статический. его можно взять только через объект
Добавлено через 1 минуту Эмм, так что же надо то? Добавлено через 2 минуты как я понял, L2 - класс двусвязных списков, но как вы из него собираетесь сделать дек. Что такое дек в вашем понимании?
1
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
||||||
15.02.2013, 23:54 [ТС] | 3 | |||||
С этим вроде разобрался, благодарю. Теперь другая проблема - не могу написать деструктор, точнее говоря получить доступ к полям класса L2_elem, даже после того, как L2 объявил его наследником, а поля объявил как protected. Подскажите где ошибка пожалуйста. Вот код:
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
16.02.2013, 05:35 | 4 |
покажите, что у вас получилось (и .h и .cpp). в вашем первом посте в реализации была серьезная проблема с пониманием связных структур. если вы ее не исправили, то не о чем говорить дальше
0
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
|||||||||||
16.02.2013, 19:03 [ТС] | 5 | ||||||||||
Вот файл L2.h
Добавлено через 27 минут Да, и еще у дека, в отличии от стека ссылки указывают не только на следующий элемент. но и на предыдущий
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|||||||||||
16.02.2013, 19:59 | 6 | ||||||||||
Итак, по пунктам:
1. класс L2_elem описывает узел списка. Дружественность с классом L2 тут не нужна, лучше перенесите el, next и prev в public. Этот класс всё равно используется только для поддержки списка. 2. Дек поддерживает операции вставки/удаления в начале и в конце, так что в классе L2 наряду с head нужен элемент:
Также в L2 нужны функции для вставки/удаления в начале и в конце списка (чего я у вас не вижу):
4. ну а реализаций важных функций я не вижу (я имею ввиду push'и и pop'ы) Удачи!
1
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
||||||
16.02.2013, 23:18 [ТС] | 7 | |||||
попробовал реализовать puush'и. Получилось как-то так
0
|
16.02.2013, 23:46 | 8 |
строки 8 и 17 однозначно ошибочны. зачем приравнивать хвост к голове и голову к хвосту? Чтобы они на один и тот же элемент указывали вместо первого и последнего?
А вот после добавления в голову приравнять голову к новому элементу И вот после добавления в хвост приравнять хвост к новому элементу ты забыл но так, вроде понимаешь, что такое списки.
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|||||||||||||||||||||
17.02.2013, 08:43 | 10 | ||||||||||||||||||||
1. У вас список получается с головой, судя по этому:
3. Собственно про реализацию вставок и удалений. Вижу у вас трудности с этим. Сделаем так: я напишу реализации pushHead и popTail, а вы возьмете карандаш и бумагу и попробуете разобраться (порисовать списки) в том, как это работает на пустом списке и на заполненном.
Кликните здесь для просмотра всего текста
просто в соответствующих функциях замени слова head на tail, а tail на head, то же самое сделай с prev и next
1
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
||||||
19.02.2013, 19:08 [ТС] | 11 | |||||
понять это действительно легче, но не уверен, что это пройдет по требованиям. И еще вопросик - в чем моя принципиальная ошибка?
Добавлено через 1 час 31 минуту ну вот как - то так получилось. не тестировал еще правда.
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
19.02.2013, 20:10 | 12 |
голова здесь не дает никаких преимуществ, только занимает лишнюю память
??? если вы имеете ввиду реализацию списка, то вы просто еще не разобрались как работают связные структуры, или уточните вопрос Функция поиска может и пригодиться, а вот операций вставки и удаления в середину в деке нет.
0
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
||||||
19.02.2013, 20:44 [ТС] | 13 | |||||
позволю себе с вами не согласиться - со связными списками я разобрался довольно таки неплохо - в прошлом году ради хорошей оценки на экзамене перекопал кучу литературы, правда там паскаль был, но это роли не играет. А в предыдущем сообщении несколько неправильно сформулировал вопрос - согласен.
по определению дек - это упорядоченные набор элементов, в котором добавление новых и удаление существующих элементов разрешено с обеих концов. Для дека разрешены следующие операции: 1) добавление элемента в начало; (pushHead) 2) добавление элемента в конец; (pushTail) 3) удаление элемента из начала; // вот здесь вопрос - нужно ли добавлять эти функции 4) удаление элемента с конца. // или ограничиться pop'ами? Другой вопрос, что я не совсем разобрался с языком, и с ООП в частности, но надеюсь что разберусь. И еще вот набросал вывод и получение размера, посмотрите пожалуйста, вроде это самое легкое, и тем не менее
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
19.02.2013, 20:58 | 14 |
неверно. isEmpty проверяет список на пустоту и здесь не нужен, вам в обоих функциях надо сравнивать указатель temp с нулем
Добавлено через 2 минуты а и еще его 4 пункт: pop'ы итак удаляют элементы из списка
1
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
||||||
19.02.2013, 23:07 [ТС] | 15 | |||||
согласен, с этим я грубо тупанул. Это конечно обидно, ну да ладно. Вроде теперь все робит. Теперь надо бы с конструктором копирования разобраться, деструктором и перегруженным оператором присваивания - если честно - пока не понимаю, что сие значит (оператор). на всякий случай выкладываю весь имеющийся на данный момент код
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|||||||||||
20.02.2013, 11:36 | 16 | ||||||||||
1. деструктор - это легко: это функция, которая прибирает за объектом перед его удалением. Просто пробегись циклом и удали все узлы списка.
2. конструктор копирования - слегка посложнее: надо создать копию списка на основе уже имеющегося экземпляра. Объявление конструктора копирование такое:
3. оператор присваивания - (в данной ситуации) это комбинация деструктора и конструктора копирования, т.е. сначала удаляешь все узлы из списка, а потом создаешь новый список на основе списка правого операнда. Объявление такое:
1
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
|
20.02.2013, 20:33 [ТС] | 17 |
С конструктором копирования и деструктором понятно. а вот для чего нужен оператор присваивания? Хотелось бы знать не только что делать, но и зачем.
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
||||||
22.02.2013, 11:15 | 18 | |||||
Чтобы делать вот так, например:
0
|
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
|
|||||||||||
23.02.2013, 14:33 [ТС] | 19 | ||||||||||
Благодарю, уже разобрался - на лекции объяснили.
У меня теперь другая проблема. написал конструктор копирования и деструктор - по хожу дела очень коряво. При завершении работы пишет "Необработанное исключение в "0x00a020bc" в "task3.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000004"." Посмотрите пожалуйста, чего я не так опять сделал. вот код файл L2.h
0
|
23.02.2013, 14:36 | 20 |
Попытка записи по какому-то указателю, по которому не была выделена память.
Добавлено через 2 минуты строка 43. уже сам head равен NULL нельзя значит ни к одному его полю обращаться: ни к next ни к pre ни el
0
|
23.02.2013, 14:36 | |
23.02.2013, 14:36 | |
Помогаю со студенческими работами здесь
20
Дек-шаблон Шаблонный дек Очередь и дек С++ Шаблонный дек Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |