Ошибка сегментации при попытке добавить в связанный список, c ++ - PullRequest
0 голосов
/ 03 мая 2020

У меня есть структура, определенная следующим образом:

struct Node { 
    int day = 0; 
    int number = 0;
    Node* next = nullptr; 
};

и я написал функцию создания

Node* ll_create(int day, int number){
    Node* p = new Node;
    p->day = day;
    p->number = number;
    p->next = nullptr; 
    return p;
}

, но моя функция добавления всегда заканчивается ошибкой сегментации

void ll_append(Node* head, int day, int num, int len){
    Node* new_cnode = ll_create(day,num);

    Node* last = head;
    while (last->next != nullptr)
        last = last->next;

    last->next = new_cnode;

}

Может кто-нибудь сказать мне, как это исправить?

1 Ответ

0 голосов
/ 03 мая 2020

Скорее всего, root причина проблемы missing error handling. т. е. может соблюдаться базовое правило c: перед разыменованием любого указателя его следует проверить.

void ll_append(Node* head, int day, int num, int len){
    Node* new_cnode = ll_create(day,num);

    Node* last = head;
    while (last->next != nullptr) //Here, last (i.e. head) can be nullptr.
        last = last->next;

    last->next = new_cnode;

}

Решение может быть принято, когда вызывающий абонент ll_append должен обеспечить head или ll_append сам может подтвердить.

Первое решение может выглядеть следующим образом:

void ll_append(Node*& head, int day, int num, int len){
    Node* new_cnode = ll_create(day,num);
    //Case 1 : When head is pointing to empty list, you can create the first node.
    if(not head)
    {
       head = new_node;
       return;
    }
    //Case 2 : When head is pointing to a valid list (i.e. at least one node is present)
    Node* last = head;
    while (last->next != nullptr)
        last = last->next;

    last->next = new_cnode;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...