C++节点和链接列表语法

Kar*_* O. 0 c++ data-structures

我有这个代码的问题.我是C++的新手,但大部分内容都很容易理解.我已经尝试制作一个简单的链表数据结构,但是,它打印垃圾而不是列表中的值.我的问题是,我的语法在哪里出错让它显示地址?

输出: 在此输入图像描述

class Node
{
  public:
    int data;
    Node *next;

    Node(int data)
    {
      data = data;
      next = NULL;
    };
};

class LinkedList
{

    Node *first;
    Node *last;
    int count;

public:
    LinkedList()//constructor for the LinkedList
    {
        //initialization 
        first = NULL;
        last = NULL;
        count = 0;
    };
    void AddItem(int data)
    {
        Node *newItem = new Node(data);

        if(first == NULL)
        {
          first = newItem;
          last = newItem;
        }
        else
        {
          Node *traversal = first;
          while(traversal->next != NULL)
          {
              traversal = traversal->next;
          }
          traversal->next = newItem;
          last = traversal->next;
        }
        count++;
    }

    void DisplayList()
    {
        cout<<endl;
        Node *traversal = first;
        while(traversal->next != NULL)
        {
            cout<<"["<<traversal->data<<"] ";
            traversal = traversal->next;

            if(traversal == NULL)
            {
                break;
            }
        }
    }
    bool isEmpty()
    {
        if(count < 1)
        {
            cout<<"List is empty";
            return true;
        }
        else
        {
            cout<<"List is not empty";
            return false;
        }
    }
};

int main()
{
cout <<"Linked Lists demo"<<endl;


LinkedList collection;
collection.AddItem(1);
collection.AddItem(3);
collection.AddItem(5);
collection.AddItem(7);
collection.AddItem(9);
collection.AddItem(11);
collection.isEmpty();
collection.DisplayList();
cin.get();
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

Node(int data)
{
    data = data; // <-- incorrect
    next = NULL;
};
Run Code Online (Sandbox Code Playgroud)

您没有将输入参数分配给Node::data成员.您正在将输入参数分配回自身,使Node::data成员使用用于分配新内存块的内存块中已存在的任何随机值进行初始化Node.由于输入参数与成员具有相同的名称,因此您需要使用this->data = data:

Node(int data)
{
    this->data = data;
    next = NULL;
};
Run Code Online (Sandbox Code Playgroud)

或者重命名输入参数,使其具有不同的名称:

Node(int value)
{
    data = value;
    next = NULL;
};
Run Code Online (Sandbox Code Playgroud)

此外,由于您的列表中有一个last成员,您可以很好地简化您的AddItem()实现,您根本不需要遍历列表(如果列表中包含大量项目,则需要很长时间):

void AddItem(int data)
{
    Node *newItem = new Node(data);

    if (first == NULL)
        first = newItem;

    if (last != NULL)
       last->next = newItem;
    last = newItem;

    ++count;
}
Run Code Online (Sandbox Code Playgroud)