使用节点实现堆栈,函数外未知顶部节点指针,顶部指针始终为NULL

时间:2019-02-18 18:17:35

标签: c stack

这是我的C程序,用于实现堆栈(节点作为链接列表)。我正在创建一个新的堆栈,返回指针,然后使用指针和要分配给它的数据调用rpn_stack_push()函数。

但是显然,即使我在rpn_stack_push()函数中更新堆栈,堆栈的顶部节点始终为NULL。

为什么会发生这种情况,并且有一种方法可以在不更改我的函数定义的情况下进行修复?

struct _rpn_stack{
        int data;
        struct _rpn_stack *link;
};

typedef struct _rpn_stack rpn_stack_t;

rpn_stack_t* rpn_stack_new() {
    rpn_stack_t *top;
    top = NULL;
    return top;
}

void rpn_stack_push(rpn_stack_t *s, void *data) {
    rpn_stack_t* temp = malloc(sizeof(rpn_stack_t));

    temp->data = (int) *((int*) data);
    temp->link = s;
    s = temp;
}

int main()
{
    rpn_stack_t* n;
    n  =  rpn_stack_new();

    int a =  12;
    int c = 13;
    int* d =  &c;
    int* b =  &a;

    rpn_stack_push(n,  d);
    rpn_stack_push(n,  b);


    while (n != NULL)
    {
      printf("%d -> ", n->data);
      n = n->link;
    }

    return 0;
}

通常它应该显示13-> 12->,但是因为堆栈(n)的最高节点为NULL,所以它根本不会循环到循环!

1 个答案:

答案 0 :(得分:0)

void rpn_stack_push(rpn_stack_t *s, void *data)与rpn_stack_t一起使用* s表示您使用了按值调用参数,在调用此函数后,s指针不会更改其值。 因此,请按照以下说明将函数rpn_stack_push的原型从void rpn_stack_push(rpn_stack_t *s, void *data)更改为void rpn_stack_push(rpn_stack_t **s, void *data)

void rpn_stack_push(rpn_stack_t **s, void *data) {
      rpn_stack_t* temp = (rpn_stack_t*)malloc(sizeof(rpn_stack_t));

      temp->data = (int) *((int*)data);
      temp->link = *s;
      *s = temp;
}

调用时,请替换以下行:

rpn_stack_push(n,  d);
rpn_stack_push(n,  b);

通过

rpn_stack_push(&n,  d);
rpn_stack_push(&n,  b);

那应该可以。