Необработанная ошибка ожидания при реализации LinkedList в c ++ - PullRequest
0 голосов
/ 11 июля 2020

Хорошо, я пытаюсь реализовать структуру данных LinkedList, но когда я пытаюсь l oop через свой список (printNodes и функции вставки), я сталкиваюсь с ошибкой, которая гласит: «Возникло необработанное исключение: нарушение прав доступа на чтение. TmpNode было 0xCDCDCDCD ". Я чувствую, что это как-то связано с тем, что мои указатели ведут себя не так, как я думаю, но я не уверен. Мы будем очень благодарны за некоторую помощь.

#include<iostream>;
using namespace std;
struct Node {
    int data;
    Node* next;

    Node(int el) {data = el; } //constructor
    Node(int el, Node* ptr) { data = el; next = ptr; } //constructor
};

class LinkedList {

public:
    Node* head = NULL, * tail = NULL;
    void addToHead(int el) {
        head = new Node(el, head);
    }

    void insert(int el) {
        Node* newNode = new Node(el);
        if (head == nullptr) {
            head = newNode;
        }
        else {
            Node* tmpNode = head;
            while (tmpNode->next != nullptr) {
                tmpNode = tmpNode->next;
            }tmpNode->next = newNode;
        }
    }
    void printNodes() {
        Node* tmpNode = head;
        cout << tmpNode->data;
        while (tmpNode->next != nullptr) {
            std::cout << tmpNode->data;
            tmpNode = tmpNode->next;
        }

    }
};

int main() {
    LinkedList myList = LinkedList();
    myList.insert(10);
    myList.addToHead(20);
    myList.insert(10);
    myList.printNodes();
}

1 Ответ

0 голосов
/ 11 июля 2020

Ваша итерация верна, но есть проблема с вашей функцией printNodes. Это разыменование tmpNode без проверки null:

void printNodes() {
    Node* tmpNode = head;
    cout << tmpNode->data; // <-- here
    while (tmpNode->next != nullptr) {
        std::cout << tmpNode->data;
        tmpNode = tmpNode->next;
    }

}

Я бы изменил его на следующее:

void printNodes() {
    Node* tmpNode = head;

    while (tmpNode != nullptr) {
        std::cout << tmpNode->data << ", ";
        tmpNode = tmpNode->next;
    }
}

Кроме того, как сказано в комментариях, если вы установите next член в null в конструкторе Node он должен работать нормально.

Для поиска это то же самое, но проверка данных:

Node* findNode(int el) {
    Node* tmpNode = head;
    Node* ret = nullptr;

    while (tmpNode != nullptr) {
        if (tmpNode->data == el) {
            ret = tmpNode;
            break;
        }
        tmpNode = tmpNode->next;
    }
    return ret;
}

И в main:

Node* n = myList.findNode(10);
if (n)
    std::cout << "N 10: " << n->data << "\n";

n = myList.findNode(30);
if (n)
    std::cout << "N 30: " << n->data << "\n";
else
    std::cout << "There is no N 30\n";

Также есть проблемы с утечкой памяти, как указано @RikusHoney в комментариях.

...