C 链接列表未被修改
我正在尝试将一个节点添加到链接列表的开头,但是列表没有在我的一个函数中被修改,而是在另一个函数中被修改 这是我要在开头插入的函数C 链接列表未被修改,c,linked-list,C,Linked List,我正在尝试将一个节点添加到链接列表的开头,但是列表没有在我的一个函数中被修改,而是在另一个函数中被修改 这是我要在开头插入的函数 llist* insert_beginning(llist *list, gymnast_info *g) { llist *new = (llist *)malloc(sizeof(llist)); new->g = g;
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\u开头
仅更改
本地指针的副本。调用方没有看到更改。但是因为
如果返回新的头,调用方必须检查返回值并替换
榜首
add_sorted_name
和add_sorted_country
就是这样做的,因为它们
我们马上就把新的头还给你。我们看不到的是打电话的人
正在处理结果的是add\u sorted\u name
和add\u sorted\u country
。如果
它们是:
那么你就看不到头部的任何变化,因为你忽略了它。你会的
需要这样调用它们(类似于realloc
调用):
这样的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\u sorted\u 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);
}
......
}
}
new->next=列表代码>-您正在创建一个循环列表(这很好——每个节点都是一个数据节点),但是,在修改第一个节点可以更改的列表时,必须将列表的地址作为函数参数传递(例如,llist**head
),因为如果第一个节点更改,列表地址也会更改。请提供一个.@DavidC.Rankin如果insert_beging
的调用方检查返回值并采取相应行动(如realloc
),则代码就可以了。其他两个函数都是这样做的,但是我们看不到它们是如何调用的,所以错误可能就在那里。有很多我们说不出来,因为我们没有代码,但是通过在add\u sorted…
中传递llist*head
,每个add\u sorted…
函数都会收到一份head
的副本,该副本有自己的地址,而且地址也非常不同。(存储在中的地址相同,但头的地址不相同)因此,如果头
曾用作列表中指针的地址,则列表将不连续。(现在,如果llist
是一个指向虚拟节点的指针,那么就可以了)
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;
}
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);
}
......
}
}