我正在尝试按照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*/
答案 0 :(得分:3)
它执行与其他地方相同的操作,立即从函数中退出。
如果不返回,则将继续执行该函数,但是它将无法正常工作。下一段代码是:
while (last->next != NULL)
如果if
为真,则last == NULL
(由于初始化last = *head)
。此代码将尝试通过空指针间接调用,这是未定义的行为。
执行其余代码没有任何意义,该代码将新节点追加到列表中的最后一个节点之后。该列表为空,因此没有要附加的最后一个节点。您已经将它插入为if
块中的第一个节点。
顺便说一句,if
不是循环。循环重复执行代码,并使用for
和while
编写代码。 if
是有条件的,它要么执行一次代码,要么根本不执行代码。
答案 1 :(得分:1)
是的,它更改了代码流。当4中的条件为true时,将执行AttributeError
,然后该函数将不再进行处理。
如果您退货,那么无论是否有4,都将始终执行5和6。
另一种样式(避免在函数中间返回)将为步骤5和步骤6提供else。如下所示:
*head_ref = new_node;
请注意,由于函数不返回值,因此无需在最后一行返回。