确实返回;该功能有什么作用?

时间:2018-11-01 00:13:11

标签: c return

我正在尝试按照this教程中给出的说明来学习链表,但我似乎无法理解是否在return;语句的步骤4的if中以下代码可以执行任何操作...

/* 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 :(得分:3)

它执行与其他地方相同的操作,立即从函数中退出。

如果不返回,则将继续执行该函数,但是它将无法正常工作。下一段代码是:

while (last->next != NULL) 

如果if为真,则last == NULL(由于初始化last = *head)。此代码将尝试通过空指针间接调用,这是未定义的行为。

执行其余代码没有任何意义,该代码将新节点追加到列表中的最后一个节点之后。该列表为空,因此没有要附加的最后一个节点。您已经将它插入为if块中的第一个节点。

顺便说一句,if不是循环。循环重复执行代码,并使用forwhile编写代码。 if是有条件的,它要么执行一次代码,要么根本不执行代码。

答案 1 :(得分:1)

是的,它更改了代码流。当4中的条件为true时,将执行AttributeError,然后该函数将不再进行处理。 如果您退货,那么无论是否有4,都将始终执行5和6。

另一种样式(避免在函数中间返回)将为步骤5和步骤6提供else。如下所示:

*head_ref = new_node;

请注意,由于函数不返回值,因此无需在最后一行返回。