]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blob - dllist.c
Se agrega la primera versión que compila de la lista doblemente enlazada.
[z.facultad/75.42/calculadora.git] / dllist.c
1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=1 fo+=t tw=80:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 2:
6  * Programa calculadora.
7  *
8  * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9  * Puede copiar, modificar y distribuir este programa bajo los términos de
10  * la licencia GPL (http://www.gnu.org/).
11  *
12  * Creado: sáb ago 30 20:34:45 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "dllist.h"
18 #include <stdlib.h>
19
20 bool DLList_init(DLList* list) {
21     list = (DLList*)malloc(sizeof(DLList));
22     if (list) {
23         list->first      = NULL;
24         list->current    = NULL;
25         list->last       = NULL;
26     }
27     return list ? TRUE : FALSE;
28 }
29
30 bool DLList_empty(DLList* list) {
31     return list->first == NULL;
32 }
33
34 void* DLList_reset(DLList* list) {
35     list->current = list->first;
36     return list->current ? list->current->data : NULL;
37 }
38
39 void* DLList_current(DLList* list) {
40     return list->current ? list->current->data : NULL;
41 }
42
43 void* DLList_next(DLList* list) {
44     DLNode* ret;
45     ret = list->current;
46     if (ret) {
47         list->current = ret->next;
48         return list->current ? list->current->data : NULL;
49     }
50     return NULL;
51 }
52
53 bool DLList_unshift(DLList* list, void* data) {
54     DLNode* node = (DLNode*)malloc(sizeof(DLNode));
55     /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
56     if (node) {
57         /* Inicializamos el nuevo nodo. */
58         node->prev = NULL;
59         node->data = data;
60         node->next = list->first;
61         /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
62         if (DLList_empty(list)) {
63             list->first   = node;
64             list->current = node;
65             list->last    = node;
66         /* Si no está vacía. */
67         } else {
68             /* Apunto el nodo anterior al primer nodo de la lista al nuevo. */
69             list->first->prev = node;
70             /* Apunto el primer nodo de la lista al nuevo. */
71             list->first = node;
72         }
73     }
74     return node ? TRUE : FALSE;
75 }
76
77 bool DLList_push(DLList* list, void* data) {
78     DLNode* node = (DLNode*)malloc(sizeof(DLNode));
79     /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
80     if (node) {
81         /* Inicializamos el nuevo nodo. */
82         node->prev = list->last;
83         node->data = data;
84         node->next = NULL;
85         /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
86         if (DLList_empty(list)) {
87             list->first   = node;
88             list->current = node;
89             list->last    = node;
90         /* Si no está vacía. */
91         } else {
92             /* Apunto el próximo nodo del último nodo de la lista al nuevo. */
93             list->last->next = node;
94             /* Apunto el último nodo de la lista al nuevo. */
95             list->last = node;
96         }
97     }
98     return node ? TRUE : FALSE;
99 }
100
101 void* DLList_shift(DLList* list) {
102     /* Primer nodo */
103     DLNode* node = list->first;
104     /* Datos del primer nodo. */
105     void* data = node->data;
106     /* Pongo como primer nodo al siguiente. */
107     list->first = node->next;
108     /* Si era el único actualizo los otros punteros. */
109     if (!list->first) {
110         list->last    = NULL;
111         list->current = NULL;
112     }
113     /* Libero memoria del nodo. */
114     free(node);
115     return data;
116 }
117
118 void* DLList_pop(DLList* list) {
119     /* Último nodo */
120     DLNode* node = list->last;
121     /* Datos del último nodo. */
122     void* data = node->data;
123     /* Pongo como último nodo al anterior. */
124     list->last = node->prev;
125     /* Si era el único actualizo los otros punteros. */
126     if (!list->last) {
127         list->first   = NULL;
128         list->current = NULL;
129     }
130     /* Libero memoria del nodo. */
131     free(node);
132     return data;
133 }
134