Указатель на указатель не работает во время вызова функции?
Я пытаюсь написать отдельный файл с вспомогательными функциями для стековых операций. Я хочу передать вершину стека по ссылке в качестве аргумента для операций стека из основного файла.
Так как 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;
}