#include <stdio.h>
#include <stdlib.h>
struct stack
{
struct node *head;
int size;
};
struct node
{
int n;
struct node *next;
};
int push(int, struct stack*);
int pop(struct stack*);
void print(struct stack *stack);
void free_memory(struct stack*);
int main(void)
{
int result = EXIT_SUCCESS;
struct stack *stack = malloc(sizeof *stack);
if (NULL == stack)
{
perror("malloc() error");
return EXIT_FAILURE;
}
stack->head = NULL;
stack->size = 0;
{
int n = 0;
// push 5 ints
for (size_t i = 0; i < 5; i++)
{
if (push(n, stack) == -1)
{
perror("push() error");
result = EXIT_FAILURE;
break;
}
n++;
}
print(stack);
}
if (EXIT_SUCCESS == result)
{
// pop 2 ints
for (size_t i = 0; i < 2; i++)
pop(stack);
print(stack);
}
free_memory(stack);
print(stack);
return result;
}
int push(int n, struct stack *stack)
{
struct node *new_node = malloc(sizeof *new_node);
if (new_node == NULL)
return -1;
else
{
new_node->n = n;
new_node->next = stack->head;
stack->head = new_node;
stack->size++;
}
return 0;
}
int pop(struct stack *stack)
{
struct node *head = stack->head;
int n = head->n;
stack->head = head->next;
stack->size--;
free(head);
return n;
}
void print(struct stack *stack)
{
struct node *head = stack->head;
while (head)
{
printf("%3d", head->n);
head = head->next;
}
printf("\n");
}
void free_memory(struct stack *stack)
{
while (stack->head != NULL)
pop(stack);
}
/*
run:
4 3 2 1 0
2 1 0
*/