src/dllist.c

Go to the documentation of this file.
00001 /*
00002  * Doubly Linked List
00003  */
00004 
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include <string.h>
00008 
00009 #include "dllist.h"
00010 
00011 /* Create the List */
00012 dllist *dllist_create_list()
00013 {
00014 
00015     dllist *temp;
00016 
00017     temp = malloc(sizeof(dllist));
00018     if (temp == NULL) {
00019         return NULL;
00020     }
00021 
00022     memset(temp, 0, sizeof(temp));
00023     temp->head = NULL;
00024     temp->tail = NULL;
00025     temp->size = 0;
00026 
00027     return temp;
00028 }
00029 
00030 /* Create a node */
00031 dllist_node *dllist_create_node(void *data)
00032 {
00033 
00034     dllist_node *temp;
00035 
00036     temp = malloc(sizeof(dllist_node));
00037     if (temp == NULL) {
00038         return NULL;
00039     }
00040 
00041     memset(temp, 0, sizeof(dllist_node));
00042     temp->prev = NULL;
00043     temp->next = NULL;
00044     temp->data = data;
00045 
00046     return temp;
00047 }
00048 
00049 /* Destroy the List - Won't destroy unless the list is empty */
00050 int dllist_destroy_list(dllist * dllist)
00051 {
00052 
00053     if (!dllist)
00054         return 1;
00055 
00056     /* Check the size */
00057     if (dllist->size != 0) {
00058         return 0;
00059     } else {
00060         dllist->head = NULL;
00061         dllist->tail = NULL;
00062         free(dllist);
00063         return 1;
00064     }
00065 
00066 }
00067 
00068 /* Destroy a Node - Returns the data in the node */
00069 void *dllist_destroy_node(dllist_node * node)
00070 {
00071 
00072     void *data;
00073 
00074     if (!node)
00075         return NULL;
00076 
00077     data = node->data;
00078     node->prev = NULL;
00079     node->next = NULL;
00080     node->data = NULL;
00081     free(node);
00082 
00083     return data;
00084 
00085 }
00086 
00087 /* Insert a given node after a node */
00088 void dllist_insert_after(dllist * dllist, dllist_node * node,
00089         dllist_node * newnode)
00090 {
00091 
00092     /* Bad node to insert */
00093     if (!node) {
00094         return;
00095     }
00096 
00099     newnode->prev = node;
00100     newnode->next = node->next;
00101     if (node->next == NULL) {
00102         dllist->tail = newnode;
00103     } else {
00104         (node->next)->prev = newnode;
00105     }
00106     node->next = newnode;
00107 
00108     /* Increment */
00109     dllist->size++;
00110 
00111     return;
00112 }
00113 
00114 /* Insert a given node before a node */
00115 void dllist_insert_before(dllist * dllist, dllist_node * node,
00116         dllist_node * newnode)
00117 {
00118 
00119     /* Bad node to insert */
00120     if (!node) {
00121         return;
00122     }
00123 
00126     newnode->prev = node->prev;
00127     newnode->next = node;
00128     if (node->prev == NULL) {
00129         dllist->head = newnode;
00130     } else {
00131         (node->prev)->next = newnode;
00132     }
00133     node->prev = newnode;
00134 
00135     /* Increment */
00136     dllist->size++;
00137 
00138     return;
00139 }
00140 
00141 /* Insert a node at the beginning */
00142 void dllist_insert_beginning(dllist * dllist, dllist_node * newnode)
00143 {
00144 
00145     /* Bad node to insert */
00146     if (!newnode) {
00147         return;
00148     }
00149 
00152     /* If there is no head it means empty list */
00153     if (dllist->head == NULL) {
00154         dllist->head = newnode;
00155         dllist->tail = newnode;
00156         newnode->prev = NULL;
00157         newnode->next = NULL;
00158 
00159         /* Increment */
00160         dllist->size++;
00161 
00162     } else {
00163         dllist_insert_before(dllist, dllist->head, newnode);
00164     }
00165 
00166     return;
00167 }
00168 
00169 /* Insert a node at the end of the list */
00170 void dllist_insert_end(dllist * dllist, dllist_node * newnode)
00171 {
00172 
00173     /* Bad node to insert */
00174     if (!newnode) {
00175         return;
00176     }
00177 
00180     /* If there is no tail means empty list */
00181     if (dllist->tail == NULL) {
00182         dllist_insert_beginning(dllist, newnode);
00183     } else {
00184         dllist_insert_after(dllist, dllist->tail, newnode);
00185     }
00186 
00187     return;
00188 
00189 }
00190 
00191 /* Remove a node from the list - returns the data */
00192 void *dllist_remove(dllist * dllist, dllist_node * node)
00193 {
00194 
00195     void *data;
00196 
00197     /* Invalid node? */
00198     if (!node) {
00199         return NULL;
00200     }
00201 
00202     /* Invalid list? */
00203     if (!dllist) {
00204 
00205         /* Try and return the data */
00206         data = dllist_destroy_node(node);
00207         return data;
00208     }
00209 
00213     /* Somehow the list has nothing in it yet it thinks it does */
00214     if (dllist->head == NULL && dllist->tail == NULL) {
00215 
00216         /* Try and return the data */
00217         data = dllist_destroy_node(node);
00218         return data;
00219     }
00220 
00221     /* We're checking if this first node */
00222     if (node->prev == NULL) {
00223         dllist->head = node->next;
00224     } else {
00225         (node->prev)->next = node->next;
00226     }
00227 
00228     /* Check if end of list */
00229     if (node->next == NULL) {
00230         dllist->tail = node->prev;
00231     } else {
00232         (node->next)->prev = node->prev;
00233     }
00234 
00235     /* Destroy Node */
00236     data = dllist_destroy_node(node);
00237 
00238     /* De-Increment */
00239     dllist->size--;
00240 
00241     return data;
00242 
00243 }
00244 
00245 /* Remove a Node at pos - returns the data */
00246 void *dllist_remove_node_at_pos(dllist * dllist, int pos)
00247 {
00248 
00249     int counter = 1;
00250     dllist_node *temp;
00251     void *data;
00252 
00253     if (!dllist) {
00254         return NULL;
00255     }
00256 
00257     if (dllist_size(dllist) < pos) {
00258         return NULL;
00259     }
00260 
00261     /* Start at the head */
00262     temp = dllist_head(dllist);
00263 
00264     while (counter != pos) {
00265 
00266         temp = dllist_next(temp);
00267         counter++;
00268 
00269     }
00270 
00271     /* Remove the node */
00272     data = dllist_remove(dllist, temp);
00273 
00274     return data;
00275 
00276 }
00277 
00278 /* Utility functions */
00279 
00280 /* Get Head node */
00281 dllist_node *dllist_head(dllist * dllist)
00282 {
00283 
00284     if (!dllist)
00285         return NULL;
00286 
00287     return dllist->head;
00288 }
00289 
00290 /* Get Tail Node */
00291 dllist_node *dllist_tail(dllist * dllist)
00292 {
00293     
00294     if (!dllist)
00295         return NULL;
00296 
00297     return dllist->tail;
00298 }
00299 
00300 /* Gets next node */
00301 dllist_node *dllist_next(dllist_node * node)
00302 {
00303 
00304     if (!node)
00305         return NULL;
00306 
00307     return node->next;
00308 }
00309 
00310 /* Gets previous node */
00311 dllist_node *dllist_prev(dllist_node * node)
00312 {
00313     if (!node)
00314         return NULL;
00315 
00316     return node->prev;
00317 }
00318 
00319 /* Returns the data for the node */
00320 void *dllist_data(dllist_node * node)
00321 {
00322 
00323     if (!node)
00324         return NULL;
00325 
00326     return node->data;
00327 }
00328 
00329 /* Get the size of the list */
00330 int dllist_size(dllist * dllist)
00331 {
00332 
00333     if (!dllist) {
00334         return 0;
00335     }
00336 
00337     return dllist->size;
00338 }
00339 
00340 /* Get the data from the Node in the List at Pos # */
00341 void *dllist_get_node(dllist * dllist, int pos)
00342 {
00343 
00344     int counter = 1;
00345     dllist_node *temp;
00346 
00347     if (!dllist) {
00348         return NULL;
00349     }
00350 
00351     if (dllist_size(dllist) < pos) {
00352         return NULL;
00353     }
00354 
00355     if (pos < counter) {
00356         return NULL;
00357     }
00358 
00359     /* Start at the head */
00360     temp = dllist_head(dllist);
00361 
00362     while (counter != pos) {
00363 
00364         temp = dllist_next(temp);
00365         counter++;
00366 
00367     }
00368 
00369     return dllist_data(temp);
00370 
00371 }

Generated on Mon May 28 04:25:19 2007 for BattletechMUX by  doxygen 1.4.7