#include <stdio.h>
#include <stdlib.h>
typedef struct _IntegerListElement {
int element_value;
struct _IntegerListElement *next;
} IntegerListElement;
typedef struct _IntegerList {
IntegerListElement *first;
IntegerListElement *last;
} IntegerList;
/* begin: private function section */
static void
integer_list_append_element (IntegerListElement *element, int element_value)
{
if (element)
{
integer_list_append_element (element->next, element_value);
if (!element->next)
{
element->next =
(IntegerListElement *) malloc (sizeof (IntegerListElement));
element->next->element_value = element_value;
element->next->next = NULL;
}
}
}
static void
integer_list_print_element (IntegerListElement *element)
{
if (element)
{
printf ("%d\t", element->element_value);
integer_list_print_element (element->next);
}
else
printf ("\n");
}
static void
integer_list_free_element (IntegerListElement *element)
{
if (element)
{
integer_list_free_element (element->next);
free (element);
}
}
/* end: private function section */
/* begin: public function section */
/**
* typical append implementation
*/
void
integer_list_append (IntegerList *list, int element_value)
{
if (list->first)
integer_list_append_element (list->first, element_value);
else
{
list->first =
(IntegerListElement *) malloc (sizeof (IntegerListElement));
list->first->element_value = element_value;
list->first->next = NULL;
}
}
/**
* optimized append implementation
*/
void
integer_list_append_constant_time (IntegerList *list, int element_value)
{
if (!list->first)
{
list->first =
(IntegerListElement *) malloc (sizeof (IntegerListElement));
list->first->next = NULL;
list->first->element_value = element_value;
list->last = list->first;
}
else
{
list->last->next =
(IntegerListElement *) malloc (sizeof (IntegerListElement));
list->last->next->element_value = element_value;
list->last->next->next = NULL;
list->last = list->last->next;
}
}
void
integer_list_print (IntegerList *list)
{
integer_list_print_element (list->first);
}
IntegerList *
integer_list_create ()
{
IntegerList *new_list;
new_list = (IntegerList *) malloc (sizeof (IntegerList));
new_list->first = NULL;
new_list->last = NULL;
return new_list;
}
void
integer_list_free (IntegerList *list)
{
if (list)
{
integer_list_free_element (list->first);
free (list);
}
}
/* end: public function section */
int
main (int argc, char **argv)
{
IntegerList *list;
int i;
list = integer_list_create ();
for (i = 1; i < 10; i++)
integer_list_append_constant_time (list, i);
integer_list_print (list);
integer_list_free (list);
return 0;
}