Возникли проблемы при реализации связанного списка в C ++ - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь реализовать простой односвязный список целых чисел, которые должны быть отсортированы при вставке в Visual Studio c ++ 2010 express.

Проблема заключается в том, что когда я создаю новый узел и вызываю .getValue() для него, возвращается правильное число, однако каким-то образом это теряется, когда я пытаюсь вызвать getValue () на узле, уже находящемся в списке.Узел может быть неправильно вставлен в список, однако я не могу найти, почему это так.Вместо правильного значения отображается какое-то другое значение, которое выглядит как справочное значение или что-то в этом роде.

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

#include "Node.h";
#include <iostream>

//namespace Linked{
//The first two constructors would be the first in the linked list.
Node::Node(void){
    value = 0;
    next = 0;
}
Node::Node(int setValue){
    value = setValue;
    next = 0;
}
Node::Node(int setValue,Node *nextNode){
    value = setValue;
    next = nextNode;
}
Node * Node::getNext(){
    return next;
}
void Node::setNext(Node newNext){
    next = &newNext;
}
int Node::getValue(){
    return value;
}
bool Node::isEqual(Node check){
    return value==check.getValue()&&next == check.getNext();
}

/*
int main(){
    int firstInt, secondInt;
    std::cin>>firstInt;
    Node first = Node(firstInt);
    std::cout<<"Enter second int: ";
    std::cin>>secondInt;
    Node second = Node(secondInt, &first);
    std::cout<<"Second: "<<second.getValue()<<"\nFirst: "<<(*second.getNext()).getValue();

    system("pause");
}*/

Вот связанный список:

    //LinkedList.cpp

    LinkedList::LinkedList(void)
    {
        head = 0;
        size = 0;
    }

    LinkedList::LinkedList(int value)
    {
        head = &Node(value);
        size = 1;
    }

    void LinkedList::insert(int value){
        if(head == 0){

            Node newNode = Node(value);
            head = &newNode;
            std::cout<<"Adding "<<(*head).getValue()<<" as head.\n";
        }else{
            std::cout<<"Adding ";
            Node current = *head;
            int numChecked = 0;
            while(size<=numChecked && (((*current.getNext()).getValue())<value)){
                current = (*(current.getNext()));
                numChecked++;
            }

            if(current.isEqual(*head)&&current.getValue()<value){
                Node newNode = Node(value, &current);
                std::cout<<newNode.getValue()<<" before the head: "<<current.getValue()<<"\n";
            }else{
                Node newNode = Node(value,current.getNext());
                current.setNext(newNode);
                std::cout<<newNode.getValue()<<" after "<<current.getValue()<<"\n";
            }

        }
        size++;
    }
    void LinkedList::remove(int){

    }
    void LinkedList::print(){
        Node current = *head;
        std::cout<<current.getValue()<<" is the head";
        int numPrinted = 0;
        while(numPrinted<(size-1)){
            std::cout<<(current.getValue())<<", ";
            current = (*(current.getNext()));
            numPrinted++;
        }
    }
    int main(){
        int a[5] = {30,20,25,13,2};
        LinkedList myList = LinkedList();
        int i;
        for(i = 0 ; i<5 ; i++){
            myList.insert(a[i]);
        }
        myList.print();
        system("pause");
    }

Любое руководство будет с благодарностью!

1 Ответ

2 голосов
/ 30 декабря 2011

Когда вы создаете узлы во вставке, вы выделяете их из стека, что означает, что они будут потеряны после возврата функции.

Получите их из кучи с помощью:

Node * newNode=new Node(value);

Когда вы используете:

Node newNode=Node(value);

Вы размещаете этот объект в стеке, что означает, что указатели:

&newNode

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

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