C语言 有人可以解释以下代码的函数 pop(更具体地说是变量 retval)吗?



我在理解结构时遇到了一些麻烦,如果你们中的任何人能解释函数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等于函数返回0NULL- 表达式的值*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 

相关内容

  • 没有找到相关文章

最新更新