![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 56
|
![]()
Здравствуйте, у меня имеется класс очередь. Подскажите пожалуйста, как реализовать для этого класса функцию добавления элемента в середину и функцию удаления элемента из середины?
Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,367
|
![]()
Меня мучают сомнения и вот решил встрять.
1. Есть некоторое количество понятий для описания динамических структур: - стек; - очередь, дек; - список; - дерево. Для каждого такого понятия есть перечень операций. Стек - можно положить в стек и извлечь из стека. Очередь - можно добавить элемент в хвост, удалить элемент с головы. Дек - очередь у которой хвост и голова имеют одинаковый набор операций: добавить или удалить. Операции добавление/удаление элемента в середине не предусмотрены. Список - добавление элемента в любое место или удаление из любого места. Элементы списка обладают таким понятием, как ключ. Например, можно удалить элемен, ключь которого равен заданному или вставить элемент до/после элемента с заданным ключем. И т.д. Т.о. Ваша просьба не может быть просто так выполнена. Сначала надо определить, с какой структурой работаете и, в Вашем случае, что такое середина очереди. Как-то так ...
Как-то так, ...
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 56
|
![]()
Тогда извиняюсь, перепутал классы) Мне нужно вот это
Ну в принципе, так как здесь класс "Очередь" построен на основе списка, то можно и для этого класса создать эти функции?) |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 56
|
![]()
Сможет кто нибудь помочь?
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
Первое: невелика премудрость удалить элемент, на который мы указываем (что, собственно, с успехом продемонстрировано в DeleteFirstNode). Единственное - при удалении элемента из середины нужно "связать" предыдущий со следующим. "Наивное" решение: посчитать элементы в очереди
Код:
Код:
Код:
Вставка - аналогична, только после previous нужно вставить новый элемент. Обратите внимание, что в последнем цикле нет проверок на previous==NULL: то, что мы не дойдём до конца списка, гарантируется условием на target. В чём проблема с таким подходом? Ну, в том, что приходится проходить по списку дважды. Если список будет длинным, мероприятие может малость затянуться, а это нехорошо. Что можно сделать? Добавить инвариант класса: некоторое утверждение, которое верно для любого объекта класса, каким бы конструктором он ни был создан и какие бы методы для него ни вызывались. В настоящий момент у нас есть один инвариант класса: последовательность выражений first, first->next, first->next->next, ... представляет из себя последовательность корректных адресов структур Node, завершаемую NULL. Чуть присмотримся к этому утверждению: оно верно после создания класса всеми нашими конструкторами и, если оно было верно для объекта перед вызовом любого из наших методов, то (к чему мы приложили усилия) оно верно и тогда, когда мы этот метод покидаем. Обратите внимание: в середине Queue::DeleteFirstNode() это утверждение нарушается (first указывает на удалённую область памяти), но, пока мы не решаем проблем с многопоточностью, это не страшно - "снаружи" наш инвариант сохраняется всегда. Так вот, добавим-ка мы в класс ещё один инвариант: "член класса count содержит значение, равное количеству ненулевых адресов в последовательности first first->next, ...". Действие первое: добавляем член класса. Код:
Код:
Всё, теперь из нашего удаления среднего элемента подсчёт длины очереди можно выкинуть: мы её уже знаем. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 56
|
![]()
Спасибо, очень полезно, но я изначально не правильно сформулировал название темы, т.е. мне нужны функции удаляющие и добавляющие элемента в любое место списка, не обязательно в середину, например указать индекс элемента и функция его удаляет, тоже самое с добавлением, указать индекс элемента и перед / за ним вставить элемент. Только не могу понять как можно это реализовать, ведь тут нет индексов элементов как в массиве?
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Функция для удаления отрицательных элементов из одномерного массива.С++. | DIQUON | Помощь студентам | 0 | 21.12.2012 22:25 |
добавить в середину массива n элементов | Lerris | Общие вопросы C/C++ | 0 | 16.12.2011 21:50 |
добавить в середину массива n элементов | Lerris | Общие вопросы C/C++ | 2 | 14.12.2011 21:47 |
Макрос добавления\удаления людей в табель | madex | Microsoft Office Excel | 5 | 31.03.2011 18:20 |
обработчики добавления и удаления в дерево (TreeView) | kayman | Компоненты Delphi | 10 | 08.03.2010 11:17 |