Связанный список с узлами - PullRequest
0 голосов
/ 09 марта 2019

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

main.cpp

#include "LinkedList.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

void TestAddHead();

int main()
{
    TestAddHead();

    system("pause");

    return 0;
}

void TestAddHead()
{
    cout << "Testing AddHead()" << endl;
    LinkedList<int> data;
    for (int i = 0; i < 12; i += 2)
        data.AddHead(i);
    cout << "Node count: " << data.NodeCount() << endl;
    cout << "Print list forward:" << endl;
    data.PrintForward();
    cout << "Print list in reverse:" << endl;
    data.PrintReverse();
}

LinkedList.h

#pragma once
#include <iostream>
#include <vector>
#include <array>
#include <stdexcept>
#include <string>

using namespace std;

template<typename T>
class LinkedList
{
public:
    struct Node
    {
        T data_;
        Node* next;
        Node* previous;
    };

    void PrintForward() const;
    void PrintReverse() const;
    unsigned int NodeCount() const;
    void AddHead(const T &data);
    LinkedList();
    LinkedList(const LinkedList<T> &list);
    ~LinkedList();

private:
    Node* head = new Node;
    Node* tail = new Node;
    unsigned int count = 0;
};

template<typename T>
LinkedList<T>::LinkedList()
{

}

template<typename T>
LinkedList<T>::LinkedList(const LinkedList<T> &list)
{

}

template<typename T>
LinkedList<T>::~LinkedList()
{

}

template<typename T>
void LinkedList<T>::AddHead(const T &data)
{
    Node* newNode = new Node;

    newNode->data_ = data;

    if (count == 0)
    {
        head = newNode;
        tail = newNode;
        head->next = nullptr;
        head->previous = nullptr;
    }
    else
    {
        newNode->next = head;
        head->previous = newNode;
        head = newNode;
    }
    count = count + 1;
}

template<typename T>
void LinkedList<T>::PrintForward() const
{
    Node* currentNode = head;
    while (currentNode != nullptr)
    {
        cout << currentNode->data_ << endl;
        currentNode = currentNode->next;
    }
}

template<typename T>
void LinkedList<T>::PrintReverse() const
{
    Node* currentNode2 = tail;
    while (currentNode2 != nullptr)
    {
        cout << currentNode2->data_ << endl;
        currentNode2 = currentNode2->previous;
    }
}

template<typename T>
unsigned int LinkedList<T>::NodeCount() const
{
    return count;
}

это должен быть вывод программы:

Тестирование AddHead () Количество узлов: 6 Печать списка вперед: 10 8 6 4 2 0 Печать списка назад: 0 2 4 6 810

Программа работает и дает мне правильный вывод, но проблема в том, что она просто падает, когда достигает "10" в нижней части программы, и я не знаю почему, может кто-нибудь сказать мне, почемуэто происходит и возможно ли это исправить?спасибо

1 Ответ

1 голос
/ 09 марта 2019

Ваша непосредственная проблема, вы никогда не устанавливаете указатель нового узла previous на nullptr (проблема, которая, честно говоря, должна быть исправлена ​​с помощью лучшего построенного цикла и / или правильного конструктора для Node).Несмотря на это, здесь ...

template<typename T>
void LinkedList<T>::AddHead(const T &data)
{
    Node* newNode = new Node;

    newNode->data_ = data;

    if (count == 0)
    {
        head = newNode;
        tail = newNode;
        head->next = nullptr;
        head->previous = nullptr;
    }
    else
    {
        newNode->next = head;
        newNode->previous = nullptr; // ADD THIS
        head->previous = newNode;
        head = newNode;

    }
    count = count + 1;
}

В этом все еще есть несколько вещей: утечки памяти, пустой copy-ctor и деструктор и т. Д., Но вышеприведенное является корнем текущего зла.Эта строка также может быть:

newNode->previous = head->previous;

, но, честно говоря, это просто сбивает с толку то, что вы делаете.Вы всегда сажаете свои новые узлы в начало списка, так что элемент previous of said-same всегда будет nullptr (по крайней мере, пока вы не начнете изучать циклические списки).

...