C ++ Linked List - 一个不用于遍历列表的新指针CAN打印列表?

时间:2015-10-16 13:08:00

标签: c++ pointers linked-list

我在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能够打印整个列表让我很困惑!

请帮忙。

3 个答案:

答案 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仅对代码的这一小部分有用,而starttraverser对整个程序非常有用。

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>