【问题标题】:linked list the head always is set to NULL链表头总是设置为NULL
【发布时间】:2019-05-27 13:45:48
【问题描述】:

我正在尝试将多米诺骨牌故事添加到链接列表中,但每次我调用函数 add_domino(struct Domino *list, int a ,int b) 时,头部总是停留在 NULL

void add_domino(struct Domino *list, int a ,int b) {
    struct Domino *D = malloc(sizeof(struct Domino));
    D->a = a;
    D->b = b;
    D->next = NULL;

    if(list == NULL) {
        list = D;
    } else {
        struct Domino *p;
        p = list;
        while(p->next != NULL) {
            p = p->next;
        }
        p->next = D;
    }
}

【问题讨论】:

标签: c linked-list


【解决方案1】:

要么返回更新后的头指针,然后像这样使用它:

struct Domino* list = NULL;
list = add_domino(list, 1, 2);

或者传递一个指向指针的指针,并像这样使用它:

struct Domino* list = NULL;
add_domino(&list, 1, 2);

另外,你的函数没有处理内存不足。

接下来,首选sizeof *pointer 而不是sizeof(TYPE),因为重复很容易出错,尤其是在编译器不检查不匹配的情况下。

最后,考虑在头部而不是尾部添加,以避免重复遍历整个列表。如果需要,在末尾反转列表是 O(n) 常量空间操作。

【讨论】:

    【解决方案2】:

    您错过了带有更新后指向头部的指针的返回。

    struct Domino* add_domino(struct Domino *list, int a ,int b) {
        struct Domino *D = malloc(sizeof(struct Domino));
        D->a = a;
        D->b = b;
        D->next = NULL;
    
        if(list == NULL) {
            list = D;
            return list;
        } else {
            struct Domino *p;
            p = list;
            while(p->next != NULL) {
                p = p->next;
            }
            p->next = D;
        }
      return list;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      相关资源
      最近更新 更多