实现链表时出现问题

trouble implementing a linked list

本文关键字:问题 链表 实现      更新时间:2023-10-16

我正在尝试实现一个简单的链接列表。已成功插入初始值,但未正确输入下一个元素。请帮我解决错误。谢谢。

#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) && (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;
}

粗略地看一眼,也许问题出在上

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,以指示它按排序顺序存储值。