#include <stdio.h>   // printf
#include <stdlib.h>  // NULL, EXIT_SUCCESS, malloc
#include <assert.h>  // assert (should normally only be used for testing)

typedef struct node_st {
  void* element;
  struct node_st* next;
} Node;

Node* Push(Node* head, void* e);

int main(int argc, char** argv) {
  char* hello = "Hi there!";
  char* goodbye = "Bye bye.";
  Node* list = NULL;

  list = Push(list, (void*) hello);
  list = Push(list, (void*) goodbye);
  printf("payload is: '%s'\n", (char*) list->next->element);

  return EXIT_SUCCESS;
}

Node* Push(Node* head, void* e) {
  Node* n = (Node*) malloc(sizeof(Node));

  assert(n != NULL);  // crashes if false
  n->element = e;
  n->next = head;

  return n;
}