我在理解结构时遇到了一些麻烦,如果你们中的任何人能解释函数pop
以及在这种情况下retval
什么,我将不胜感激。提前谢谢你!代码如下所示:
typedef struct node {
int val;
struct node * next;
} node_t;
int pop(node_t ** head) {
int retval = -1;
node_t * next_node = NULL;
if (*head == NULL) {
return -1;
}
next_node = (*head)->next;
retval = (*head)->val;
free(*head);
*head = next_node;
return retval;
}
这是一个糟糕的函数定义。例如,它的返回值可能会使函数的用户感到困惑:返回值 -1 是存储在堆栈中的实际值还是错误代码。
有使用的变量值的初始值设定项,其值未在函数中的其他任何地方使用,例如
int retval = -1;
或
node_t * next_node = NULL;
函数可以通过以下方式定义
int pop( node_t **head, int *value )
{
int success = *head != NULL;
if (success )
{
*value = ( *head )->val;
node_t *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
return success;
}
并且该函数可以像
node_t *head = NULL;
//...
int value;
if ( pop( &head, &value ) )
{
printf( "The value stored on the top of the stack is %dn", value );
}
在循环中使用这样的函数也很方便。例如
int value;
while ( pop( &head, &value ) )
{
printf( "%d ", value );
}
puts( "-> the stack is empty." );
函数在做什么?
该函数弹出存储在堆栈上的值。如果堆栈为空
int success = *head != NULL;
也就是说,当*head
等于函数返回0
NULL
- 表达式的值*head != NULL
在这种情况下,这意味着对于函数的用户来说,堆栈是空的,没有什么可弹出的。
否则,存储在堆栈上的值将复制到参数value
中,并且保留该值的节点将从列表中删除,并释放其内存。并且该函数返回变量的值success
在这种情况下等于1
.
if (success )
{
value = ( *head )->val;
node_t *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
return success;
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int val;
struct node *next;
} node_t;
int push( node_t **head, int value )
{
node_t *new_node = malloc( sizeof ( node_t ) );
int success = new_node != NULL;
if ( success )
{
new_node->val = value;
new_node->next = *head;
*head = new_node;
}
return success;
}
int pop( node_t **head, int *value )
{
int success = *head != NULL;
if (success )
{
*value = ( *head )->val;
node_t *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
return success;
}
int main(void)
{
node_t *head = NULL;
const int N = 10;
int i = N;
while ( i != 0 && push( &head, i ) ) --i;
int value;
printf( "The stack contained: " );
while ( pop( &head, &value ) )
{
printf( "%d ", value );
}
putchar( 'n' );
return 0;
}
程序输出为
The stack contained: 1 2 3 4 5 6 7 8 9 10