链接列表中的头指针神奇地分配,不应该工作,但确实如此

时间:2016-04-15 21:58:22

标签: c++ linked-list nodes

更新:请参阅David Grayson的回复,如果您与我的相似,并希望修改您的计划。

所以我一直在学习CS202中的链表,我创建了一个有效的程序,但不应该。它不应该工作的确切原因是我从未将第一个节点中的指针分配给下一个节点,但程序编译并运行完美。

(或者至少,这是我理解它的方式。当然,我在某种程度上肯定是不正确的。)

我知道这不是最漂亮的代码,但是由于某种原因,它已经有效了,我不想搞砸它。

#include <iostream>

using namespace std;

//STRUCTS

struct node
{
    int num;
    node *ptrNext;
};

//FUNCTIONS

node *addNode(node *currentNode, int i)
{
    node *previousNode = currentNode;

    currentNode = new node;
    currentNode -> num = i;
    currentNode -> ptrNext = nullptr;

    previousNode -> ptrNext = currentNode;

    return currentNode;

}

void printList(node *printingNode)
{
    while (printingNode -> ptrNext != nullptr)
    {
        printingNode = printingNode -> ptrNext;
        cout << printingNode -> num << ", ";
    }
}

//MAIN

int main()
{
    node *head = new node;
    node *current;

    head -> num = NULL;
    head -> ptrNext = nullptr;

    current = addNode(head, 23);
    current = addNode(current, 28);
    current = addNode(current, 45);
    current = addNode(current, 57);

    printList(head);

    return 0;
}

程序编译时没有错误或警告,输出如下:

23, 28, 45, 57,

我的导师和我对此感到困惑。当在printList函数中使用时,如何使用head - &gt; ptrNext是否可以链接?

2 个答案:

答案 0 :(得分:1)

addNode函数处理此问题。调用addNode时,它会将ptrNext的值设置为创建的新节点。

答案 1 :(得分:0)

当我这样做时

 previousNode -> ptrNext = currentNode;

指针previousNode已设置为头节点,并将头节点中的ptrNext更改为刚创建的节点。

GaiusOctavian有一个技术上正确的答案,但我没有理解它,因为指针很复杂。不过,谢谢你帮忙说清楚!

我的新节目利用了David Grayson的建议:

node *addNode(node *inputNode, int input)
{
    node *newNode = new node;
    newNode -> num = input;
    newNode -> ptrNext = nullptr;

    inputNode -> ptrNext = newNode;

    return newNode;
}

这只需要一个节点,创建一个新节点,然后将输入节点链接到新节点并吐出新节点。