gpt4 book ai didi

c - 链表未被修改

转载 作者:行者123 更新时间:2023-11-30 19:31:28 24 4
gpt4 key购买 nike

我正在尝试将一个节点添加到链接列表的开头,但该列表并未在我的一个函数中被修改,而是在另一个函数中被修改...

这是我要在开头插入的函数。

llist* insert_beginning(llist *list, gymnast_info *g) {                         
llist *new = (llist *)malloc(sizeof(llist));
new->g = g;
new->next = list;
list = new;
return list;
}

在此函数中,链表被正确修改

llist *add_sorted_name(gymnast_info *ginfo, llist *head) {
llist *accu = head;
while (accu) {
// Beginning of list
if (strcasecmp(accu->g->lastname, ginfo->lastname) > 0
&& accu == head) {
return insert_beginning(head, ginfo);
}
......
}
}

但是,在这一次中,情况并非如此。它返回正确的列表,但不会修改输入的列表。我不知道为什么。

llist *add_sorted_country(gymnast_info *ginfo, llist *head) {
llist *accu = head;
int country = ginfo->country;
while (accu) {
//Beginning of the list
if (accu->g->country >= country && accu == head) {
return insert_beginning(head, ginfo);
}
.......
}
}

最佳答案

当前insert_beginning仅更改a的指向地址指针的本地副本。调用者看不到更改。但是因为您返回新的头,调用者必须检查返回值并替换列表的头部。

add_sorted_nameadd_sorted_country 就是这样做的,因为它们马上归还新头。我们看不到的是调用者如何add_sorted_nameadd_sorted_country 正在处理结果。如果他们这样做:

add_sorted_country(ginfo, head);
do_something_with(head);

那么你就不会看到头部有任何变化,因为你忽略了它。你会需要像这样调用它们(类似于 realloc 调用):

llist *tmp = add_sorted_country(ginfo, head);
if(tmp == NULL)
{
// error handling
// do not continue
}

head = tmp; // assigning possible new head

这样的 API 很好,但是您必须确保始终检查函数的返回值。这可能是首先的问题。

执行此操作的另一种方法(也许更安全)是将指针传递给指向头部的指针,并让改变头部的函数,通过双指针改变。

int insert_beginning(llist **list, gymnast_info *g) {
if(list == NULL)
return 0;

llist *new = calloc(1, sizeof *new);
new->g = g;
new->next = *list;
*list = new; // setting 'new' as new head
return 1;
}

然后add_sorted_name应该看起来像这样

int add_sorted_name(gymnast_info *ginfo, llist **head) {
if(head == NULL)
return 0;

llist *accu = *head;
while (accu) {
// Beginning of list
if (strcasecmp(accu->g->lastname, ginfo->lastname) > 0
&& accu == head) {

return insert_beginning(head, ginfo);
}
......
}
}

关于c - 链表未被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48615828/

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