/* A simple program to maintain an ordered linked list of integers 
   version 1:  infinite loop for insertion and printing
*/

#include <stdio.h>
#include <stdlib.h>

struct
{
  int data;
  node_t* next;
} node_t;

/* Place value into a new node and put new node into an
   ordered linked list, so resulting list remains ordered */
void
insert (node_t** firstPtr);

/* Print elements on a linked list */
void
print (node_t* first);

/* Main driver program */
int
main (void)
{
  node_t* first = NULL;
  printf ("Program to maintain linked list of integers\n");
  while (1)
    {
      insert (&first);
      print (first);
    }
  return 0;
} // main


/* Place value into a new node and put new node into an ordered linked
   list, so resulting list remains ordered */
void
insert (node_t** firstPtr)
{
  node_t *newNode = (node_t*)malloc(sizeof(node_t));
  node_t *temp;

   printf("Enter value to be inserted into list: ");
   scanf ("%d", &(newNode->data));

   /* empty or new datum precedes first datum */
   if ((*firstPtr == NULL) || (newNode->data <= (*firstPtr)->data))
     {
       /* insert at front of list */
       newNode->next = *firstPtr;
       *firstPtr = newNode;
     }
   else 
     {  /* insert later in list */
       temp = *firstPtr;
       /* loop until last is reached or new datum precedes next datum */
       while ((temp->next != NULL) && (newNode->data > (temp->next)->data))
         temp = temp->next;
       newNode->next = temp->next;
       temp->next = newNode;
     }
} // insert


/* Print elements on a linked list 
   6 numbers are printed per line */
void
print (node_t *first)
{ 
  node_t* ptr = first;              /* temporary pointer to move through list */
  int number = 0;                  /* count number of numbers printed on line */
  printf("The current values on the linked list are:\n");

  while (ptr)
    {
      printf ("\t%d", ptr->data);
      number = (number+1) % 6;
      if (number == 0) /* could be !number, but number == 0 
                          clearer in counting context */
        printf ("\n");
      ptr = ptr->next;
    }
  if (number != 0) printf ("\n");
} // print
