Ошибка сегментации C ++ при обходе связанного списка - PullRequest
0 голосов
/ 05 апреля 2020

Я пишу программу для поиска nth до последнего узла в связанном списке. Программа выдает правильный вывод, однако, когда я запускаю программу, я получаю ошибку сегментации в строке while(fast). Когда я отлаживал программу, используя операторы print, я заметил, что while(fast) выполняется даже тогда, когда указатель fast равен NULL (то есть fast выходит за пределы списка).

Любые предложения о том, как исправить ошибку сегментации?

Вот мой код:

#include <vector>
#include <iostream>
using namespace std;

struct Node {
public:
    int data;
    struct Node* next;
};

void insert(Node*& headPtr, int val) {
    Node* temp = new Node;
    temp->data = val;
    temp->next = headPtr;
    headPtr = temp;
}

Node* mth_to_last(Node* head, int m) {
    Node* fast = head;
    Node* slow = head;

    for(int i = 0; i < m; i++) {
        fast = fast->next;
    }

    while(fast) {
        fast = fast->next;
        slow = slow->next;
    }

    return slow;   
}

int main() {  
    Node* head;

    for(int i = 10; i >= 1; i--) {
        insert(head, i);
    }

    Node* res = mth_to_last(head, 4);
    cout << res->data << endl;
}

1 Ответ

2 голосов
/ 05 апреля 2020

Это Неопределенное поведение .

Вы не инициализировали узел head перед использованием ( live ):

Node* head = nullptr;

Итак, while l oop не заканчивается, потому что head содержит некоторое значение мусора при запуске.

Кроме того, вы также не инициализируете указатель next первого узла (head). Прямо сейчас, это не вызывает проблемы, потому что это не используется. Но если вы начнете использовать это, это вызовет проблемы, то есть больше UB. Итак, вам нужно инициализировать это в конструкторе, например:

struct Node {
    Node() : data{0}, next{nullptr} {}

    int data;
    Node* next;
};

Или вы можете использовать инициализацию элемента по умолчанию следующим образом:

struct Node {
    int   data {0};
    Node* next {nullptr};
};

Обратите внимание, что видимость по умолчанию для struct равна public, поэтому вам не нужно упоминать, что, если в одной и той же struct.

нет также спецификаторов доступа private, public и protected. в C ++ вы можете сделать:

Node* next;

вместо

struct Node* next;

Вот пример с вышеуказанными изменениями: https://godbolt.org/z/uVD76J

Соответствующий поток:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...