Указатель на указатель не работает во время вызова функции?

Я пытаюсь написать отдельный файл с вспомогательными функциями для стековых операций. Я хочу передать вершину стека по ссылке в качестве аргумента для операций стека из основного файла.

Так как top изменяется, я передаю указатель top по ссылке. Но даже тогда это не работает. Куда я иду не так?

PS: я знаю, что это не лучший способ реализации стека, но я просто хотел понять, почему он не работает.

//Stack.h

void print(stacknode **P)
{

    stacknode *S;
    S=*P;

    printf("Printing stack from top to bottom...\n");
    stacknode *temp=S;
    while(temp != NULL)
    {
        printf("%d\t", temp->data);
        temp=temp->next;
    }
    printf("\n");
}


void push(stacknode **P, int n)

{

    stacknode *S;
    S=*P;
    stacknode *new=(stacknode *)malloc(sizeof(stacknode));
    new->data=n;
    new->next=S; 
    S=new;
    print(&S);

}

//main.c

main()
{
    printf("Creating new stack...\n");
    stacknode *S=NULL;

    printf("Pushing first number....\n");
    push(&S, 2);

    print(&S);/*Prints nothing*/

}

1 ответ

Решение

Так как top изменяется, я передаю указатель top по ссылке.

Но вы не используете этот факт, чтобы изменить вершину. Вот одно решение (я не скомпилировал и не проверил это, поэтому оно может содержать ошибки):

Stack.h: (объявления только в заголовочных файлах, без кода)

typedef struct stacknode stacknode;
struct stacknode {
    stacknode* next;
    int data;
};

void print(stacknode* top); // no need for ptr ref
void push(stacknode** ptop);

Stack.c:

#include "Stack.h"
#include <stdio.h>

void print(stacknode* top)
{
    printf("Printing stack from top to bottom...\n");
    for (stacknode* p = top; p; p = p->next)
    {
        printf("%d\t", p->data);
    }
    printf("\n");
}

void push(stacknode** ptop, int n)
{
    stacknode* p = malloc(sizeof *p); // don't cast malloc in C
    if (!p)
        /* handle out of memory */;
    p->data = n;
    p->next = *ptop; 
    *ptop = p;
    print(p);
}

main.c:

#include "Stack.h"
#include <stdio.h>

int main(void) // declare return type
{
    printf("Creating new stack...\n");
    stacknode* S = NULL;

    printf("Pushing first number....\n");
    push(&S, 2);

    print(S);
    return 0;
}
Другие вопросы по тегам