C - 使用当前或当前>下一个追加节点



唯一的区别是当前交换到当前>下一个。我认为它们的工作方式都相同,但显然不是。它是否将其与本地(当前(而不是头部混淆?

为什么 appendNodeTailCurrent 不起作用,但是当我使用 (appendNodeTailNext( current->next 时,它起作用了?

void appendNodeTailNext(NODE** head, int data) {
NODE* current = *head;
NODE* node = { 0 };
node = (NODE*)malloc(sizeof(NODE));
node->data = data;
node->next = NULL;
if (current == NULL) {
*head = node;
return;
}
while (current->next!= NULL) {
current = current->next;
}
current->next = node;
}
void appendNodeTailCurrent(NODE** head, int data) {
NODE* current = *head;
NODE* node = { 0 };
node = (NODE*)malloc(sizeof(NODE));
node->data = data;
node->next = NULL;
if (current == NULL) {
*head = node;
return;
}
while (current!= NULL) {
current = current->next;
}
current = node;
}

*headNULL时,第二个版本既不会更改列表的任何节点*head也不会更改任何部分。因此,它不会更改列表。它只改变current,一个一旦函数退出就不复存在的变量。


例如,假设列表中已经有四个节点。

第一个版本:

  1. current设置为第一个节点。
  2. 第一个节点的next不是NULL,所以循环被输入。
  3. current设置为第二个节点。
  4. 第二个节点的next不是NULL,所以进入循环。
  5. current设置为第三个节点。
  6. 第三个节点的nextNULL,所以进入循环。
  7. current设置为第四个节点。
  8. 第四个节点的nextNULL,所以循环退出。
  9. 第四个节点的next设置为新节点。

我们更改了一个节点(在最后一步(。

第二版:

  1. current设置为第一个节点。
  2. current不是NULL,所以进入循环。
  3. current设置为第二个节点。
  4. current不是NULL,所以进入循环。
  5. current设置为第三个节点。
  6. current不是NULL,所以进入循环。
  7. current设置为第四个节点。
  8. current不是NULL,所以进入循环。
  9. current设置为NULL
  10. current不是NULL,所以循环退出。
  11. current设置为新节点。

我们没有更改*head或节点。


有一种方法可以使第二种方法起作用:通过添加间接层。

void appendNodeTailCurrent(NODE** head, int data) {
NODE** ptr_to_ptr = head;
NODE* node = { 0 };
node = (NODE*)malloc(sizeof(NODE));
node->data = data;
node->next = NULL;
if (*ptr_to_ptr == NULL) {
*head = node;
return;
}
while (*ptr_to_ptr!= NULL) {
ptr_to_ptr = &( (*ptr_to_ptr)->next );
}
*ptr_to_ptr = node;
}

以上简化为以下内容:

void appendNodeTailCurrent(NODE** ptr_to_ptr, int data) {
while (*ptr_to_ptr != NULL) {
ptr_to_ptr = &( (*ptr_to_ptr)->next );
}
*ptr_to_ptr = malloc(sizeof(NODE));
(*ptr_to_ptr)->data = data;
(*ptr_to_ptr)->next = NULL;
}

您可以说您发布的第一个版本找到要更改的节点,而此版本找到要更改的指针。在您发布的第一个版本中,头部需要特别处理,因为它不是节点。但是由于头部是一个指针,我们不需要在这个版本中特别对待它。

最新更新