插入链接列表的末尾

时间:2016-01-06 14:49:41

标签: c linked-list

我编写了一个在链表末尾插入节点的函数。当我运行程序时,当我调用此函数时,程序就会停止工作。

这是功能:

void insert(node **head, int x) {
    node *new = malloc(sizeof(node));
    new->data = x;
    new->next = NULL;

    node *temp = *head;

    while (temp != NULL) {
        temp = temp->next;
    }
    temp->next = new;
}

谁能告诉它哪里出错了?

3 个答案:

答案 0 :(得分:4)

  1. while循环终止时tempNULL。因此temp -> next会生成Segmentation Fault

    而不是while(temp!=NULL),您应该使用while(temp->next!=NULL)

  2. 如果headNULL怎么办? (空链表)
    为此检查head是否为NULL

  3. 如果malloc失败了怎么办?

  4. 所以解决方案将是:

    void insert(node **head, int x)
    {
        node *new = (node *)malloc(sizeof(node));
    
        if(!new)
        {
            printf("Memory allocation failed!\n");
            exit(1);
        }
        new->data = x;
        new->next = NULL;
    
        node *temp = *head;
    
        if(!temp)
            *head = new;
        else
        {
            while (temp->next != NULL)
            {
                temp = temp->next;
            }
            temp->next = new;
        }
        return ;
    }
    

答案 1 :(得分:2)

使用node**进行迭代。因此,如果列表为空,则无关紧要。迭代直到找到nextNULL的节点。您可以直接在目标上分配内存。

void insert( node **head, int x){

    node **ptr_new = head;
    while( *ptr_new != NULL ){
        ptr_new = &((*ptr_new)->next);
    }

    // now temp refers either to head or to next of the last node.
    *ptr_new = malloc( sizeof(node) );
    if ( *ptr_new != NULL )
    {
        (*ptr_new)->next = NULL;
        (*ptr_new)->data = x;
    }
}

与原始代码相比,您有一个指向指针的指针,其中存储了新节点的地址。在原始文件中,您在temp不是NULL时进行了迭代。

while (temp != NULL) {
    temp = temp->next;
}

在此while循环temp==NULL之后,因为这是循环的终止条件。因此,您的计划在此处停止工作temp->next = new;

答案 2 :(得分:2)

您的代码存在两个问题:

  • temp指针被推到列表的末尾,直到它变为NULL,到那时将新指针存储到其next成员,并尝试调用未定义的行为(Segmentation fault在您的系统上)。
  • 如果列表为空,即使您在temp->next == NULL时停止循环,也无法以这种方式存储新项目。

还希望避免使用C ++关键字来命名C代码中的变量,因为如果需要这样做会使代码迁移到C ++变得更加困难。

同样,测试malloc是否失败并将指针返回到新节点或失败时NULL更为正确。

以下是更正后的版本:

node *insert(node **head, int x) {
    node *new_node = malloc(sizeof(node));
    if (new_node != NULL) {
        new_node->data = x;
        new_node->next = NULL;

        node *temp = *head;
        if (temp == NULL) {
            *head = new_node;
        } else {
            while (temp->next != NULL) {
                temp = temp->next;
            }
            temp->next = new_node;
        }
    }
    return new_node;
}

您还可以使用指向指针的指针迭代列表:它稍微复杂但更短,因为您只有一个测试来查找存储new指针的位置:

node *insert(node **head, int x) {
    node *new_node = malloc(sizeof(node));
    if (new_node != NULL) {
        new_node->data = x;
        new_node->next = NULL;

        node **np = head;
        while (*np) {
            np = &(*np)->next;
        }
        *np = new_node;
    }
    return new_node;
}