我正在尝试将一个节点添加到链接列表的开头,但是我的一个函数中的列表没有被修改,而是在另一个函数中被修改...
这是我在开头插入的功能。
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);
}
.......
}
}
答案 0 :(得分:0)
目前insert_beginning
仅更改a的指向地址
本地指针的副本。来电者看不到变化。但是因为
你返回新头,调用者必须检查返回值并替换
列表的负责人。
add_sorted_name
和add_sorted_country
就是这样做的,因为他们
他们马上就回来了。我们不知道的是打电话的方式
add_sorted_name
和add_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);
}
......
}
}