我的代码有问题。我是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();
答案 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
类的成员变量。