1 static char rcsid[] = "$Id: doublelist.c 193875 2016-07-12 02:43:38Z twu $";
2 #ifdef HAVE_CONFIG_H
3 #include <config.h>
4 #endif
5 
6 #include "doublelist.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include "mem.h"
10 
11 #define T Doublelist_T
12 struct T {
13   double first;
14   T rest;
15 };
16 
17 
18 T
Doublelist_push(T list,double elt)19 Doublelist_push (T list, double elt) {
20   T new = (T) MALLOC(sizeof(*new));
21 
22   new->first = elt;
23   new->rest = list;
24   return new;
25 }
26 
27 T
Doublelist_pop(T list,double * elt)28 Doublelist_pop (T list, double *elt) {
29   T head;
30 
31   if (list) {
32     head = list->rest;
33     *elt = list->first;
34     FREE(list);
35     return head;
36   } else {
37     return list;
38   }
39 }
40 
41 double
Doublelist_head(T list)42 Doublelist_head (T list) {
43   return list->first;
44 }
45 
46 T
Doublelist_next(T list)47 Doublelist_next (T list) {
48   if (list) {
49     return list->rest;
50   } else {
51     return NULL;
52   }
53 }
54 
55 void
Doublelist_free(T * list)56 Doublelist_free (T *list) {
57   T prev;
58 
59   while ((prev = *list) != NULL) {
60     *list = prev->rest;
61     FREE(prev);
62   }
63 
64   return;
65 }
66 
67 T
Doublelist_keep_one(T list,int i)68 Doublelist_keep_one (T list, int i) {
69   T head;
70 
71   while (--i >= 0) {
72     /* Pop */
73     head = list->rest;
74     FREE(list);
75     list = head;
76   }
77 
78   Doublelist_free(&list->rest);
79   return list;
80 }
81 
82 
83 T
Doublelist_reverse(T list)84 Doublelist_reverse (T list) {
85   T head = NULL, next;
86 
87   for ( ; list; list = next) {
88     next = list->rest;
89     list->rest = head;
90     head = list;
91   }
92   return head;
93 }
94 
95 int
Doublelist_length(T list)96 Doublelist_length (T list) {
97   int n;
98 
99   for (n = 0; list; list = list->rest) {
100     n++;
101   }
102   return n;
103 }
104 
105 double *
Doublelist_to_array(int * n,T list)106 Doublelist_to_array (int *n, T list) {
107   double *array;
108   int i;
109 
110   *n = Doublelist_length(list);
111   if (*n == 0) {
112     return NULL;
113   } else {
114     array = (double *) CALLOC(*n,sizeof(double));
115     for (i = 0; i < *n; i++) {
116       array[i] = list->first;
117       list = list->rest;
118     }
119     return array;
120   }
121 }
122 
123 double *
Doublelist_to_array_out(int * n,T list)124 Doublelist_to_array_out (int *n, T list) {
125   double *array;
126   int i;
127 
128   *n = Doublelist_length(list);
129   if (*n == 0) {
130     return NULL;
131   } else {
132     array = (double *) CALLOC_OUT(*n,sizeof(double));
133     for (i = 0; i < *n; i++) {
134       array[i] = list->first;
135       list = list->rest;
136     }
137     return array;
138   }
139 }
140 
141 void
Doublelist_fill_array(double * array,T list)142 Doublelist_fill_array (double *array, T list) {
143   int i = 0;
144 
145   while (list) {
146     array[i++] = list->first;
147     list = list->rest;
148   }
149   return;
150 }
151 
152 T
Doublelist_from_string(char * string)153 Doublelist_from_string (char *string) {
154   T doublelist = NULL;
155   char *p = string;
156   double x;
157 
158   while (sscanf(p,"%lf",&x) > 0) {
159     doublelist = Doublelist_push(doublelist,x);
160     while (*p != '\0' && *p != ',') {
161       p++;
162     }
163     if (*p == ',') {
164       p++;
165     }
166   }
167   return doublelist;
168 }
169 
170 T
Doublelist_from_array(double * array,int n)171 Doublelist_from_array (double *array, int n) {
172   T list = NULL, p;
173 
174   while (--n >= 0) {
175     p = (T) MALLOC(sizeof(*p));
176     p->first = array[n];
177     p->rest = list;
178     list = p;
179   }
180 
181   return list;
182 }
183 
184 double
Doublelist_max(T this)185 Doublelist_max (T this) {
186   T p;
187   double maxvalue = 0.0;
188 
189   if (this != NULL) {
190     maxvalue = this->first;
191   }
192   for (p = this; p; p = p->rest) {
193     if (p->first > maxvalue) {
194       maxvalue = p->first;
195     }
196   }
197   return maxvalue;
198 }
199 
200 double
Doublelist_min(T this)201 Doublelist_min (T this) {
202   T p;
203   double minvalue = 0.0;
204 
205   if (this != NULL) {
206     minvalue = this->first;
207   }
208   for (p = this; p; p = p->rest) {
209     if (p->first < minvalue) {
210       minvalue = p->first;
211     }
212   }
213   return minvalue;
214 }
215 
216 
217 void
Doublelist_print(T this)218 Doublelist_print (T this) {
219   T p;
220 
221   for (p = this; p; p = p->rest) {
222     printf("%f\n",this->first);
223   }
224   return;
225 }
226 
227