/******************************************************************************
 * Short example of linked list                                               *
 * 28-APR-2004, B. Ulmann fecit                                               *
 ******************************************************************************/

#include <stdio.h> /* Miscellaneous includes */
#include <stdlib.h>
#include <math.h>
#include <time.h>

typedef struct list_struct /* Define list data structure */
{
  int number;               /* Place to hold an integer */
  struct list_struct *next; /* Pointer to next element */
} list_type;

int main (int argc, char **argv)
{
  int number_of_elements; /* Number of elements to be created */

  list_type *head = (list_type *) 0, /* Head of list */
    *element,                        /* Some element */
    *last;                           /* Current element */

  if (argc != 2) /* Wrong number of arguments - one and only one expected! */
  {
    printf ("Usage: %s <number_of_elements>\n");
    return -1;
  }

  number_of_elements = atoi (*++argv); /* Convert parameter to int */
  printf ("Generate list with %d entries...\n", number_of_elements);

  srand (time (NULL)); /* Initialize random number generator */

  /********** Generate list **********/
  for (; number_of_elements; number_of_elements--)
  {
    if (!(element = (list_type *) malloc (sizeof (list_type)))) /* Get memory */
    {
      printf ("Out of memory!\n");
      return -1;
    }

    if (!head)                         /* First element at all, so */ 
      head = element;                  /* remember head of newly formed list */
    else                               /* Not first element, so */
      last -> next = element;          /* create link */

    last = element;                    /* Remember last element */

    element -> number = rand ();       /* Write data into element */
    element -> next = (list_type *) 0; /* No next element until now */
  }

  /********** Process recently generated list **********/
  last = head;
  while (last)
  {
    printf ("%d\n", last -> number);
    last = last -> next;
  }

  return 0;
}
