【发布时间】:2014-01-31 22:34:56
【问题描述】:
我正在学习 C++ 数据结构课程,最近几天的家庭作业一直困扰着我。它必须处理单链表,我们必须编写的方法之一就是向列表中添加值。
首先,我们创建虚拟节点head:
template<typename T>
SLList<T>::SLList()
{
head = new Node; // Node() is ok too
}
如果我是正确的,这不应该是一个值,不是吗?所以头部应该是NULL。到目前为止,这是我(在我教授的帮助下)成功创建的。
template<typename T>
void SLList<T>::add(const T& val) {
bool duplicate = false;
//Node *ptr = head->next;
//cout << head->data;
for (Node *ptr = head->next; ptr != NULL; ptr = ptr->next) {
//while (ptr == NULL) {
//ptr = ptr->next;
// if ptr is initialized as head, the first node, then ptr != NULL
// if ptr is initialized as head->next, which it should in order to
// traverse from the node AFTER the head, then ptr == NULL
// not exactly sure why.
if (ptr->data == val) {
duplicate = true;
break;
}
}
//Node *temp = new Node(val); // create new node with new element.
//temp->next = ptr->next;
//ptr->next = temp;
if (duplicate) {
cout << "Duplicate entry found: " << val << endl;
}
}
我尝试过使用for 和while 循环,因为很多谷歌结果在他们的答案中使用了while 循环。我想要做的是尝试向列表中添加一个值。如果该值已经在该列表中,则不会添加它。我正在尝试这样做:
SLList<int> iList;
iList.add(5);
iList.add(6);
iList.add(6);
当我寻求帮助时,有人告诉我应该将 *ptr 初始化为 head->next 以开始遍历虚拟节点之后的节点列表。我使用了 Visual Studio 的调试器,发现在将其初始化为 head->next 后,程序从未进入 for 循环,我假设这是因为虚拟节点之后的节点未能通过 if 语句 ptr != NULL。我不确定为什么会这样,因为当我有 Node *ptr = head 时,它会很好地遍历列表(尽管下面的行 if (ptr->data == val) 会认为每个条目都是重复条目)。
我可能理解错了,但 head 节点的值不应该是 NULL 吗?所以它不应该在for循环中传递if语句。
for 循环之后的三行似乎也有问题,因为当程序到达那里时,它只是崩溃并且无法将任何值添加到列表中,但我想我会采取一步一个脚印。
这里可能有很多我误解了,所以任何帮助都将不胜感激。
【问题讨论】:
-
head当然不应该为 NULL。 new 运算符不返回空指针。只是它的数据值不会有好的数据,因为它只是一个虚拟节点。 -
@ooga 哦,我明白了。所以有数据,只是没有好的数据?我只是想
NULL将与0相同。 -
head本身不能为 NULL(与 0 相同)。它必须指向一个有效的Node对象,因此head将有一个有效的(非空)地址。但是它指向的Node中的数据是任意的,因为它只是一个“虚拟节点”,正如你所说的。
标签: c++ linked-list