我创建了一个链表,想要打印这些项目。
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。谁能告诉我为什么?
非常感谢您的帮助!
答案 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的下一个节点。因此,当您现在说下一个构造函数时,它意味着构造函数指针指向的新创建节点的下一个节点。创建新节点时,默认情况下会初始化零值。因此,在第二种情况下,新创建的节点不会丢失。