2015-11-11 6 views
-1

У меня есть список, и я хочу отображать его значения.Как отобразить все значения списка без бесконечного цикла

Я хочу видеть 1 2 3 4, но у меня есть бесконечный цикл, как 1 2 3 4 1 2 3 4 1 2..

Не могу понять, почему?

struct node 
{ 
    int item; 
    node *next; 

    node(int x, node *t) 
    { 
     item = x; 
     next = t; 
    } 
}; 

int main() 
{ 
    node *firstElement = new node(1, NULL); 
    firstElement->next = firstElement; 
    node *lastElement = firstElement; 

    for (int i = 2; i < 5; i++) 
     lastElement = (lastElement->next = new node(i, firstElement)); 

    for (node *first = lastElement; first != 0; first = first->next) 
     cout << first->item << " "; 
    delete firstElement; 
    return 0; 
} 
+1

почему бы не использовать отладчик? 'новый узел' очень плохой стиль, так как вы даже не удаляете узлы – deW1

+0

@ deW1 да, спасибо, забудьте о' delete' – dima

+1

Вы инициализируете узел с 'next' установленным' firstElement'; последний узел никогда не изменил свой указатель 'next'. –

ответ

2

Попробуйте использовать этот код:

struct node 
{ 
    int item; 
    node *next; 

    node(int x, node *t) 
    { 
    item = x; 
    next = t; 
    } 
}; 

int main() 
{ 
    node *firstElement = new node(1, NULL); 
    node *lastElement = firstElement; 

    for (int i = 2; i < 5; i++) 
    lastElement = (lastElement->next = new node(i, nullptr)); 

    for (node *first = firstElement; first != 0; first = first->next) 
    cout << first->item << " "; 

    return 0; 
} 

IdeOne live code

Проблема заключается в том, что вы установите "следующую" ссылку вашего последнего узла к самому этому узлу, не nullptr.
Кроме того, это лучше удалить память, выделенная

2

Проблема заключается в том, что ваша структура данных имеет бесконечный цикл в себя: эта линия

firstElement->next = firstElement; 

делает firstElement точку обратно к себе, создавая круговую список. Когда вы добавляете больше элементов, ваш список остается круглым, поэтому условие завершения first == 0 так и не достигнуто.

Если вы хотите, чтобы ваш список оставаться линейной, а не круговой, код вставки должен быть изменен следующим образом:

node *firstElement = new node(1, NULL); 
node *lastElement = firstElement; 

for (int i = 2; i < 5; i++) { 
    lastElement->next = new node(i, lastElement->next) 
    lastElement = lastElement->next; 
} 

Код печати должен начинаться с firstElement:

for (node *current = firstElement; current != 0; current = current->next) 
    cout << current->item << " "; 

Наконец, удаление недостаточно одного firstItem. Вам нужен цикл, чтобы пройти весь список. Кроме того, вы можете связать удаление в деструкторе, вызвав delete next, но это опасно, потому что рекурсивный вызов деструкторов может переполнить стек.

1

У вас есть петля в вашем списке, потому что lastElement->next всегда указывает на firstElement. Вот почему first никогда не будет равен 0.

Если вам действительно нужен цикл, я думаю, вы должны написать что-то вроде этого:

node* p = firstElement; 
do { 
    cout << p->item << " "; 
    p = p->next; 
} while (p != firstElement); 
1

Проблема заключается в том, что вы создаете каждый узел с firstElement как его next.
Это имело бы смысл, если бы вы добавляли узлы в начало списка, но добавляете их сзади, так что последний узел указывает на начало.

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

lastElement->next = new node(i, nullptr)) 
Смежные вопросы