Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链接列表未被修改_C_Linked List - Fatal编程技术网

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);
       }
   ......
   }
}