Код Visual Studio 2017 не выводится после определенной строки - PullRequest
0 голосов
/ 03 ноября 2018

Я пишу программу, которая берет 8 введенных пользователем целых чисел и составляет из них связанный список. У меня программа распечатывает связанный список, затем я удаляю последний узел и распечатываю список в обратном порядке. По пути я тестировал программирование, чтобы убедиться, что каждая часть работает, и она работала до момента печати оригинального связанного списка.

Когда я закончил писать код для модификации и затем печатать деталь, я столкнулся с проблемой - программа не выдаст ничего после распечатки исходного списка. Так, например, если я введу 1,2,3,4,5,6,7,8, будет выведено: 1 2 3 4 5 6 7 8 и это все. Я пытался поставить cout << "testing"; в разных точках, чтобы увидеть, где мой код перестает выводить, а последняя точка, где он успешно выводится, находится прямо перед циклом while. </p>

Я не уверен, почему цикл while приведет к тому, что программа прекратит выводить что-либо, даже произвольное выражение cout, которое не имеет ничего общего с самим циклом while, поэтому я решил спросить здесь. Я использую Visual Studio 2017, если это поможет. Спасибо за любую помощь!

#include <iostream>
using namespace std;

void getdata(int & info); //function that assigns a user inputted value to each node
const int nil = 0;
class node_type         // declaration of class
{
public:
    int info;
    node_type *next;
};

int main()
{
    node_type *first, *p, *q, *r, *newnode;
    first = new node_type;
    newnode = new node_type;
    int info;
    getdata(info); //first node
    (*first).info = info;
    (*first).next = nil;
    getdata(info); //second node
    (*newnode).info = info;
    (*first).next = newnode;
    (*newnode).next = nil;
    p = newnode;
    for (int i = 2; i < 8; i++) //nodes 3-8
    {
        newnode = new node_type;
        getdata(info);
        (*newnode).info = info;
        (*p).next = newnode;
        p = newnode;
        (*newnode).next = nil;
    }
    q = first;
    while (q != nil) // printing linked list
    {
        cout << (*q).info << "\n";
        q = (*q).next;
    }

    //deletes last node then reverses list
    p = first;
    q = (*p).next;
    r = (*q).next;

    if (first == nil) //if list is empty
        cout << "Empty list";
    else if ((*first).next == nil) //if list has one node
        first = nil;
    else if (r == nil) //if list has two nodes
        q = nil;
    else //general case
    {
        (*first).next = nil; //last line where when i put a cout << ""; it prints in the output window
        while ((*r).next != nil)
        {
            (*q).next = p;
            (*r).next = q;
            p = q;
            q = r;
            r = (*r).next;
        }
        (*q).next = p;
        first = q;
    }
    q = first;
    while (q != nil) // printing newly modified list.
    {
        cout << (*q).info << "\n";
        q = (*q).next;
    }
    return 0;
}
void getdata(int & info)
{
    cout << "Enter number: \n";
    cin >> info;
}

1 Ответ

0 голосов
/ 04 ноября 2018
else //general case
{
    (*first).next = nil; //last line where when i put a cout << ""; it prints in the output window
    while ((*r).next != nil)
    {
        (*q).next = p;
        (*r).next = q;
        p = q;
        q = r;
        r = (*r).next;
    }
    (*q).next = p;
    first = q;
}

Вы попадаете в бесконечный цикл при обращении вашего списка. Вот почему он ничего не выводит.
Как только вы связываете элемент 2 с элементом 3, вы связываете элемент 3 с элементом 2 на следующем шаге.
Это приводит к бесконечному циклу при переборе списка и обращении его назад.

Правильный способ обратить его в общем случае будет выглядеть так:

else //general case
{
    node_type* current = first;
    node_type* next = first->next;

    (*first).next = nil; //last line where when i put a cout << ""; it prints in the output window
    while (next)
    {
        node_type* temp = next->next;
        next->next = current;
        current = next;
        next = temp;
    }

    first = current;
}

В sidenote вы должны использовать bla->foo для разыменования вместо (*bla).foo.

...