Merron Tecleab Ответов: 2

Как изменить предложение с помощью связанных списков?


Привет,

Поэтому я пытаюсь перевернуть предложение, не меняя буквы строки. Например, при вводе в поле: я-&ГТ;" "- и GT;л>Я-&ГТ;к-&ГТ;е-&ГТ;" "-&ГТ;п->Я-&ГТ;е-&ГТ;нуль , на выходе должен быть выход: р->Я-&ГТ;е-&ГТ;" "- и GT;л>Я-&ГТ;к-&ГТ;е-&ГТ;" "->Я-&ГТ;нуль. Мой код seg. ошибки в последней букве предложения, и я не могу понять, почему.

void List:: reverseList() {
  ListNode * prevNode = NULL;
  ListNode * currNode = head; 
  ListNode * spaceNode = NULL;
  while(currNode != NULL) {
    cout << "CurrNode: " << currNode -> value << endl;
    if(currNode -> next -> value == '-' || currNode -> next == NULL) {
      spaceNode = currNode -> next;
      currNode -> next = spaceNode;
      if(prevNode != NULL) {
	spaceNode -> next = prevNode;
      }
      prevNode = spaceNode -> next;
      currNode = currNode -> next;
    }
    else {
      currNode = currNode -> next;	
    }
  }
}


Что я уже пробовал:

Я попытался изменить условия if-оператора, чтобы мой код мог попытаться пройти через него для последней буквы введенного предложения.

Garth J Lancaster

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

Я предполагаю (всегда опасно), что это какое - то задание/домашнее задание, где вы должны использовать свой собственный список-иначе вы просто использовали бы реализацию списка STL и стандартный обратный итератор с rbegin && rend, да ?

Я думаю, что вы должны использовать "улучшить вопрос" и показать код, который строит список, а также прокомментировать, почему существуют prevNode/curNode и особенно spaceNode

Я не уверен, какую среду разработки вы используете, но вы также должны быть в состоянии выделить строку, которая вызывает исключение (и она почти наверняка будет иметь нуль там, где вы не ожидаете), "одним шагом" через код - отладка-это полезный навык

2 Ответов

Рейтинг:
2

Patrice T

Ваш кодовый набор СНиПов неполон, поэтому мы не можем его запустить, это усложняет любой тест, который мы можем сделать. Остается только угадать недостающие части кода, а затем угадать, что делает код, просто прочитав его.
Единственный инструмент, который может вам помочь, - это отладчик.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
2

Mircea Neacsu

Как сказала Патрис, не очень понятно, что именно List является. Предполагая, что это похоже на std::list, фрагмент ниже работает:

void reverse (const list<char>& in, list<char>& out)
{
  auto pi = in.begin ();
  auto pchar = out.begin ();

  while (pi != in.end ())
  {
    if (*pi != ' ')
      pchar = out.insert (pchar, *pi)++;
    else
      pchar = out.insert (out.begin(), *pi);
    pi++;
  }
}