issues
- missing stdlib include for malloc prototype
- function add is coded to handle null message parameters, create_msg is not necessary ( and duplicates the code in add )
- add and create_msg prototypes inconsistent with function definitions below
- void mainis not one of the standard main prototypes
- create_msg declared as void, but returns a value
- function add ( and create_msg ) attempt to modify their M input parameter ( which is just a local copy )
- no error checking after malloc
- no need to cast void *return of malloc
- declaring integer in for loop header reduces portability
- Message memory is leaking ( no way to free the memory )
- you have no way to print the link list to know if it worked..
code
#include <stdio.h>
#include <stdlib.h>
typedef struct msg *M;
struct msg{
  double data; 
  M next;
};
#define create_msg(M) 
void add(M *head, double d);
void print_messages(M head);
void free_messages(M head);
int main(void){
  srand(0);
  M list_of_msg = NULL;
  int i;
  create_msg(list_of_msg);
  for( i = 0; i < 5; i++){
/* create_msg function was redundant and removed to a noop */
/*    create_msg(list_of_msg);*/
    add(&list_of_msg , rand()%15);
  }
  print_messages(list_of_msg);
  free_messages(list_of_msg);
  return 0;
}
void add(M *head, double d){
  M m, last;
  m = malloc(sizeof(struct msg));
  if(!m)
  {
    /* consider making add return int
     * this way can throw an error code and check for it from client */
    return ;
  }
  last = *head;
  m->data = d;
  m->next = NULL;
  if (*head == NULL)
  {
    *head = m;
  }
  else
  {
    while (last->next != NULL)
    {
      last = last->next;
    }
    last->next = m;
  }
}
void print_messages(M head)
{
  M cursor = head;
  while(cursor)
  {
    printf("%lf ->\n", cursor->data);
    cursor = cursor->next;
  }
}
void free_messages(M head)
{
  M cursor, next;
  cursor = head;
  while(cursor)
  {
    next = cursor->next;
    free(cursor);
    cursor = next;
  }
}
output
$ gcc -g test.c -o test
$ valgrind ./test
==1121== Memcheck, a memory error detector
==1121== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==1121== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==1121== Command: ./test
==1121== 
13.000000 ->
1.000000 ->
12.000000 ->
10.000000 ->
8.000000 ->
==1121== 
==1121== HEAP SUMMARY:
==1121==     in use at exit: 0 bytes in 0 blocks
==1121==   total heap usage: 5 allocs, 5 frees, 80 bytes allocated
==1121== 
==1121== All heap blocks were freed -- no leaks are possible
==1121== 
==1121== For counts of detected and suppressed errors, rerun with: -v
==1121== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
reference