ucx/dlist.c

Fri, 25 May 2012 17:39:27 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 25 May 2012 17:39:27 +0200
changeset 31
91ac86557290
parent 27
22644e2572bc
child 35
fdabd1240b69
permissions
-rw-r--r--

added map iterator

     1 #include "dlist.h"
     3 UcxDlist *ucx_dlist_clone(UcxDlist *l, copy_func fnc, void *data) {
     4     UcxDlist *ret = NULL;
     5     while (l != NULL) {
     6         if (fnc != NULL) {
     7             ret = ucx_dlist_append(ret, fnc(l->data, data));
     8         } else {
     9             ret = ucx_dlist_append(ret, l->data);
    10         }
    11         l = l->next;
    12     }
    13     return ret;
    14 }
    16 int ucx_dlist_equals(UcxDlist *l1, UcxDlist *l2, cmp_func fnc, void* data) {
    17     if (l1 == l2) return 1;
    19     while (l1 != NULL && l2 != NULL) {
    20         if (fnc == NULL) {
    21             if (l1->data != l2->data) return 0;
    22         } else {
    23             if (fnc(l1->data, l2->data, data) != 0) return 0;
    24         }
    25         l1 = l1->next;
    26         l2 = l2->next;
    27     }
    29     return (l1 == NULL && l2 == NULL);
    30 }
    32 void ucx_dlist_free(UcxDlist *l) {
    33     UcxDlist *e = l, *f;
    34     while (e != NULL) {
    35         f = e;
    36         e = e->next;
    37         free(f);
    38     }
    39 }
    41 UcxDlist *ucx_dlist_append(UcxDlist *l, void *data)  {
    42     UcxDlist *nl = (UcxDlist*) malloc(sizeof(UcxDlist));
    43     if (nl == NULL) return NULL;
    45     nl->data = data;
    46     nl->next = NULL;
    47     if (l == NULL) {
    48         nl->prev = NULL;
    49         return nl;
    50     } else {
    51         UcxDlist *t = ucx_dlist_last(l);
    52         t->next = nl;
    53         nl->prev = t;
    54         return l;
    55     }
    56 }
    58 UcxDlist *ucx_dlist_prepend(UcxDlist *l, void *data) {
    59     UcxDlist *nl = ucx_dlist_append(NULL, data);
    60     if (nl == NULL) return NULL;
    62     if (l != NULL) {
    63         nl->next = l;
    64         l->prev = nl;
    65     }
    66     return nl;
    67 }
    69 UcxDlist *ucx_dlist_concat(UcxDlist *l1, UcxDlist *l2) {
    70     if (l1 == NULL) {
    71         return l2;
    72     } else {
    73         UcxDlist *last = ucx_dlist_last(l1);
    74         last->next = l2;
    75         l2->prev = last;
    76         return l1;
    77     }
    78 }
    80 UcxDlist *ucx_dlist_last(UcxDlist *l) {
    81     if (l == NULL) return NULL;
    83     UcxDlist *e = l;
    84     while (e->next != NULL) {
    85         e = e->next;
    86     }
    87     return e;
    88 }
    90 UcxDlist *ucx_dlist_get(UcxDlist *l, int index) {
    91     if (l == NULL) return NULL;
    93     UcxDlist *e = l;
    94     while (e->next != NULL && index > 0) {
    95         e = e->next;
    96         index--;
    97     }
    99     return index == 0 ? e : NULL;
   100 }
   102 size_t ucx_dlist_size(UcxDlist *l) {
   103     if (l == NULL) return 0;
   105     UcxDlist *e = l;
   106     size_t s = 1;
   107     while (e->next != NULL) {
   108         e = e->next;
   109         s++;
   110     }
   112     return s;
   113 }
   115 /* dlist specific functions */
   116 UcxDlist *ucx_dlist_first(UcxDlist *l) {
   117     if (l == NULL) return NULL;
   119     UcxDlist *e = l;
   120     while (e->prev != NULL) {
   121         e = e->prev;
   122     }
   123     return e;
   124 }
   126 UcxDlist *ucx_dlist_remove(UcxDlist *l, UcxDlist *e) {
   127     if (e->prev == NULL) {
   128         if(e->next != NULL) {
   129             e->next->prev = NULL;
   130             l = e->next;
   131         } else {
   132             l = NULL;
   133         }
   135     } else {
   136         e->prev->next = e->next;
   137         e->next->prev = e->prev;
   138     }
   139     free(e);
   140     return l;
   141 }

mercurial