C ++创建链表和打印

时间:2015-09-29 20:37:58

标签: c++ linked-list

我创建了一个链表,想要打印这些项目。

struct node{
    int item;
    node *next;
}; typedef node* nodeptr;

void insertAt(nodeptr headnode, size_t index, int item);

int main(int argc, const char * argv[]) {
    nodeptr head;
    head = new node;
    nodeptr constructor = new node;
    head->item = 0;
    head->next = constructor;
    for(int n = 0; n<8; n++){
        constructor->item = n+1;
        constructor->next = new node;
        constructor = constructor->next;
    }
    constructor->item = 9;
    constructor->next = new node;
    constructor->next = nullptr;

    for(nodeptr begin = head; begin != nullptr; begin = begin->next){
        cout << begin->item << endl;
    }

    return 0;
}

如果我这样写我的代码,它工作正常(打印0123456789)。但在for循环之后做了一些小改动后:

constructor->item = 9;
constructor->next = new node;
constructor = constructor->next;
constructor = nullptr;

我认为这会以同样的方式运作。但是输出是01234567890,再添加一个0。谁能告诉我为什么?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您在9条目之后添加了一个新节点,但从未定义item值。
该值默认为零。

至于

之间的区别
// Creates a new node...
constructor->next = new node;

// Then ignores it by making the current position the end of the list
constructor->next = nullptr;

// Creates a new node...
constructor->next = new node;

// Makes the new node the current node
constructor = constructor->next;

// Marks the current position as the end of the list
// The list is now one item longer than the previous example
constructor = nullptr;

评论应该有助于解释差异。

它们都创建一个新节点,但在第二个块中,constructor = constructor->next;在标记列表结尾之前移动到新节点。最终结果是第二个代码块在列表中的节点多于第一个块。

答案 1 :(得分:0)

在第一种情况下,您将构造函数 - >下一个指向创建的新节点,然后指向nullptr。这是新节点丢失的地方。也就是说,当前构造函数指向的节点(在本例中为9),其下一个将首先指向新节点,在下一行中,其引用将更改为nullptr。 在创建新节点之后的第二种情况中,将指针构造函数移动到节点到9的下一个节点。因此,当您现在说下一个构造函数时,它意味着构造函数指针指向的新创建节点的下一个节点。创建新节点时,默认情况下会初始化零值。因此,在第二种情况下,新创建的节点不会丢失。