我在C ++中创建了一个简单的动态链表实现,其头节点为42,然后提示用户是否需要将其他数字添加到列表中。
#include <iostream>
using namespace std;
struct Node
{
int x;
Node *next;
};
int main(int argc, char** argv)
{
char choice;
Node *start = new Node;
start->next = NULL;
start->x = 42;
Node *traverser = start;
while (1) {
cout << "Add item to the list (Y/N)? ";
cin >> choice;
if (choice == 'Y') {
traverser->next = new Node;
traverser = traverser->next;
traverser->next = NULL;
cout << "New item: ";
cin >> traverser->x;
}
else {
cout << "Linked List:\n";
Node *p;
for (p = start; p != NULL; p = p->next) {
cout << p->x << endl; //QUESTION HERE!
}
cout << "\nProgram dismissed.";
exit(0);
}
}
}
现在问题,如代码块所示,位于指针* p上。我的链表的头部名为start,而遍历并向列表添加项的指针名为traverser。为什么当它只被分配到头部时,能够打印列表中的所有内容
p = start
而不是列表的正文。我会理解这适用于打印
cout << "Linked List:\n";
for (traverser = start; traverser != NULL; traverser = traverser->next) {
cout << traverser->x << endl;
}
但* p能够打印整个列表让我很困惑!
请帮忙。
答案 0 :(得分:0)
p只是一个指针变量,就像任何其他变量一样,它可以有不同的值,但它指向地址。
p = start
p开始指向你的第一个节点。
p = p->next
它开始指向下一个节点。 你在哪里困惑?
答案 1 :(得分:0)
traverser
不包含列表正文。 start
确实
让我们回顾一下您的计划内容:
Node *start = new Node;
start
将始终指向此处创建的节点。 start
始终是列表的开头。
您可以使用节点next
成员在此节点中浏览整个列表。
Node *traverser = start;
traverser
最初与start
节点的节点相同。 traverser
表示列表的结束。您无法使用traverser
浏览列表。使用traverser
的原因是它简化了在列表末尾插入新节点的过程。
最后一个陈述由陈述
显示traverser->next = new Node;
traverser = traverser->next;
traverser->next = 0;
最后一条声明告诉我们,我们无法在任何地方关注traverser
节点。这是清单的结尾。
因此start
是整个列表,start->x
是列表中的第一个值。 start->next
是指向列表中下一个元素的指针。
现在,我们不想破坏列表的start
。因此,让我们复制指向第一个元素的指针,并调用该副本p。使用p查看列表。 p
仅对代码的这一小部分有用,而start
和traverser
对整个程序非常有用。
Node* p = start;
for (; p != NULL; p = p->next) {
cout << p->x << endl;
}
打印的最后一个元素与traverser
指向的元素相同。
答案 2 :(得分:0)
* p能够打印整个列表,因为* p(最初)指向列表的开头。在列表开始之后,列表的正文与您链接
if (choice == 'Y') {
traverser->next = new Node;
traverser = traverser->next;
traverser->next = NULL;
cout << "New item: ";
cin >> traverser->x;
}
在这里理解,最初遍历和开始都操纵同一个对象。换句话说,当您使用指针时,如果您没有克隆值,则需要克隆有关如何访问值的说明。也许这是你混乱的根源?
因此,Node* start
指向一个节点。 Node* traverse
指向同一个节点,正如您声明的Node *traverser = start;
您可以通过traverse-&gt; x或start-&gt; x来操纵相关节点的值,并获得完全相同的结果。< / p>