#c #pointers #linked-list #double
#c #указатели #связанный список #двойной
Вопрос:
итак, у меня возникли небольшие проблемы с обдумыванием этой проблемы. Я создал двусвязный список под названием dlist (который содержит вспомогательный класс linknode). У меня есть другой класс под названием DeckOps, который используется вместе со связанным списком. dlist уже содержит функции для insertFront, removeFront, insertRear, removeRear и функцию печати. В настоящее время у меня это работает, когда я передаю имя файла в DeckOps, который затем считывает файл, вводя int в каждый узел ссылки списка (вводя сзади, чтобы сохранить тот же порядок, что и в файле).
Теперь моя проблема, мне нужно иметь возможность находить число в списке, поэтому я предполагаю, что мне понадобится функция поиска. и затем мне нужно иметь возможность выбирать все, что находится под номером, и заменять это всем, что находится над номером. отдельная функция подкачки была бы хороша, я думаю? Моя главная проблема здесь заключается в том, как выбрать группу и поменяться местами с другой группой.
Спасибо
пример: 1 2 3 4 5 6 7 8 9 найти 6 найти 4 поменять местами все, что ниже 6, со всем, что выше 4 7 8 9 4 5 6 1 2 3 редактирование результата: при написании этого примера просто понял, что программе необходимо знать, находится ли искомое число ближе к верху или к низу.
не ищу решения, просто немного помощи.
Комментарии:
1. Это домашнее задание? Если нет, то почему вы не используете
std::list<>
?2. Я предлагаю вам сначала попробовать написать свою функцию find и протестировать ее полностью, прежде чем заглядывать в swap. Я чувствую, что вам следует попробовать написать find (), прежде чем обращаться к нам.
3. Выбор может быть выполнен с помощью списка, в котором вместо int хранятся указатели на узлы списка. Но что вы подразумеваете под заменой? Можете ли вы привести пример?
4. Итак, если ваш список
[1, 2, 3, 4, 5, 6]
, и вы выберете 3, станет ли это[6, 5, 4, 3, 2, 1]
(фактически перевернув список)? Или ты имеешь в виду[4, 5, 6, 3, 2, 1]
?5. я имею в виду, что если мой список содержит 1 2 3 4 5 6 7, то после того, как произойдет замена всего, что ниже 5, и всего, что выше 3, это будет 6 7 3 4 5 1 2 . функция find находится в разработке, на самом деле это не проблема.
Ответ №1:
Просто любопытства… есть ли какая-либо причина не использовать класс контейнера STL?
Вам действительно нужно изобретать велосипед? Есть ли у вас требование, с которым, по вашему мнению, STL не справится? Как вы думаете, вы можете кодировать «лучше», чем STL? Возможно, вы пишете для встроенного устройства или малоизвестного процессора без поддержки STL?
Даже если это не STL, рассматривали ли вы Boost ?
Возможно, вы задаете здесь неправильный вопрос… возможно, вам следует спросить себя, можете ли вы выделить время из остальной части вашей разработки, чтобы заново изобрести колесо.
Комментарии:
1. я мог бы использовать STL, но у меня уже был свой собственный двусвязный список из присваивания в прошлом. Итак, я решил, что создание моего собственного даст мне немного больше гибкости, чем использование в STL, кроме того, я не слишком знаком с использованием stl::list . Я думал, что могу столкнуться с проблемами при использовании списка STL из-за операций.
2. 1 Тем не менее, я настоятельно рекомендую вам отказаться от такого мышления по следующим причинам: 1) без обид, но ваш код вряд ли будет так же хорош, как STL, написанный и доработанный некоторыми настоящими профессионалами. 2) не такой гибкий. STL действительно гибкий и должен быть способен делать все, что вы захотите. Иначе зачем бы вы его выпускали? Предполагается, что это «все вещи, для всех людей». 3) потребуется меньше тестирования, чем ваш код (теоретически никакого), и он должен быть меньше и быстрее. 4) вы получите гораздо больше поддержки STL, чем ваш собственный код (и сможете искать ответы в Google вместо того, чтобы задавать вопросы)
3. 5) у вас больше шансов получить работу с опытом работы в STL (хотя списки кодирования, как правило, всплывают на собеседованиях, я не могу поверить, что профессионалы тратят деньги на это) 6) и, вероятно, самое важное — ваше время драгоценно. Не тратьте время на изобретение колеса. Потратьте это время на более интересные вещи (см. документацию 😉
4. Ваш единственный реальный аргумент в пользу кодирования вашего выигранного класса заключается в том, что изучение STL может занять слишком много времени. Но вам нужно изучить это только один раз и вы можете использовать это вечно. И он разработан так, чтобы его было легко освоить. Всего лишь мои 2 цента стоят
5. да, теперь я использую stl 🙂
Ответ №2:
Если я правильно понимаю, что вы подразумеваете под «подкачкой», вам необходимо реализовать объединение списков. Вы можете либо переместить диапазон в начале в новый список, затем переместить его обратно в конец исходного списка, либо вы можете сделать это все сразу. Последнее лишь немного сложнее, в основном с точки зрения предварительных условий, при которых точка вставки не находится в диапазоне, подлежащем перемещению.
int main() {
std::list<int> L;
for (int n = 0; n != 10; n) L.push_back(n);
std::list<int>::iterator x = std::find(L.begin(), L.end(), 6);
assert(x != L.end()); // We know this is true in this example.
std::list<int> temp;
temp.splice(temp.end(), L, L.begin(), x);
temp.splice(temp.begin(), L, x);
L.splice(L.end(), temp);
std::copy(L.begin(), L.end(), std::ostream_iterator<int>(std::cout, ", "));
return 0;
}
Вывод:
7, 8, 9, 6, 0, 1, 2, 3, 4, 5,
# ^-----^ ^--------------^
# ... swapped with .../
Комментарии:
1. но что, если я хочу сохранить больше чисел в середине, чем просто 6?
2. @adderek: Тогда сделай это. Настройте диапазоны ваших итераторов и переместите их туда, куда вам нравится. List::splice использует либо один итератор, либо диапазон (у меня есть примеры обоих выше).
3. да, я только что понял, как я мог бы это сделать, с итератором x, как у вас, и итератором y, с другим значением. оба примера по предоставленной вами ссылке? теперь, что, если бы я захотел поменять местами два числа? или, скорее, перемещать элемент вверх или вниз по списку сколько угодно раз?
4. я хотел бы вернуться сюда за помощью, у меня возникла проблема с вышесказанным, я не могу понять, как избавиться от идеи незнания того, находится ли номер, который я использую, спереди или сзади. допустим, я создаю список 1 4 5 6 2 4 7 8 и устанавливаю свой диапазон от 5 до 4, как я узнаю, какой из них находится спереди, а какой сзади? поскольку мне нужно, чтобы все внешнее менялось местами, а все в середине оставалось неизменным.