Помощь с двусвязным списком в C ++ - PullRequest
0 голосов
/ 21 мая 2011

так что у меня возникли небольшие проблемы, когда я обдумываю эту проблему.Я создал двусвязный список под названием 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 РЕДАКТИРОВАТЬ РЕЗУЛЬТАТ: только что реализованный при написании этого примера, программа должна знать, находится ли искомый номер ближе к вершине или снизу.

не ищу решения, просто помощь.

Ответы [ 2 ]

0 голосов
/ 21 мая 2011

Просто любопытно ... есть ли причина не использовать контейнерный класс STL?

Вам действительно нужно изобретать велосипед? У вас есть требование, которое, по вашему мнению, STL не может выполнить? Как вы думаете, вы можете кодировать «лучше», чем STL? Возможно, вы пишете код для встроенного устройства или неизвестного процессора без поддержки STL?

Даже если не STL, вы рассматривали Boost ++?

Возможно, вы задаете не тот вопрос здесь ... возможно, вам следует спросить себя, можете ли вы сэкономить время, затрачиваемое на дальнейшие разработки, чтобы заново изобрести колесо.

0 голосов
/ 21 мая 2011

Если я правильно интерпретирую то, что вы подразумеваете под «свопом», вам нужно реализовать сплайсинг списка . Вы можете переместить диапазон в начале списка в новый список, затем переместить его обратно в конец исходного списка, или вы можете сделать все сразу. Последнее только немного сложнее, в основном с точки зрения предварительных условий, что точка вставки не находится в пределах перемещаемого диапазона.

Пример с std :: list :

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 .../
...