链接列表未被修改

时间:2018-02-05 04:18:45

标签: c linked-list

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

这是我在开头插入的功能。

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

1 个答案:

答案 0 :(得分:0)

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