【问题标题】:Pass by pointer reference with stack push使用堆栈推送通过指针引用传递
【发布时间】:2016-05-01 02:00:50
【问题描述】:

我正在尝试创建的堆栈的节点定义:

typedef struct node {
double value;
struct node *prev;
} node_t;

主要:

node_t *stack = NULL;
push(stack, new_node(strtod(token, NULL)));

关于 new_node 函数的注意事项 - 如果 token = "1",new_node 返回一个节点,其结构节点 *prev 等于 NULL(根据需要),双值 = 1(根据需要)

 void push(node_t *stack, node_t node) {
    if(stack != NULL) {
        node_t temp;
        temp = stack[0];
        stack = &node;
        node.prev = &temp;
    }
    else {
        stack = &node;
    }
}

当我修改堆栈时,我希望堆栈也会在 main 中被修改;然而,这种情况并非如此。在 main 中,调用 push() 后,堆栈保持为 NULL。

【问题讨论】:

  • 您需要发布 new_node() 代码

标签: c struct linked-list stack


【解决方案1】:

问题出在这里:

node_t *stack = NULL;
push(stack, new_node(strtod(token, NULL)));

你创建一个指针,将它按值传递给一个函数,然后期望它在之后被改变。但是 C 不能那样工作——按值传递的变量在调用上下文中不会被修改。您需要传递一个指针(指向指针):

node_t *stack = NULL;
push(&stack, new_node(strtod(token, NULL)));

然后:

 void push(node_t **stack, node_t node) {
    if(*stack != NULL) {
        node_t temp;
        temp = (*stack)[0];
        *stack = &node;
        node.prev = &temp;
    }
    else {
        *stack = &node;
    }
}

现在更改将在外部可见,因为您使用双指针来修改指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2014-05-06
    • 2014-07-27
    • 2023-03-03
    相关资源
    最近更新 更多