#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 ложно, оно переходит к третьему, в котором предполагается распечатать список.
Кто устанавливает последний узел рядом с NULL?
При n = новый узел; n-> next не NULL, но не определено, в версиях отладки обычно это 0xcccccccc или что-то подобное, чтобы сделать видимым, что оно не инициализировано. Если вы попытаетесь разыменовать его, вы получите нарушение прав доступа.
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 >> номер)