链表追加中的分段错误

Segmentation Fault In Linked List Append

我一直在使用链表,我在新文件中使用了以下代码作为追加函数,它运行良好,但是当我复制它时,我的主代码在 while(current->next != null) 处出现分段错误.它在编译时没有给出任何警告,所以我不知道这里有什么问题。

// Linked List Node for Reading Comments
struct Node{
    char value;
    struct Node *next;
};

void append(struct Node * headNode, char newElement){
    struct Node *newNode = malloc(sizeof(struct Node));  //Dynamically Allocating Memory for New Node                   
    struct Node *current = headNode;                     //Creating A Node to traverse the linked list

    newNode->value = newElement;                         //Assigning the values of newNode to the given value
    newNode->next = NULL;                                //Setting next value to be null since its the last node

    if (headNode == NULL){                               //Checking if headnode is empty
        headNode = newNode;                              //Assigning headnode and tailnode to be newnode
    }

    else {                
        while(current->next != NULL){                    //Traversing through the linked list
            current = current->next;
        }
        current->next = newNode;                         //Setting tailnode's next to be newnode   

    }
 
}

void printLinkedList(struct Node* headNode){
    while(headNode != NULL){
        fprintf(stderr,"%c",headNode->value);
        headNode = headNode->next;
    }
}

如果有人可以对此发表评论,请发表评论。

您的代码不允许将节点添加到空列表。如果您尝试并没有在调用方初始化您的 head 指针,您可能会遇到这样的行为。

例如,在 main 中,您可以:

    struct Node* head; // not initialised
    append(head, 'a'); 
    printLinkedList(head);

接下来就是这些问题:

  • 如果 head 恰好不是 NULL,那么 else 块将启动并且 current 指针将引用一些意外的内存地址。
  • append不会改变mainhead变量。它只会修改恰好具有相似名称的局部变量(headNode)。

更正,将head地址传给append函数,让append相应处理:

void append(struct Node ** headNode, char newElement) {
    struct Node *newNode = malloc(sizeof(struct Node));
    struct Node *current = *headNode;
    newNode->value = newElement;
    newNode->next = NULL;

    if (*headNode == NULL) {
        *headNode = newNode;
    } else {                
        while(current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

注意在 headNode 出现的地方附加 *。在 main:

    struct Node* head;
    append(&head, 'a');
    printLinkedList(head);