Реализуя стек с использованием узлов, указатель верхнего узла не известен вне функции, указатель верхнего всегда всегда равен NULL - PullRequest
0 голосов
/ 18 февраля 2019

Вот моя C-программа для реализации стека (с узлами в виде связанного списка).Я создаю новый стек, возвращаю указатель, а затем вызываю функцию rpn_stack_push () с указателем и данными, которые я хочу назначить.

Но, очевидно, верхний узел стека всегда равен NULL, хотя я обновляю его в функции rpn_stack_push ().

Почему это происходит, и есть ли способ исправить это, не изменяямои определения функций?

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 голосов
/ 18 февраля 2019

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);

Это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...