gpt4 book ai didi

c - C 中的链表 : What happens when we assign the current node to a temporary node pointer?

转载 作者:行者123 更新时间:2023-11-30 18:35:43 24 4
gpt4 key购买 nike

我接到一项任务,要编写一个函数来反转双向链表。我编写了该函数并将其命名为 reverse()。函数如下:

struct node* reverse(struct node** head_ref){
struct node *current=*head_ref;
struct node *tempNode=(struct node *)malloc(sizeof(struct node));
if(current->next == NULL){
return current;
}
while(current->next != NULL){
//tempNode=current;
tempNode->key=current->key;
tempNode->data=current->data;
tempNode->next=current->next;
tempNode->prev=current->prev;
current->next=current->prev;
current->prev=tempNode->next;
current=tempNode->next;
}
current->next=current->prev;
current->prev=NULL;
*head_ref =current;
return current;
}

其中struct node** head_ref参数将头节点&head的引用作为参数。该功能运行良好。但我的问题不是这样做

tempNode->key=current->key;
tempNode->data=current->data;
tempNode->next=current->next;
tempNode->prev=current->prev;

为什么我不能只执行 tempNode=current;?当我尝试这样做时,我的函数不会产生预期的结果。

最佳答案

tempnode = current分配指针,这意味着tempnode和current将指向内存中的同一地址。

tempnode = curr; // tempnode = 1036;

1020 1028 1036 1044
+------+------+------+------+
| | | curr | |
+------+------+------+------+
^
|
tempnode ---------

您只需要 tempnode 具有相同的值,因此您必须进行深度复制,这正是您正在做的事情。

tempNode->key=current->key;
tempNode->data=current->data;
tempNode->next=current->next; // You just copy the content of node
tempNode->prev=current->prev; // But they are in another part of memory

120 .... 1028 1036 1044
+------+------+------+------+------+
| temp | | curr | | |
+------+------+------+------+------+

它们具有相同的值,但它们指向另一个地址。

我可以看到你正在重写一些指针,你不应该这样做,因为你正在丢失分配的内存的地址 ->你不能再释放它了。

存储到某个临时变量,从节点中删除它后,您可以释放该内存。

关于c - C 中的链表 : What happens when we assign the current node to a temporary node pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686130/

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