gpt4 book ai didi

c++ - 为什么在链表中创建当前变量时不使用 “new”?

转载 作者:行者123 更新时间:2023-12-01 15:08:04 25 4
gpt4 key购买 nike

这是打印链接列表元素的解决方案。

为什么不是Node *current = new Node;然后是current = head;

void printLinkedList(Node* head)
{
Node *current = head;
while(current!=NULL){
cout << current -> data << endl;
current = current -> next;
}
}

最佳答案

这是一个绘画的好地方!

想象一下,我们有一个由head指向的链表:

 head
|
v
+------+ +-----+ +-----+ +-----+
| i'm | -> | the | -> | bad | -> | guy | -> null
+------+ +-----+ +-----+ +-----+

如果我们使用代码行
Node *current = new Node;

那么内存看起来像这样:
 head                                                current
| |
v v
+------+ +-----+ +-----+ +-----+ +------+
| i'm | -> | the | -> | bad | -> | guy | -> null | duh! | -> ?
+------+ +-----+ +-----+ +-----+ +------+

该函数的目标是打印 head指向的现有列表,但是这里我们有一个指向不属于现有列表的新链接列表单元格的指针。结果,我们犯了两个编程罪:
  • 我们已经为不需要的对象分配了内存。
  • 我们违反了与客户签订的契约(Contract)。

  • 另一方面,如果我们写
    Node *current = head;

    那么内存看起来像这样:
     head
    |
    v
    +------+ +-----+ +-----+ +-----+
    | i'm | -> | the | -> | bad | -> | guy | -> null
    +------+ +-----+ +-----+ +-----+
    ^
    |
    current

    在这里, current现在指向现有列表,因此我们可以遍历列表以查找所需的内容。此处无需创建新节点,因此我们无需创建任何新节点。

    一般来说,在C++中,除非您确实真正想要创建一个新的链表单元,否则应避免使用 new。在这种情况下,我们不想这样做,这就是为什么我们创建 current并将其指向现有链接列表单元格的原因。

    希望这可以帮助!

    关于c++ - 为什么在链表中创建当前变量时不使用 “new”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61086487/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com