【问题标题】:How does Inserting a New Node into a Linked List Exactly Work in C?在 C 中如何将新节点插入到链表中?
【发布时间】:2020-10-19 23:42:41
【问题描述】:

所以使用下面的push 函数(插入到列表的开头)。我知道它首先为一个名为new_node 的节点分配内存,然后你给它分配x = 5 之类的值,然后将head 设置为指向new_node

void push(int x, struct Node** head_ref) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = x; //New data
    new_node->next = (*head_ref); //Connects the new_node to what beginning of the node
    (*head_ref) = new_node; //The head now points to the new node
}

我无法理解new_node 到底发生了什么?当我在函数运行后运行函数n 次数时,我能够毫无问题地遍历列表,并且能够打印新节点的值,但不会有问题是因为我们每次运行函数时都使用相同的变量名new_node?它是否与计算机如何使用分配的内存有关,或者可能是其他原因?我找不到很多关于我的主题的信息来回答我的问题。

【问题讨论】:

  • 纸、铅笔、盒子和箭头。听起来微不足道,但您会惊讶于它们在破译动态数据结构(如链表)方面的帮助程度。
  • 这是一个短暂的局部变量。就像在一张纸上写了一个值,在这种情况下,该值是一块分配的内存的唯一地址,用于保存新节点。稍后,当您希望列表的头部指向该内存时,您可以从纸上检索地址并将其值(通过(*head_ref) = new_node)存储在可以检索列表头部的位置。然后你丢弃那张纸。下一次,你有一张新纸要写。
  • new_node 是(只是)一个指针,而不是节点本身。您需要了解指针与其指向的对象之间的区别。
  • @jarmod 所以告诉我我是否正确。所以一旦我运行我的函数,它就会给我的新节点一个内存位置,然后给它你传递给它的任何值,然后让head指向内存中的那个位置,并使new_node指向下一个节点,因为它是分配它不会从内存中消失,然后下次我运行该函数时,它会创建一个新的内存地址,依此类推。对吗?
  • 基本上,是的。它为新节点分配内存,填充其数据值,然后将其挂接到现有链表中(首先使其next 指针指向当前位于链表头部的节点,然后将头指向它,新节点)。喜欢youtube.com/watch?v=dU0KxLgNM9E

标签: c data-structures linked-list


【解决方案1】:

但不会有问题,因为我们每次运行函数时都使用相同的变量名 new_node?​​p>

没有;变量在函数范围内声明和定义。换句话说,每次运行函数时它都是一个新变量。如果您执行以下简单功能:

int aNumber() {
    int x = 4;
    return ++x;
}

那么该函数每次都会返回 5,因为 x 是在函数内部声明和定义的,因此只在函数运行时存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2018-10-12
    • 1970-01-01
    • 2016-03-30
    • 2019-04-26
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多