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

时间:2014-02-27 06:20:24

标签: c++ data-structures

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

输出:enter image description here

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();

5 个答案:

答案 0 :(得分:5)

Node(int data)
{
    data = data; // <-- incorrect
    next = NULL;
};

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

Node(int data)
{
    this->data = data;
    next = NULL;
};

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

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

此外,由于您的列表中有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;
}

答案 1 :(得分:4)

你已经得到了一些答案,但他们似乎都给出了相同(糟糕)的建议。

您应该使用成员初始化列表,而不是将data = data;更改为this->data = data;之类的内容:

Node (int data) : data(data), next(nullptr) {}

就个人而言,我可能会进一步改变,以允许为节点指定“next”元素:

Node(int data, Node *next=nullptr) : data(data), next(next) {}

在ctor的主体内部,只有参数可以使用裸名称显示,因此data = data;只是将参数的值赋予自身。在成员初始化列表中,编译器更智能(可以这么说)并且“知道”哪个data是哪个,所以即使它们具有相同的名称,也会将参数data中的值赋给成员data(以及next)。

顺便说一句:虽然身体空虚的人可能最初看起来有点奇怪,但你应该习惯它。我猜我写的大多数ctors都有空体。

另一个(或多或少不相关):我还要在Node类中定义LinkedList类(并且可能使它成为private)。 LinkedList本身之外的任何内容都不需要了解Node类。

答案 2 :(得分:0)

打印垃圾值而不是地址,在 AddItem 方法中您没有更新节点的数据。添加此行将起作用

newItem->data=data

答案 3 :(得分:0)

将构造函数更改为:

Node(int d)
{
    data = d;    //data = data is wrong
    next = NULL;
}

答案 4 :(得分:0)

您也可以使用

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

初始化data,它是Node类的成员变量。