gpt4 book ai didi

c - C : Why do I have to explicitly reassign head and tail even when they are not changed? 中的双向链表

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:25 25 4
gpt4 key购买 nike

我有一个双向链表,您可以在其中通过指向头节点或尾节点指针的指针添加到头节点或尾节点。

通过这种方式,您只需将头指针和尾指针更新为最新的头节点或尾节点的地址即可。

我将那些“指向指针的指针”在它们自己的函数中启动并存储在包含两者的结构中。

当我添加到尾部或头部时,我必须显式保存旧头部并重新分配它,尾部则相反。否则,结构发生变异,头部也变成尾部,或者尾部变成头部。

我正在尝试了解发生了什么。也许头部/尾部保留结构必须静态/全局定义?

来源:

#include <stdio.h>
#include <stdlib.h>

typedef struct dcl_node {
char *content;
struct dcl_node *next;
struct dcl_node *prev;
} Node;

Node *create_node (char *content) {
Node *n = malloc(sizeof(Node));
n->content = content;
n->next = NULL;
n->prev = NULL;
return n;
}

typedef struct dc_list {
struct dcl_node **head;
struct dcl_node **tail;
} DCList ;

DCList *init_list (char *content_head, char *content_tail) {
Node *head = create_node(content_head);
Node *tail = create_node(content_tail);
head->next = tail;
tail->prev = head;
DCList *list = malloc(sizeof(DCList));
list->head = &head;
list->tail = &tail;
return list;
}

void insert_head (char *content, DCList *list) {
Node *old_head = *list->head;
Node *old_tail = *list->tail; // note the saving here
Node *node = create_node(content);
node->next = old_head;
old_head->prev = node;
*list->head = node;
*list->tail = old_tail; // and reassigning here
}

void insert_tail (char *content, DCList *list) {
Node *old_head = *list->head; // note the saving here
Node *old_tail = *list->tail;
Node *node = create_node(content);
node->prev = old_tail;
old_tail->next = node;
*list->head = old_head; // and reassigning here
*list->tail = node;
}

int main (int argc, char *argv[]) {
DCList *list = init_list("c", "d");

insert_head("b", list);

// If I don't explicitly save and reassign the tail node,
// in this case both head and tail would become the "b node".
printf("head: %s\ntail: %s\n",
(*list->head)->content, (*list->tail)->content);

return 0;
}

最佳答案

因为list->headlist->tail是指向init_list函数中局部变量的指针。

init_list 返回时,这些变量会被销毁,并且可以重新使用存储它们的内存。

巧合的是,当您将它们保存在 insert_headinsert_tail 中时,您保存的 headtail 变量(可能!) 获得相同的内存地址,这样它们就不会被覆盖。否则,旧的 head 可能会被 node 覆盖。

这是一个大概的解释——很难说出编译器实际上在做什么。但关键是 headtailinit_list 返回时被销毁,然后你的 list->headlist->tail 指向可以重复使用的空闲内存。

关于c - C : Why do I have to explicitly reassign head and tail even when they are not changed? 中的双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53583702/

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