00001
00002
00003
00004
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include <string.h>
00008
00009 #include "dllist.h"
00010
00011
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
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
00050 int dllist_destroy_list(dllist * dllist)
00051 {
00052
00053 if (!dllist)
00054 return 1;
00055
00056
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
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
00088 void dllist_insert_after(dllist * dllist, dllist_node * node,
00089 dllist_node * newnode)
00090 {
00091
00092
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
00109 dllist->size++;
00110
00111 return;
00112 }
00113
00114
00115 void dllist_insert_before(dllist * dllist, dllist_node * node,
00116 dllist_node * newnode)
00117 {
00118
00119
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
00136 dllist->size++;
00137
00138 return;
00139 }
00140
00141
00142 void dllist_insert_beginning(dllist * dllist, dllist_node * newnode)
00143 {
00144
00145
00146 if (!newnode) {
00147 return;
00148 }
00149
00152
00153 if (dllist->head == NULL) {
00154 dllist->head = newnode;
00155 dllist->tail = newnode;
00156 newnode->prev = NULL;
00157 newnode->next = NULL;
00158
00159
00160 dllist->size++;
00161
00162 } else {
00163 dllist_insert_before(dllist, dllist->head, newnode);
00164 }
00165
00166 return;
00167 }
00168
00169
00170 void dllist_insert_end(dllist * dllist, dllist_node * newnode)
00171 {
00172
00173
00174 if (!newnode) {
00175 return;
00176 }
00177
00180
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
00192 void *dllist_remove(dllist * dllist, dllist_node * node)
00193 {
00194
00195 void *data;
00196
00197
00198 if (!node) {
00199 return NULL;
00200 }
00201
00202
00203 if (!dllist) {
00204
00205
00206 data = dllist_destroy_node(node);
00207 return data;
00208 }
00209
00213
00214 if (dllist->head == NULL && dllist->tail == NULL) {
00215
00216
00217 data = dllist_destroy_node(node);
00218 return data;
00219 }
00220
00221
00222 if (node->prev == NULL) {
00223 dllist->head = node->next;
00224 } else {
00225 (node->prev)->next = node->next;
00226 }
00227
00228
00229 if (node->next == NULL) {
00230 dllist->tail = node->prev;
00231 } else {
00232 (node->next)->prev = node->prev;
00233 }
00234
00235
00236 data = dllist_destroy_node(node);
00237
00238
00239 dllist->size--;
00240
00241 return data;
00242
00243 }
00244
00245
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
00262 temp = dllist_head(dllist);
00263
00264 while (counter != pos) {
00265
00266 temp = dllist_next(temp);
00267 counter++;
00268
00269 }
00270
00271
00272 data = dllist_remove(dllist, temp);
00273
00274 return data;
00275
00276 }
00277
00278
00279
00280
00281 dllist_node *dllist_head(dllist * dllist)
00282 {
00283
00284 if (!dllist)
00285 return NULL;
00286
00287 return dllist->head;
00288 }
00289
00290
00291 dllist_node *dllist_tail(dllist * dllist)
00292 {
00293
00294 if (!dllist)
00295 return NULL;
00296
00297 return dllist->tail;
00298 }
00299
00300
00301 dllist_node *dllist_next(dllist_node * node)
00302 {
00303
00304 if (!node)
00305 return NULL;
00306
00307 return node->next;
00308 }
00309
00310
00311 dllist_node *dllist_prev(dllist_node * node)
00312 {
00313 if (!node)
00314 return NULL;
00315
00316 return node->prev;
00317 }
00318
00319
00320 void *dllist_data(dllist_node * node)
00321 {
00322
00323 if (!node)
00324 return NULL;
00325
00326 return node->data;
00327 }
00328
00329
00330 int dllist_size(dllist * dllist)
00331 {
00332
00333 if (!dllist) {
00334 return 0;
00335 }
00336
00337 return dllist->size;
00338 }
00339
00340
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
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 }