Создание и печать связанного списка из пользовательского ввода Переполнение стека

#include <iostream>

using namespace std;

int main()
{
struct node
{
int data;
node * next;
};

node * head;
node * n;
node * temp;
node * q;
int number;

cout << "Enter numbers";
cin >> number;
n = new node;
n->data = number;
head = n;
temp = n;
while (cin >> number)
{
while (number != -500)
{
n = new node;
n->data = number;
temp->next = n;
temp = n;

}
}while (head != NULL)
{
cout << head->data;
head = head->next;

}
}

Я не понимаю, почему это не сработает. Программа создает новый узел, затем устанавливает все, что пользователь ввел, эквивалентный переменным данным этого нового узла, а затем устанавливает начальную и временную точки на новый узел. Затем он получает второй ввод пользователя и сравнивает его с -500, и если он оценивается как истинный, он создает новый узел, помещает данные второго ввода в переменные данные, затем связывает первый узел и второй узел, а затем создает временную точку ко второму узлу. Если условие 2-го цикла while ложно, оно переходит к третьему, в котором предполагается распечатать список.

-2

Решение

Кто устанавливает последний узел рядом с NULL?

При n = новый узел; n-> next не NULL, но не определено, в версиях отладки обычно это 0xcccccccc или что-то подобное, чтобы сделать видимым, что оно не инициализировано. Если вы попытаетесь разыменовать его, вы получите нарушение прав доступа.

0

Другие решения

while (cin >> number) { // this loop is endless, because you can always read the user input data (unless some exception happen)
while (number != -500)
{
n = new node; // you already have data allocated. no need to allocate it once more
n->data = number;
temp->next = n;
temp = n;
// as was already mentioned: set n->next to NULL
} }

если вы хотите сломать после того, как вы проверили, что число не -500, то вы можете сделать следующее:

   while (cin >> number) {
if (number != -500) { ...; // do your stuff
break;
}
}

И, кстати, у вас есть утечка памяти. Если вы используете плоские указатели C, то подумайте delete оператор, чтобы очистить вашу память. Для этого вам нужно знать, где начинается ваш список (в основном, заголовок), и перебирать весь список, вызывая delete node,

Пожалуйста, также учтите, что это плохой стиль кода, чтобы писать что-то вроде:

while (cin >> номер)

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector