Возвращается ли; сделать что-нибудь в этой функции? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь изучить связанный список, следуя инструкциям, приведенным в этом руководстве, и я не могу понять, если return; в операторе if на шаге 4 следующего код делает что-нибудь ...

/* Given a reference (pointer to pointer) to the head 
   of a list and an int, appends a new node at the end */

void append(struct Node** head_ref, int new_data) 
{ 
    /* 1. allocate node */
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node)); 
    struct Node *last = *head_ref; /* used in step 5*/

    /* 2. put in the data */
    new_node->data = new_data; 

    /* 3. This new node is going to be the last node, so make next of it as NULL*/
    new_node->next = NULL; 

    /* 4. If the Linked List is empty, then make the new node as head */
    if (*head_ref == NULL) 
    { 
        *head_ref = new_node; 
        return; //<<<this return here
    } 

    /* 5. Else traverse till the last node */
    while (last->next != NULL) 
        last = last->next; 

    /* 6. Change the next of last node */
    last->next = new_node; 
    return;  
}

было бы следующее функционально так же, как и выше, если бы не было такого выражения return;, как это?

/*4. If the Linked List is empty, then make the new node as head */
if(*head_ref == NULL)
{
    *head_ref = new_node;
}
/*step 5*/
/*step 6*/

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Да, это меняет поток кода. Если условие в 4 истинно, то выполняется *head_ref = new_node; и функция возвращается без обработки. Если вы возьмете возврат, то 5 и 6 всегда будут выполняться независимо от того, есть 4 или нет.

Альтернативным стилем (избегая возврата в середине функции) будет использование else для шагов 5 и 6. Подобно следующему:

/* 4. If the Linked List is empty, then make the new node as head */
if (*head_ref == NULL) 
{ 
    *head_ref = new_node; 
} 
else
{
    /* 5. Else traverse till the last node */
    while (last->next != NULL) 
        last = last->next; 

    /* 6. Change the next of last node */
    last->next = new_node;
}

Обратите внимание, что нет необходимости возвращать в последней строке, так как функция не возвращает значение.

0 голосов
/ 01 ноября 2018

Он делает то же самое, что и где-либо еще, он немедленно выходит из функции.

Если вы не вернетесь, вы продолжите выполнять функцию, но она не будет работать должным образом. Следующий блок кода:

while (last->next != NULL) 

Если это if было истиной, то last == NULL (из-за инициализации last = *head). Этот код будет пытаться выполнить косвенный переход через нулевой указатель, что является неопределенным поведением.

Нет смысла выполнять остальную часть кода, который добавляет новый узел после последнего узла в списке. Список был пуст, поэтому нет последнего узла для добавления. Вы уже вставили его в качестве первого узла в блоке if.

Кстати, if - это не цикл. Цикл выполняет код повторно, и они пишутся с использованием for и while. if является условным, он либо выполняет код один раз, либо не выполняет его вообще.

...