проблема с реализацией связанного списка

#c #linked-list

#c #связанный список

Вопрос:

Я пытаюсь реализовать простой список ссылок. Начальное значение вставлено успешно, но следующие элементы введены неправильно. Пожалуйста, помогите мне решить, в чем заключается ошибка. Большое спасибо.

 #include<iostream>

using std::cout;

class node
{
    public:
        node():next(0){}
        void setNext(node *next){ next = next; }
        node* getNext(){ return next; }
        void setValue(int val){ value = val; }
        int getValue(){ return value; }

    private:
        int value;
        node *next;
};

class list
{
    public:
        list():head(new node()),len(0){}
        bool insert(int value);
        //bool remove(int value);
        int valueAt(int index);
        int length();

    private:
        node *head;
        int len;

};

bool list::insert(int value)
{
    node *current = 0;
    node *previous = 0;
    node *temp = 0;

    temp = new node();
    temp->setValue(value);

    current = head;
    previous = head;

    while((temp->getValue())>(current->getValue()))
    {
        previous = current;
        current = current->getNext();

        if(!current)
        {
            break;
        }
    }

    if(current == head)
    {
        temp->setNext(current);
        head = temp;

        len  ;
    }
    else
    {
        temp->setNext(current);
        previous->setNext(temp);

        len  ;
    }
}

int list::valueAt(int index)
{
    if((index < len) amp;amp; (index >= 0))
    {
        node *current = 0;
        current = head;
        int count = 0;

        while(count < index)
        {
            current = current->getNext();
            count  ;
        }

        return (current->getValue());
    }
    else
    {
        return -1;
    }
}


int main()
{
    list myList;

    myList.insert(5);
    myList.insert(20);
    myList.insert(10);

    cout<<"Value at index 1 : "<<myList.valueAt(1);

    return 0;
}
  

Ответ №1:

После беглого взгляда, возможно, проблема заключается в

 void setNext(node *next){ next = next; }
  

Вы присваиваете переменную самой себе, потому что локальные переменные затмевают переменные экземпляра. Попробуйте изменить это на

 void setNext(node *next){ this->next = next; }
  

В других примечаниях:

  1. В list::list вам, вероятно, не следует инициализироваться head с помощью new node . Это будет означать, что ваш связанный список будет иметь один произвольный узел при создании, но иметь длину 0. Вместо этого вам следует подумать о том, чтобы установить head значение NULL .

  2. При создании у node них есть случайное value значение. Подумайте о том, чтобы потребовать для этого параметр в конструкторе или соответствующее значение по умолчанию.

  3. -1 является плохим «недопустимым значением» для list::valueAt , потому что это также допустимое значение для хранения узлом.

  4. Вероятно, вам следует переименовать list класс в slist , чтобы указать, что он хранит значения в отсортированном порядке.