7 IMPLEMENTACION : TDA_TABLA
\r
17 uses TDA_GRAL, ldoblec, pila_C;
\r
21 T_MOVIM = LSC_movimiento;
\r
23 T_CLAVE = Tipo_Clave;
\r
25 T_REGISTRO = Tipo_Elem;
\r
29 lista : LSC_Lista_Simple_C; {si bien el nombre dice simple, es una lista doble
\r
30 no lo cambie aun para evitar mas errores}
\r
37 Procedure T_TABLA_Crear ( var T: T_TABLA);
\r
39 Function T_TABLA_Vacia ( T: T_TABLA ) : boolean;
\r
41 Function T_TABLA_Llena ( T: T_TABLA ) : boolean;
\r
43 Function T_TABLA_Ordenada ( T: T_TABLA ) : boolean;
\r
45 Procedure T_TABLA_Elem_Cte ( T: T_TABLA ; var R: T_REGISTRO );
\r
47 Procedure T_TABLA_Mover_Cte ( var T: T_TABLA ; M: T_MOVIM; var error: boolean );
\r
49 Procedure T_TABLA_Insertar ( var T: T_TABLA ; var R: T_REGISTRO; M: T_MOVIM );
\r
51 Procedure T_TABLA_Insertar_O ( var T: T_TABLA ; var R: T_REGISTRO);
\r
53 Procedure T_TABLA_Limpiar ( var T: T_TABLA );
\r
55 Procedure T_TABLA_Borrar_Cte ( var T: T_TABLA );
\r
57 Procedure T_TABLA_Modif_Cte ( var T: T_TABLA ; var R: T_REGISTRO );
\r
59 Procedure T_TABLA_Ordenar ( var T: T_TABLA );
\r
61 Procedure T_TABLA_Buscar_Clave ( var T: T_TABLA ; C: T_CLAVE; var error :boolean);
\r
63 PROCEDURE Buscar_por_Rango(var T: T_TABLA; D, H: T_CLAVE; var L: PILAC_Pila);
\r
65 {-------------------------------------}
\r
69 Procedure T_TABLA_Crear ( var T: T_TABLA);
\r
71 PRE :T nunca fue creada.
\r
72 POST: T creada y vac¡a.
\r
77 LSC_Inicializar ( t.lista );
\r
79 {una lista vacia esta ordenada}
\r
83 Function T_TABLA_Vacia ( T: T_TABLA ) : boolean;
\r
86 POST: Si T tiene elementos, entonces es FALSE, sino es TRUE.
\r
90 T_TABLA_Vacia := LSC_vacio( t.lista );
\r
95 Function T_TABLA_Llena ( T: T_TABLA ) : boolean;
\r
98 POST: Si T tiene lugar para insertar nuevos elementos, entonces es FALSE, sino es TRUE.
\r
102 T_TABLA_Llena := LSC_lleno( t.lista );
\r
106 Function T_TABLA_Ordenada ( T: T_TABLA ) : boolean;
\r
109 POST: Si T est ordenada, entonces es verdadero, sino es falso.
\r
114 T_TABLA_Ordenada:= t.ordenada;
\r
118 Procedure T_TABLA_Elem_Cte ( T: T_TABLA ; var R: T_REGISTRO );
\r
121 POST: R contiene el registro corriente.
\r
126 LSC_elem_cte ( t.lista, r);
\r
130 Procedure T_TABLA_Mover_Cte ( var T: T_TABLA ; M: T_MOVIM; var error: boolean );
\r
133 POST: Si M = primero, el nuevo corriente es el primer registro y error es falso.
\r
134 Si M = ultimo, el nuevo corriente es el £ltimo registro y error es falso.
\r
135 Si M = siguiente, el nuevo corriente es el siguiente registro del actual
\r
136 corriente y error es falso. Si el corriente era el £ltimo registro, entonces
\r
137 error es verdadero y el corriente sigue siendo el £ltimo registro.
\r
138 Si M = anterior, el nuevo corriente es el anterior registro del actual
\r
139 corriente y error es falso. Si el corriente era el primer registro, entonces
\r
140 error es verdadero y el corriente sigue siendo el primer registro.
\r
142 (Los valores para M son de tipo t_movim)
\r
147 LSC_mover_cte ( t.lista, m, error );
\r
151 Procedure T_TABLA_Insertar ( var T: T_TABLA ; var R: T_REGISTRO; M: T_MOVIM );
\r
153 PRE : T no est llena.
\r
154 POST: Si M = primero, R se agreg¢, es el primer registro y el nuevo corriente.
\r
155 Si M = ultimo, R se agreg¢, es el £ltimo registro y el nuevo corriente.
\r
156 Si M = siguiente, R se agreg¢, es el siguiente registro del corriente, y es el nuevo corriente
\r
157 Si M = anterior, R se agreg¢, es el anterior registro del corriente, y es el nuevo corriente.
\r
159 Para no complicar mas la implementacion de la lista doble,
\r
160 el insertar al final esta implementado aca
\r
163 VAR error: boolean;
\r
167 IF m = LSC_ULTIMO then begin
\r
169 LSC_mover_cte ( t.lista, m, error );
\r
171 {insertar al final no es mas que insertar despues de el ultimo:}
\r
176 LSC_insertar ( t.lista, m, r);
\r
182 Procedure T_TABLA_Insertar_O ( var T: T_TABLA ; var R: T_REGISTRO);
\r
184 VAR error: boolean;
\r
189 IF t.ordenada = true then begin
\r
191 T_TABLA_Buscar_Clave(t, r.dni, error); {no importa si lo encuentra o no}
\r
193 T_TABLA_Elem_Cte( t, e);
\r
195 IF e.dni > r.dni then
\r
196 T_TABLA_INSERTAR(t, r, lsc_anterior)
\r
198 T_TABLA_INSERTAR(t, r, lsc_siguiente);
\r
201 t.ordenada:= true {insertar lo deja en false}
\r
206 Procedure T_TABLA_Limpiar ( var T: T_TABLA );
\r
214 LSC_vaciar (t.lista);
\r
219 Procedure T_TABLA_Borrar_Cte ( var T: T_TABLA );
\r
222 POST: Se elimin¢ el registro corriente.
\r
223 El nuevo registro corriente es el siguiente del borrado, si el borrado
\r
224 era el £ltimo, entonces el nuevo corriente es el primero.
\r
229 LSC_borrar_cte ( t.lista );
\r
233 Procedure T_TABLA_Modif_Cte ( var T: T_TABLA ; var R: T_REGISTRO );
\r
236 POST: El contenido del actual corriente fue actualizado con R.
\r
237 Si T estaba ordenada y no se modificaron los datos de la clave del
\r
238 corriente, entonces T sigue ordenada. Si T estaba ordenada y se
\r
239 modificaron los datos de la clave del corriente, entonces si la
\r
240 nueva clave rompe el orden de T, T no est m s ordenada.
\r
246 T_TABLA_Elem_Cte (t, e);
\r
248 if Devolver_Clave_Elem( e ) <> Devolver_Clave_Elem( r ) then
\r
249 t.ordenada:= false;
\r
251 LSC_modif_cte (t.lista, r);
\r
255 Procedure T_TABLA_Ordenar ( var T: T_TABLA );
\r
258 POST: T se encuentra ordenada por la clave de sus registros.
\r
260 VAR t_aux: T_TABLA;
\r
270 T_TABLA_Crear( t_aux);
\r
272 LSC_COPIAR(t.lista, t_aux.lista);
\r
274 T_TABLA_Limpiar(t);
\r
276 (* {tengo que mover en corriente al primero porque esta en nulo (0)}
\r
277 T_TABLA_Mover_Cte ( t, lsc_primero, error );
\r
281 T_TABLA_Elem_cte(t_aux, e);
\r
283 T_TABLA_Insertar (t, e, lsc_primero);
\r
285 T_TABLA_Mover_Cte ( t_aux, lsc_siguiente, error );
\r
287 t.ordenada:= true; {si tiene un solo elemento no veo porque no}
\r
289 while error <> true do begin
\r
291 T_TABLA_Elem_cte(t_aux, e);
\r
293 T_TABLA_Insertar_O (t, e);
\r
295 T_TABLA_Mover_Cte ( t_aux, lsc_siguiente, error );
\r
303 Procedure T_TABLA_Buscar_Clave ( var T: T_TABLA ; C: T_CLAVE; var error :boolean);
\r
306 POST: Si C es una clave que existe en T, entonces el nuevo corriente es el
\r
307 registro con clave C y error es falso, sino error es verdadero y
\r
308 el corriente es el registro donde termino la busqueda (modificacion
\r
309 hecha para facilitar la operacion insertar ordenado).
\r
317 { IF not T_TABLA_Vacia(t) then begin
\r
319 T_TABLA_Mover_Cte ( t, lsc_primero, error );
\r
321 T_TABLA_Elem_cte(t, e);
\r
323 While (e.DNI < c ) AND not error do begin
\r
325 T_TABLA_Mover_Cte ( t, lsc_siguiente, error );
\r
327 T_TABLA_Elem_cte(t, e);
\r
331 IF e.dni <> c then error := true;
\r
338 PROCEDURE Buscar_por_Rango(var T: T_TABLA; D, H: T_CLAVE; var L: PILAC_Pila);
\r
340 BUSCA LOS REGISTROS COMPRENDIDOS ENTRE LAS CLAVES D y H
\r
341 Y LOS ALMACENA EN LA PILA L.
\r
350 T_TABLA_Buscar_Clave(t,d,error);
\r
352 { if error = false then begin}
\r
354 T_TABLA_Elem_cte(t, e);
\r
356 PILAC_poner ( l,e );
\r
358 T_TABLA_Mover_Cte ( t, lsc_siguiente, error );
\r
360 T_TABLA_Elem_cte(t, e);
\r
363 While (e.DNI <= h ) AND (error = false) do begin
\r
365 PILAC_poner ( l,e );
\r
367 T_TABLA_Mover_Cte ( t, lsc_siguiente, error );
\r
369 T_TABLA_Elem_cte(t, e);
\r