00001
00010 #include <stdlib.h>
00011 #include <errno.h>
00012 #include "list.h"
00013
00019 static LISTITEM *create_item(void *data,
00020 LISTITEM *prev,
00021 LISTITEM *next)
00022 {
00023 LISTITEM *item = malloc(sizeof(LISTITEM));
00024 if (item!=NULL)
00025 {
00026 item->data = data;
00027 item->next = next;
00028 item->prev = prev;
00029 }
00030 else
00031 errno = ENOMEM;
00032 return item;
00033 }
00034
00037 static void destroy_item(LISTITEM *item)
00038 {
00039 if (item->prev!=NULL)
00040 item->prev->next = item->next;
00041 if (item->next!=NULL)
00042 item->next->prev = item->prev;
00043 free(item);
00044 }
00045
00051 LIST *list_create(void)
00052 {
00053 LIST *list = malloc(sizeof(LIST));
00054 if (list!=NULL)
00055 {
00056 list->first = NULL;
00057 list->last = NULL;
00058 list->size = 0;
00059 }
00060 else
00061 errno = ENOMEM;
00062 return list;
00063 }
00064
00067 void list_destroy(LIST *list)
00068 {
00069 LISTITEM *item;
00070 for (item=list->first; item!=NULL; item=item->next)
00071 {
00072 destroy_item(item);
00073 list->size--;
00074 }
00075
00076 }
00077
00083 LISTITEM *list_append(LIST *list,
00084 void *data)
00085 {
00086 LISTITEM *item = create_item(data,list->last,NULL);
00087 if (item!=NULL) {
00088 if (list->first==NULL)
00089 list->first = item;
00090 if (list->last!=NULL)
00091 list->last->next = item;
00092 list->last = item;
00093 list->size++;
00094 }
00095 return item;
00096 }
00097
00100 void list_shuffle(LIST *list)
00101 {
00102 LISTITEM **index;
00103 unsigned int i=0;
00104 LISTITEM *item;
00105
00106 if (list == NULL)
00107 return;
00108 if (list->size < 2)
00109 return;
00110
00111 index = (LISTITEM**)malloc(sizeof(LISTITEM*)*list->size);
00112 for (item=list->first; item!=NULL; item=item->next)
00113 index[i++] = item;
00114 for (i=0; i<list->size; i++)
00115 {
00116 LISTITEM *from = index[i], *to;
00117 unsigned int j = rand() % list->size;
00118 void *temp = from->data;
00119 to = index[j];
00120 from->data = to->data;
00121 to->data = temp;
00122 }
00123 free(index);
00124 }