1:  #include <string.h>
2:  #include "linked_list.h"
3:  
4:  void InitList(list_info* list_pointers)
5:  {
6:    (*list_pointers).head = NULL;
7:    (*list_pointers).cur  = NULL;
8:    (*list_pointers).tail = NULL;
9:  }
10:  
11:  void FreeList(list_info* list_pointers)
12:  {
13:    ToFirst(list_pointers);
14:    while (!ListIsEmpty(list_pointers))
15:      Delete(list_pointers);
16:  }
17:  
18:  bool ListIsEmpty(list_info* list_pointers)
19:  {
20:    return ((*list_pointers).head == NULL ? TRUE : FALSE);
21:  }
22:  
23:  int Length(list_info* list_pointers)
24:  {
25:    list_info temp;
26:    int count = 0;
27:    
28:    memcpy(&temp, list_pointers, sizeof(list_info));
29:    while(RetrieveNextNode(&temp).cur)
30:    {
31:       count++;
32:       Advance(&temp);
33:    }
34:  
35:    return count;
36:  }
37:  
38:  bool ListIsFull()
39:  {
40:    return FALSE;
41:    /*
42:    struct linked_list* temp =
43:      (struct linked_list*)malloc(sizeof(struct linked_list));
44:    
45:      if(temp)*/ /*if there is memory, return false*/
46:    /*{
47:      free(temp);
48:      return FALSE;
49:    }
50:    return TRUE;*/
51:  }
52:  
53:  bool CurIsEmpty(list_info* list_pointers)
54:  {
55:    return ((*list_pointers).cur == NULL ? TRUE : FALSE);
56:  }
57:  
58:  struct linked_list* ToFirst(list_info* list_pointers)
59:  {
60:    (*list_pointers).cur = (*list_pointers).head;
61:  
62:    return (*list_pointers).head;
63:  }
64:  
65:  struct linked_list* ToEnd(list_info* list_pointers)
66:  {
67:    (*list_pointers).cur = (*list_pointers).tail;
68:  
69:    return (*list_pointers).tail;
70:  }
71:  
72:  bool AtFirst(list_info* list_pointers)
73:  {
74:    return ((*list_pointers).head == (*list_pointers).cur ? TRUE : FALSE);
75:  }
76:  
77:  bool AtEnd(list_info* list_pointers)
78:  {
79:    return ((*list_pointers).tail == (*list_pointers).cur ? TRUE : FALSE);
80:  }
81:  
82:  void Advance(list_info* list_pointers)
83:  {
84:    if (CurIsEmpty(list_pointers))
85:      NodeReferenceError();
86:    else
87:      (*list_pointers).cur = (*list_pointers).cur->next;
88:  }
89:  
90:  void Retreat(list_info* list_pointers)
91:  {
92:    if(CurIsEmpty(list_pointers))
93:      NodeReferenceError();
94:    else
95:      (*list_pointers).cur = (*list_pointers).cur->prev;
96:  }
97:  
98:  void InsertAfter(el_t e, list_info* list_pointers)
99:  {
100:    node_pointer target = MakeNode(e);
101:  
102:    if (ListIsEmpty(list_pointers))
103:    {
104:       (*list_pointers).head = target;
105:       (*list_pointers).cur  = target;
106:       (*list_pointers).tail = target;
107:    }
108:    else if (CurIsEmpty(list_pointers))
109:       NodeReferenceError();
110:    else if (AtEnd(list_pointers))
111:    {
112:      target->prev = (*list_pointers).cur;
113:      (*list_pointers).cur->next = target;
114:      (*list_pointers).tail = target;  //set new tail
115:    }
116:    else
117:    {
118:      target->next = (*list_pointers).cur->next;
119:      target->prev = (*list_pointers).cur;
120:      (*list_pointers).cur->next->prev = target;
121:      (*list_pointers).cur->next = target;
122:    }
123:  }
124:  
125:  void Insert(el_t e, list_info* list_pointers)
126:  {
127:    node_pointer target = MakeNode(e);
128:  
129:    if (ListIsEmpty(list_pointers))		// create one-element list
130:    {
131:      (*list_pointers).head = target;
132:      (*list_pointers).cur  = target;
133:      (*list_pointers).tail = target;
134:    }
135:    else if (CurIsEmpty(list_pointers))	// empty cur, nonempty list
136:       NodeReferenceError();
137:    else if(AtFirst(list_pointers))		// new head node
138:    {
139:      target->next               = (*list_pointers).cur;
140:      (*list_pointers).cur->prev = target;
141:      (*list_pointers).head      = target;
142:    }
143:    else				// insert between two nodes
144:    {
145:      target->next    = (*list_pointers).cur;
146:      target->prev    = (*list_pointers).cur->prev;
147:      (*list_pointers).cur->prev->next = target;
148:      (*list_pointers).cur->prev       = target;
149:    }
150:  }
151:  
152:  void Delete(list_info* list_pointers)
153:  {
154:    node_pointer tmp;
155:  
156:    if (CurIsEmpty(list_pointers))        /* empty list*/
157:       NodeReferenceError();
158:    else if (AtFirst(list_pointers) && AtEnd(list_pointers)) /*one node exists*/
159:    {
160:        DestroyNode((*list_pointers).cur);
161:        /*set the pointers to null*/
162:        memset(list_pointers, 0, sizeof(list_info));
163:    }
164:    else if (AtFirst(list_pointers))	/* delete head node*/
165:    {
166:      tmp = (*list_pointers).cur;
167:      (*list_pointers).cur = (*list_pointers).cur->next;
168:      (*list_pointers).cur->prev = NULL;
169:      (*list_pointers).head = (*list_pointers).cur;
170:      DestroyNode(tmp);
171:    }
172:    else if (AtEnd(list_pointers))                    // delete end node
173:    {
174:      tmp = (*list_pointers).cur;
175:      (*list_pointers).cur = (*list_pointers).cur->prev;
176:      (*list_pointers).cur->next = NULL;
177:      (*list_pointers).tail = (*list_pointers).cur;
178:      DestroyNode(tmp);
179:    }
180:    else					// delete middle node
181:    {
182:      tmp = (*list_pointers).cur;
183:      (*list_pointers).cur->prev->next = (*list_pointers).cur->next;
184:      (*list_pointers).cur->next->prev = (*list_pointers).cur->prev;
185:      (*list_pointers).cur = (*list_pointers).cur->next;
186:      DestroyNode(tmp);
187:    }
188:  }
189:  
190:  void StoreInfo(el_t e, list_info* list_pointers)
191:  {
192:     if(CurIsEmpty(list_pointers))
193:        NodeReferenceError();
194:     else
195:       /*There had better be enough room...*/
196:        memcpy(&(((*list_pointers).cur)->data), &e, sizeof(void*)); 
197:  }
198:  
199:  el_t RetrieveInfo(list_info* list_pointers)
200:  {
201:    if(CurIsEmpty(list_pointers))
202:       NodeReferenceError();
203:  
204:    return (((*list_pointers).cur)->data);
205:  }
206:  
207:  el_t RetrievePrevInfo(list_info* list_pointers)
208:  {
209:    if (CurIsEmpty(list_pointers))
210:       NodeReferenceError();
211:    if(AtFirst(list_pointers))   
212:       NodeReferenceError();
213:  
214:    return (((*list_pointers).cur)->prev->data);
215:  }
216:  
217:  list_info RetrievePrevNode(list_info* list_pointers)
218:  {
219:    list_info temp;
220:    memcpy(&temp, list_pointers, sizeof(list_info));
221:  
222:    if (CurIsEmpty(list_pointers))
223:       NodeReferenceError();
224:  
225:    temp.cur = ((*list_pointers).cur)->prev;
226:  
227:    return temp;
228:  }
229:  
230:  
231:  el_t RetrieveNextInfo(list_info* list_pointers)
232:  {
233:    if (CurIsEmpty(list_pointers))
234:       NodeReferenceError();
235:    if(AtEnd(list_pointers))
236:      NodeReferenceError();
237:  
238:    return (((*list_pointers).cur)->next->data);
239:  }
240:  
241:  list_info RetrieveNextNode(list_info* list_pointers)
242:  {
243:    list_info temp;
244:    memcpy(&temp, list_pointers, sizeof(list_info));
245:  
246:    if (CurIsEmpty(list_pointers))
247:       NodeReferenceError();
248:  
249:    temp.cur = ((*list_pointers).cur)->next;
250:  
251:    return temp;
252:  }
253:  
254:  node_pointer MakeNode(el_t e)
255:  {
256:    node_pointer p;
257:  
258:    if(ListIsFull())
259:    {
260:      printf("List is Full.  Exiting.\n");
261:      exit(1);
262:    }
263:  
264:  
265:   
266:  #ifdef __cplusplus
267:    p = new struct linked_list;
268:  #else
269:    p = (struct linked_list*) malloc(sizeof(struct linked_list));
270:  #endif
271:  
272:    if (!p)
273:    {
274:      printf("Error making node\n");
275:      exit(1);
276:    }
277:    else
278:    {
279:      memcpy(&(p->data), &e, sizeof(el_t));
280:      p->next = NULL;
281:      p->prev = NULL;
282:    }
283:  
284:    return p;
285:  }
286:  
287:  void DestroyNode(node_pointer p)
288:  {
289:  #ifdef __cplusplus
290:    delete p;
291:  #else
292:    free(p);
293:  #endif
294:  }
295:  
296:  void NodeReferenceError()
297:  {
298:    int *temp = NULL;
299:    printf("ERROR: No current node or an improper node\n");
300:  printf("%d\n", *temp);
301:    exit(1);
302:  }
303:  
304:  
305: