Реализуйте стек с указателями в c - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь реализовать простой стек в c с указателями и структурой, но я думаю, что у меня есть проблема с pu sh или print. Моя программа печатает только первый узел.

Если кто-то может помочь мне решить эту проблему

Вот мой код

stack.h

/***********************************************************************
* stack.h
***********************************************************************/

#include <stdbool.h>

#ifndef _STACK_H_
#define _STACK_H_

typedef struct Stack{
    int value;
    struct Stack* next;
}Stack;

Stack initStack();

bool push (Stack* s, int n);

int pop (Stack* s);

bool stackEmpty (Stack s);

void printStack (Stack s);

#endif

стек. c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "stack.h"

Stack initStack(){
    Stack s = {0, NULL};
    return s;
}

bool push (Stack* s, int n){
    if (stackEmpty(*s)){
        s->value = n;
        return true;
    }else{
        Stack stack = {n, s};
        s = &stack;
        return true;
    }
    return false;
}

int pop (Stack* s){
    int value = s->value;
    s = s->next;
    return value;
}

bool stackEmpty (Stack s){
    if (s.value == 0 && s.next == NULL)
    return true;
return false;
}

void printStack (Stack s){
    Stack* b = &s;
    printf("Stack : \n");
    while(b != NULL){
        printf("%d\n", b->value);
        b = b->value;
    }

основной

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "stack.h"

int main (int argc, char** argv) {

    Stack stack1 = initStack();

    push(&stack1, 5);

    printStack(stack1);
}

1 Ответ

2 голосов
/ 06 января 2020

Вы берете адрес локальной переменной здесь:

Stack stack = {n, s};
s = &stack;

Вам необходимо динамически распределить его:

Stack *stack = malloc(sizeof(*stack));
stack->value = n;
stack->next = s;
s = stack;

Для согласованности я бы порекомендовал взять и вернуть Stack * вместо Stack и, возможно, переименуйте initStack в newStack.

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