]> git.llucax.com Git - z.facultad/75.41/material.git/commitdiff
Import inicial después del "/var incident". :(
authorLeandro Lucarella <llucax@gmail.com>
Sun, 23 Mar 2003 07:10:16 +0000 (07:10 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 23 Mar 2003 07:10:16 +0000 (07:10 +0000)
24 files changed:
arboles/apl_ab.pas [new file with mode: 0644]
arboles/apl_abo.pas [new file with mode: 0644]
arboles/arbol_bin.pas [new file with mode: 0644]
arboles/arbol_bin_ord.pas [new file with mode: 0644]
listas_pilas_colas/T_COLAC.pas [new file with mode: 0644]
listas_pilas_colas/T_LSC.pas [new file with mode: 0644]
listas_pilas_colas/T_LSP.pas [new file with mode: 0644]
listas_pilas_colas/T_PILAC.pas [new file with mode: 0644]
listas_pilas_colas/cola_c.pas [new file with mode: 0644]
listas_pilas_colas/eje_lista.pas [new file with mode: 0644]
listas_pilas_colas/lista_simple_c.pas [new file with mode: 0644]
listas_pilas_colas/lista_simple_p.pas [new file with mode: 0644]
listas_pilas_colas/pila_c.pas [new file with mode: 0644]
listas_pilas_colas/tda_almac.pas [new file with mode: 0644]
listas_pilas_colas/tda_gral.pas [new file with mode: 0644]
tp_ejemplo/comandos.pas [new file with mode: 0644]
tp_ejemplo/ldoblec.pas [new file with mode: 0644]
tp_ejemplo/leeme.txt [new file with mode: 0644]
tp_ejemplo/outfile.txt [new file with mode: 0644]
tp_ejemplo/pila_c.pas [new file with mode: 0644]
tp_ejemplo/prueba [new file with mode: 0644]
tp_ejemplo/tabla.pas [new file with mode: 0644]
tp_ejemplo/tda_gral.pas [new file with mode: 0644]
tp_ejemplo/tp1.pas [new file with mode: 0644]

diff --git a/arboles/apl_ab.pas b/arboles/apl_ab.pas
new file mode 100644 (file)
index 0000000..1104861
--- /dev/null
@@ -0,0 +1,169 @@
+unit apl_ab;\r
+\r
+{\r
+       IMPLEMENTACION : APLICACIONES ARBOLES BINARIOS\r
+       \r
+}\r
+interface\r
+\r
+uses tda_gral, arbol_bin;\r
+\r
+{ procesa todos los nodos de un arbol recursivamente en INORDEN}\r
+PROCEDURE APL_AB_recorrer_rec_in( a: AB_arbol);\r
+\r
+{ procesa todos los nodos de un arbol recursivamente en PREORDEN}\r
+PROCEDURE APL_AB_recorrer_rec_pre( a: AB_arbol);\r
+\r
+{ procesa todos los nodos de un arbol recursivamente en POSORDEN}\r
+PROCEDURE APL_AB_recorrer_rec_pos( a: AB_arbol);\r
+\r
+{ busca un elemento segun una clave determinada exhaustivamente (BUSQUEDA EXTERNA) RECURSIVO }\r
+PROCEDURE APL_AB_buscar_externo( VAR a: AB_arbol; e: Tipo_Elem; VAR error: boolean );\r
+\r
+implementation\r
+\r
+{ recorrer todos los nodos del arbol procesando todos los elementos }\r
+{ ORDEN de recorrido: INORDEN, o sea, izquierda, nodo, derecha }\r
+PROCEDURE APL_AB_recorrer_rec_in( a: AB_arbol);\r
+       PROCEDURE recorrer_rec( a: AB_arbol );\r
+       VAR\r
+               error: boolean;\r
+               e: Tipo_Elem;\r
+       BEGIN\r
+               { proceso el subarbol izquierdo }\r
+               AB_mover_cte( a, AB_izquierda, error );\r
+               IF not error\r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+                       AB_mover_cte( a, AB_padre, error );\r
+               END;\r
+               { proceso el nodo corriente }\r
+               AB_elem_cte( a, e);\r
+               Procesar_Elem_Recorrido( e );\r
+               { proceso el subarbol izquierdo }\r
+               AB_mover_cte( a, AB_derecha, error );\r
+               IF not error\r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+{                      AB_mover_cte( a, AB_padre, error ); no hace falta }\r
+               END;\r
+       END;\r
+VAR\r
+       error: boolean;\r
+BEGIN\r
+       { me voy a la raiz y desde allí proceso todo }\r
+       AB_mover_cte( a, AB_raiz, error );\r
+   recorrer_rec( a );\r
+END;\r
+\r
+{ recorrer todos los nodos del arbol procesando todos los elementos }\r
+{ ORDEN de recorrido: PREORDEN, o sea, nodo, izquierda, derecha }\r
+PROCEDURE APL_AB_recorrer_rec_pre( a: AB_arbol);\r
+       PROCEDURE recorrer_rec( a: AB_arbol );\r
+       VAR\r
+               error: boolean;\r
+               e: Tipo_Elem;\r
+       BEGIN\r
+               { proceso el nodo corriente }\r
+               AB_elem_cte( a, e);\r
+               Procesar_Elem_Recorrido( e );\r
+               { proceso el subarbol izquierdo }\r
+               AB_mover_cte( a, AB_izquierda, error );\r
+               IF not error\r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+                       AB_mover_cte( a, AB_padre, error );\r
+               END;\r
+               { proceso el subarbol izquierdo }\r
+               AB_mover_cte( a, AB_derecha, error );\r
+               IF not error\r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+{                      AB_mover_cte( a, AB_padre, error ); no hace falta }\r
+               END;\r
+       END;\r
+VAR\r
+       error: boolean;\r
+BEGIN\r
+       { me voy a la raiz y desde allí proceso todo }\r
+       AB_mover_cte( a, AB_raiz, error );\r
+   recorrer_rec( a );\r
+END;\r
+\r
+{ recorrer todos los nodos del arbol procesando todos los elementos }\r
+{ ORDEN de recorrido: POSORDEN, o sea, izquierda, derecha, nodo }\r
+PROCEDURE APL_AB_recorrer_rec_pos( a: AB_arbol);\r
+       PROCEDURE recorrer_rec( a: AB_arbol );\r
+       VAR\r
+               error: boolean;\r
+               e: Tipo_Elem;\r
+       BEGIN\r
+               { proceso el subarbol izquierdo }\r
+               AB_mover_cte( a, AB_izquierda, error );\r
+               IF not error\r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+                       AB_mover_cte( a, AB_padre, error );\r
+               END;\r
+               { proceso el subarbol izquierdo }\r
+               AB_mover_cte( a, AB_derecha, error );\r
+               IF not error\r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+                       AB_mover_cte( a, AB_padre, error );\r
+               END;\r
+               { proceso el nodo corriente }\r
+               AB_elem_cte( a, e);\r
+               Procesar_Elem_Recorrido( e );\r
+       END;\r
+VAR\r
+       error: boolean;\r
+BEGIN\r
+       { me voy a la raiz y desde allí proceso todo }\r
+       AB_mover_cte( a, AB_raiz, error );\r
+   recorrer_rec( a );\r
+END;\r
+\r
+{ busca un elemento segun una clave determinada exhaustivamente (BUSQUEDA EXTERNA) }\r
+PROCEDURE APL_AB_buscar_externo( VAR a: AB_arbol; e: Tipo_Elem; VAR error: boolean );\r
+       FUNCTION buscar_rec( VAR a: AB_arbol; e: Tipo_Elem): boolean;\r
+       VAR\r
+               d: Tipo_Elem;\r
+               resultado: boolean;\r
+       BEGIN\r
+               { proceso el nodo corriente }\r
+               AB_elem_cte( a, e);\r
+               resultado := Comparar_Elementos( e, d );\r
+               IF NOT resultado\r
+               THEN BEGIN\r
+                       { no era el buscado }\r
+         { proceso el subarbol izquierdo }\r
+                       AB_mover_cte( a, AB_izquierda, error );\r
+                       IF not error\r
+                       THEN BEGIN\r
+                               resultado := buscar_rec( a, e );\r
+                               IF NOT resultado\r
+                               THEN BEGIN\r
+                                       { proceso el subarbol izquierdo }\r
+                                       AB_mover_cte( a, AB_padre, error );\r
+                                       AB_mover_cte( a, AB_derecha, error );\r
+                                       IF not error\r
+                                       THEN BEGIN\r
+                                               resultado := buscar_rec( a, e );\r
+                                               IF NOT resultado\r
+                                               THEN\r
+                                                       AB_mover_cte( a, AB_padre, error );\r
+                                       END;\r
+            END;\r
+                       END;\r
+               END;\r
+               buscar_rec := resultado;                \r
+       END;\r
+BEGIN\r
+       { me voy a la raiz y desde allí proceso todo }\r
+       AB_mover_cte( a, AB_raiz, error );\r
+   error := buscar_rec( a, e );\r
+END;\r
+\r
+end.\r
+\r
diff --git a/arboles/apl_abo.pas b/arboles/apl_abo.pas
new file mode 100644 (file)
index 0000000..1383f62
--- /dev/null
@@ -0,0 +1,49 @@
+unit apl_abo;\r
+\r
+{ \r
+       IMPLEMENTACION : APLICACIONES ARBOLES BINARIOS ORDENADOS \r
+       \r
+}\r
+interface\r
+\r
+uses tda_gral, arbol_bin_ord;\r
+\r
+{ procesa todos los nodos de un arbol recursivamente }\r
+PROCEDURE APL_ABO_recorrer_rec( a: ABO_arbol);\r
+\r
+implementation\r
+\r
+{ recorrer todos los nodos del arbol procesando todos los elementos }\r
+{ ORDEN de recorrido: como el contenedor ya esta ordenado se recorre en el orden definido para el orden }\r
+PROCEDURE APL_ABO_recorrer_rec( a: ABO_arbol);\r
+       PROCEDURE recorrer_rec( a: ABO_arbol );\r
+       VAR \r
+               error: boolean;\r
+               e: Tipo_Elem;\r
+       BEGIN\r
+               { proceso el subarbol izquierdo }\r
+               ABO_mover_cte( a, ABO_izquierda, error );\r
+               IF not error \r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+                       ABO_mover_cte( a, ABO_padre, error );\r
+               END;\r
+               { proceso el nodo corriente }\r
+               ABO_elem_cte( a, e);\r
+               Procesar_Elem_Recorrido( e );\r
+               { proceso el subarbol izquierdo }\r
+               ABO_mover_cte( a, ABO_derecha, error );\r
+               IF not error \r
+               THEN BEGIN\r
+                       recorrer_rec( a);\r
+{                      ABO_mover_cte( a, ABO_padre, error ); no hace falta }\r
+               END;\r
+       END;\r
+VAR \r
+       error: boolean;\r
+BEGIN\r
+       { me voy a la raiz y desde allí proceso todo }\r
+       ABO_mover_cte( a, ABO_raiz, error );\r
+   recorrer_rec( a );\r
+END;\r
+\r
diff --git a/arboles/arbol_bin.pas b/arboles/arbol_bin.pas
new file mode 100644 (file)
index 0000000..c0f0be0
--- /dev/null
@@ -0,0 +1,208 @@
+unit arbol_bin;\r
+\r
+{\r
+       IMPLEMENTACION : ARBOLES BINARIOS\r
+       ALMACENAMIENTO : PUNTEROS\r
+       \r
+}\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ tipos propios del arbol binario }\r
+TYPE\r
+       AB_movimiento = ( AB_raiz, AB_izquierda, AB_derecha, AB_padre );\r
+\r
+       AB_puntero = ^AB_nodo;\r
+\r
+       AB_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Izquierda,\r
+               Derecha : AB_puntero;\r
+       END;\r
+\r
+       AB_arbol = RECORD\r
+               Raiz,\r
+               Corriente: AB_puntero;\r
+       END;\r
+\r
+PROCEDURE AB_crear( VAR a: AB_arbol );\r
+FUNCTION  AB_vacio( a: AB_arbol): BOOLEAN;\r
+PROCEDURE AB_elem_cte( a: AB_arbol; VAR e: Tipo_Elem);\r
+PROCEDURE AB_modif_cte( VAR a: AB_arbol; e: Tipo_Elem);\r
+PROCEDURE AB_mover_cte( VAR a: AB_arbol; m: AB_movimiento; VAR error: BOOLEAN );\r
+PROCEDURE AB_borrar_sub( VAR a: AB_arbol; m: AB_movimiento );\r
+PROCEDURE AB_insertar( VAR a: AB_arbol; m: AB_movimiento; e: Tipo_Elem; VAR error: BOOLEAN );\r
+PROCEDURE AB_vaciar( VAR a: AB_arbol );\r
+PROCEDURE AB_copiar( a: AB_arbol; VAR b: AB_arbol );\r
+\r
+implementation\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE AB_crear( VAR a: AB_arbol );\r
+BEGIN\r
+       a.Raiz := NIL;\r
+       a.Corriente := NIL;\r
+END;\r
+\r
+FUNCTION AB_vacio( a: AB_arbol): BOOLEAN;\r
+BEGIN\r
+       AB_vacio := ( a.Raiz = NIL);\r
+END;\r
+\r
+PROCEDURE AB_elem_cte( a: AB_arbol; VAR e: Tipo_Elem);\r
+BEGIN\r
+       e := a.Corriente^.Elem;\r
+END;\r
+\r
+PROCEDURE AB_modif_cte( VAR a: AB_arbol; e: Tipo_Elem);\r
+BEGIN\r
+       a.Corriente^.Elem := e;\r
+END;\r
+\r
+PROCEDURE AB_mover_cte( VAR a: AB_arbol; m: AB_movimiento; VAR error: BOOLEAN );\r
+       FUNCTION buscar_padre( p: AB_puntero; h: AB_puntero ) : AB_puntero;\r
+       VAR\r
+               ret : AB_puntero;\r
+       BEGIN\r
+               ret := NIL;\r
+               IF ( p^.Izquierda = h ) OR ( p^.Derecha = h )\r
+               THEN\r
+                       ret := p;\r
+               IF ( ret = NIL ) AND ( p^.Izquierda <> NIL )\r
+               THEN\r
+                       ret := buscar_padre ( p^.Izquierda, h );\r
+               IF ( ret = NIL ) AND ( p^.Derecha <> NIL )\r
+               THEN\r
+                       ret := buscar_padre ( p^.Derecha, h );\r
+               buscar_padre := ret;\r
+       END;\r
+BEGIN\r
+       error := FALSE;\r
+       CASE m OF\r
+               AB_raiz:\r
+                       A.Corriente := a.Raiz;\r
+               AB_izquierda:\r
+                       IF a.Corriente^.Izquierda = NIL\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               a.Corriente := A.Corriente^.Izquierda;\r
+               AB_derecha:\r
+                       IF A.Corriente^.Derecha = NIL\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               a.Corriente := A.Corriente^.Derecha;\r
+               AB_padre:\r
+                       IF a.Corriente = A.Raiz\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               a.Corriente := buscar_padre( a.Raiz, a.Corriente );\r
+               END;\r
+END;\r
+\r
+PROCEDURE AB_borrar_sub( VAR a: AB_arbol; m: AB_movimiento );\r
+       PROCEDURE liberar_subarbol( VAR p : AB_puntero );\r
+  BEGIN\r
+               IF p <> NIL\r
+               THEN BEGIN\r
+                       liberar_subarbol( p^.Izquierda );\r
+                       liberar_subarbol( p^.Izquierda );\r
+                       DISPOSE ( p );\r
+                       p := NIL;\r
+               END;\r
+  END;\r
+BEGIN\r
+       CASE m OF\r
+               AB_izquierda:\r
+                       liberar_subarbol( a.Corriente^.Izquierda );\r
+               AB_derecha:\r
+                       liberar_subarbol( a.Corriente^.Derecha );\r
+               END;\r
+END;\r
+\r
+PROCEDURE AB_insertar( VAR a: AB_arbol; m: AB_movimiento; e: Tipo_Elem; VAR error: BOOLEAN );\r
+VAR\r
+       p : AB_puntero;\r
+BEGIN\r
+       error := FALSE;\r
+       NEW( p );\r
+       p^.Izquierda := NIL;\r
+       p^.Derecha := NIL;\r
+       p^.Elem := e;\r
+       CASE m OF\r
+               AB_raiz:\r
+                       IF a.Raiz = NIL\r
+                       THEN\r
+                               a.Raiz := p\r
+                       ELSE\r
+                               error := TRUE;\r
+               AB_izquierda:\r
+                       IF a.Corriente^.Izquierda = NIL\r
+                       THEN\r
+                               a.Corriente^.Izquierda := p\r
+                       ELSE\r
+                               error := TRUE;\r
+               AB_derecha:\r
+                       IF a.Corriente^.Derecha = NIL\r
+                       THEN\r
+                               a.Corriente^.Derecha := p\r
+                       ELSE\r
+                               error := TRUE;\r
+               AB_padre:\r
+                       error := TRUE\r
+               END;\r
+\r
+       IF error = FALSE\r
+       THEN\r
+       a.Corriente := p\r
+       ELSE\r
+               dispose( p );\r
+\r
+END;\r
+\r
+PROCEDURE AB_vaciar( VAR a: AB_arbol );\r
+       PROCEDURE liberar_subarbol( VAR p : AB_puntero );\r
+       BEGIN\r
+               IF p <> NIL\r
+               THEN BEGIN\r
+                       liberar_subarbol( p^.Izquierda );\r
+                       liberar_subarbol( p^.Derecha );\r
+                       DISPOSE ( p );\r
+                       p := NIL;\r
+               END;\r
+       END;\r
+BEGIN\r
+       liberar_subarbol( a.Raiz );\r
+       a.Corriente := NIL;\r
+END;\r
+\r
+PROCEDURE AB_copiar( a : AB_arbol; VAR b : AB_arbol );\r
+       PROCEDURE copiar_subarbol( o : AB_puntero; VAR d : AB_puntero );\r
+       BEGIN\r
+               IF o <> NIL\r
+               THEN BEGIN\r
+                       { tengo que copiar el nodo y llamar a la copia de los hijos }\r
+                       { el procedimiento va modificando el d como viene por referencia }\r
+                       NEW ( d );\r
+                       d^.Elem := o^.Elem;\r
+                       d^.Izquierda := NIL;\r
+                       d^.Derecha := NIL;\r
+                       copiar_subarbol( o^.Izquierda, d^.Izquierda );\r
+                       copiar_subarbol( o^.Derecha , d^.Derecha );\r
+               END;\r
+       END;\r
+BEGIN\r
+       { tenemos que vaciar primero el arbol b (destino) }\r
+       AB_vaciar( b );\r
+       { ahora copiamos todo el arbol origen }\r
+       copiar_subarbol( a.Raiz, b.Raiz );\r
+       a.Corriente := a.Raiz;\r
+END;\r
+\r
+end.
\ No newline at end of file
diff --git a/arboles/arbol_bin_ord.pas b/arboles/arbol_bin_ord.pas
new file mode 100644 (file)
index 0000000..8b01eb7
--- /dev/null
@@ -0,0 +1,286 @@
+unit arbol_bin_ord;\r
+\r
+{\r
+   IMPLEMENTACION : ARBOLES BINARIOS ORDENADOS\r
+   ALMACENAMIENTO : PUNTEROS\r
+   RECORRIDOS : RECURSIVOS\r
+   \r
+}\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ tipos propios del arbol binario }\r
+type\r
+   ABO_movimiento = ( ABO_raiz, ABO_izquierda, ABO_derecha, ABO_padre );\r
+\r
+   ABO_puntero = ^ABO_nodo;\r
+\r
+   ABO_nodo = record\r
+      Elem : Tipo_Elem;\r
+      Izquierda,\r
+      Derecha : ABO_puntero;\r
+   end;\r
+\r
+   ABO_arbol = record\r
+      Raiz,\r
+      Corriente: ABO_puntero;\r
+   end;\r
+\r
+PROCEDURE ABO_crear( VAR a: ABO_arbol );\r
+FUNCTION  ABO_vacio( a: ABO_arbol): boolean;\r
+PROCEDURE ABO_elem_cte( a: ABO_arbol; VAR e: Tipo_Elem );\r
+PROCEDURE ABO_modif_cte( VAR a: ABO_arbol; e: Tipo_Elem );\r
+PROCEDURE ABO_mover_cte( VAR a: ABO_arbol; m: ABO_movimiento; VAR error: boolean );\r
+PROCEDURE ABO_borrar_cte( VAR a: ABO_arbol );\r
+PROCEDURE ABO_insertar( VAR a: ABO_arbol; e: Tipo_Elem; VAR error: boolean );\r
+PROCEDURE ABO_buscar( VAR a: ABO_arbol; c: Tipo_Clave; VAR error: boolean );\r
+PROCEDURE ABO_vaciar( VAR a: ABO_arbol );\r
+PROCEDURE ABO_copiar( a : ABO_arbol; VAR b : ABO_arbol );\r
+\r
+implementation\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE ABO_crear( VAR a: ABO_arbol );\r
+ begin\r
+   a.Raiz := nil;\r
+   a.Corriente := nil;\r
+ end;\r
+\r
+FUNCTION ABO_vacio( a: ABO_arbol): boolean;\r
+ begin\r
+   ABO_vacio := ( a.Raiz = nil );\r
+ end;\r
+\r
+PROCEDURE ABO_elem_cte( a: ABO_arbol; VAR e: Tipo_Elem);\r
+ begin\r
+   e := a.Corriente^.Elem;\r
+ end;\r
+\r
+PROCEDURE ABO_modif_cte( VAR a: ABO_arbol; e: Tipo_Elem);\r
+ begin\r
+   a.Corriente^.Elem := e;\r
+ end;\r
+\r
+PROCEDURE ABO_mover_cte( VAR a: ABO_arbol; m: ABO_movimiento; VAR error: BOOLEAN );\r
+   FUNCTION buscar_padre( p: ABO_puntero; h: ABO_puntero ) : ABO_puntero;\r
+    var\r
+      ret : ABO_puntero;\r
+    begin\r
+      ret := nil;\r
+      if ( p^.Izquierda = h ) or ( p^.Derecha = h ) then\r
+         ret := p;\r
+      { busco ordenado, por eso pregunto por la clave }\r
+      if ( ret = nil ) and ( p^.Izquierda <> nil ) and\r
+         ( Devolver_Clave_Elem( h^.Elem ) < Devolver_Clave_Elem( p^.Elem ) )\r
+      then\r
+         ret := buscar_padre ( p^.Izquierda, h );\r
+      if ( ret = nil ) and ( p^.Derecha <> nil ) and\r
+         ( Devolver_Clave_Elem( h^.Elem ) > Devolver_Clave_Elem( p^.Elem ) )\r
+      then\r
+         ret := buscar_padre ( p^.Derecha, h );\r
+      buscar_padre := ret;\r
+    end;\r
+ begin\r
+   error := false;\r
+   case m of\r
+      ABO_raiz:\r
+         A.Corriente := a.Raiz;\r
+      ABO_izquierda:\r
+         if a.Corriente^.Izquierda = nil then\r
+            error := true\r
+         else\r
+            a.Corriente := A.Corriente^.Izquierda;\r
+      ABO_derecha:\r
+         if a.Corriente^.Derecha = nil then\r
+            error := true\r
+         else\r
+            a.Corriente := A.Corriente^.Derecha;\r
+      ABO_padre:\r
+         if a.Corriente = A.Raiz then\r
+            error := true\r
+         else\r
+            a.Corriente := buscar_padre( a.Raiz, a.Corriente );\r
+      end;\r
+ end;\r
+\r
+PROCEDURE ABO_borrar_cte( VAR a: ABO_arbol );\r
+   FUNCTION buscar_padre( p: ABO_puntero; h: ABO_puntero ) : ABO_puntero;\r
+    var\r
+      ret : ABO_puntero;\r
+    begin\r
+      ret := nil;\r
+      if ( p^.Izquierda = h ) or ( p^.Derecha = h ) then\r
+         ret := p;\r
+      { busco ordenado, por eso pregunto por la clave }\r
+      if ( ret = nil ) and ( p^.Izquierda <> nil ) and\r
+         ( Devolver_Clave_Elem( h^.Elem ) < Devolver_Clave_Elem( p^.Elem ) )\r
+      then\r
+         ret := buscar_padre( p^.Izquierda, h );\r
+      if ( ret = nil ) and ( p^.Derecha <> nil ) and\r
+         ( Devolver_Clave_Elem( h^.Elem ) > Devolver_Clave_Elem( p^.Elem ) )\r
+      then\r
+         ret := buscar_padre( p^.Derecha, h );\r
+      buscar_padre := ret;\r
+    end;\r
+ var\r
+   p : ABO_puntero;\r
+   h : ABO_puntero;\r
+   n : ABO_puntero;\r
+ begin\r
+\r
+   if a.Corriente^.Izquierda <> nil then begin\r
+      h := a.Corriente^.Izquierda;\r
+      if a.Corriente^.Derecha <> nil then begin\r
+         { busco el nodo mas a la derecha del subarbol izquierdo }\r
+         n := a.Corriente^.Izquierda;\r
+         while n^.Derecha <> nil do begin\r
+            n := n^.Derecha;\r
+         end;\r
+         { aca asigno el subarbol derecho a donde corresponde }\r
+         n^.Derecha := a.Corriente^.Derecha;\r
+      end;\r
+   end\r
+   else\r
+      h := a.Corriente^.Derecha;\r
+\r
+   p := buscar_padre( a.Raiz, a.Corriente );\r
+   if p <> nil then\r
+      { no soy la raiz }\r
+      if Devolver_Clave_Elem( p^.Elem ) > Devolver_Clave_Elem( h^.Elem ) then\r
+         p^.Izquierda := h\r
+      else\r
+         p^.Derecha := h\r
+   else\r
+      { soy la raiz, la tengo que cambiar al nuevo nodo }\r
+      a.Raiz := h;\r
+\r
+   dispose( a.Corriente );\r
+\r
+   if h <> nil then\r
+      a.Corriente := h\r
+   else\r
+      a.Corriente := p;\r
+ end;\r
+\r
+PROCEDURE ABO_insertar( VAR a: ABO_arbol; e: Tipo_Elem; VAR error: BOOLEAN );\r
+   PROCEDURE buscar_lugar( p: ABO_puntero; e: Tipo_Elem; VAR d: ABO_puntero);\r
+    begin\r
+      { devuelve NIL si el elemento ya existe en el arbol }\r
+      if Devolver_Clave_Elem( e ) = Devolver_Clave_Elem( p^.Elem ) then\r
+         d := nil\r
+      else\r
+         if Devolver_Clave_Elem( e ) < Devolver_Clave_Elem( p^.Elem ) then\r
+            if p^.Izquierda <> nil then\r
+               buscar_lugar( p^.Izquierda, e, d )\r
+            else\r
+               d := p\r
+         else\r
+            if p^.Derecha <> nil then\r
+               buscar_lugar( p^.Derecha, e, d )\r
+            else\r
+               d := p\r
+    end;\r
+ var\r
+   p : ABO_puntero;\r
+   x : ABO_puntero;\r
+ begin\r
+   error := false;\r
+   new( p );\r
+   p^.Izquierda := nil;\r
+   p^.Derecha := nil;\r
+   p^.Elem := e;\r
+\r
+   { si el arbol esta vacio inserto directamente }\r
+   if a.Raiz = nil then\r
+      a.Raiz := p\r
+   else begin\r
+      buscar_lugar( a.Raiz, e, x );\r
+      if x = nil then\r
+         error := true\r
+      else\r
+        if Devolver_Clave_Elem( e ) < Devolver_Clave_Elem( x^.Elem ) then\r
+            x^.Izquierda := p\r
+         else\r
+            x^.Derecha := p;\r
+      end;\r
+\r
+   if error = false then\r
+      a.Corriente := p\r
+   else\r
+      dispose( p );\r
+\r
+ end;\r
+\r
+PROCEDURE ABO_buscar( VAR a: ABO_arbol; c: Tipo_Clave; VAR error: BOOLEAN );\r
+   PROCEDURE buscar_lugar( p: ABO_puntero; c: Tipo_Clave; VAR d: ABO_puntero);\r
+    begin\r
+      { devuelve NIL si el elemento NO existe en el arbol }\r
+      if c = Devolver_Clave_Elem( p^.Elem ) then\r
+         d := p\r
+      else\r
+         if c < Devolver_Clave_Elem( p^.Elem ) then\r
+            if p^.Izquierda <> nil then\r
+               buscar_lugar( p^.Izquierda, c, d )\r
+            else\r
+               d := nil\r
+         else\r
+            if p^.Derecha <> nil then\r
+               buscar_lugar( p^.Derecha, c, d )\r
+            else\r
+               d := nil\r
+    end;\r
+ var\r
+   x : ABO_puntero;\r
+\r
+ begin\r
+   error := false;\r
+   buscar_lugar( a.Raiz, c, x );\r
+   if x = nil then\r
+      { no encontro el elemento en el arbol }\r
+      error := true\r
+   else\r
+      a.Corriente := x;\r
+ end;\r
+\r
+PROCEDURE ABO_vaciar( VAR a: ABO_arbol );\r
+   PROCEDURE liberar_subarbol( VAR p : ABO_puntero );\r
+    begin\r
+      if p <> nil then begin\r
+         liberar_subarbol( p^.Izquierda );\r
+         liberar_subarbol( p^.Derecha );\r
+         dispose( p );\r
+         p := nil;\r
+      end;\r
+   end;\r
+ begin\r
+   liberar_subarbol( a.Raiz );\r
+   a.Corriente := nil;\r
+ end;\r
+\r
+PROCEDURE ABO_copiar( a : ABO_arbol; VAR b : ABO_arbol );\r
+   PROCEDURE copiar_subarbol( o : ABO_puntero; VAR d : ABO_puntero );\r
+    begin\r
+      if o <> nil then begin\r
+         { tengo que copiar el nodo y llamar a la copia de los hijos }\r
+         { el procedimiento va modificando el d como viene por referencia }\r
+         new( d );\r
+         d^.Elem := o^.Elem;\r
+         d^.Izquierda := nil;\r
+         d^.Derecha := nil;\r
+         copiar_subarbol( o^.Izquierda, d^.Izquierda );\r
+         copiar_subarbol( o^.Derecha , d^.Derecha );\r
+      end;\r
+    end;\r
+ begin\r
+   { tenemos que vaciar primero el arbol b (destino) }\r
+   ABO_vaciar( b );\r
+   { ahora copiamos todo el arbol origen }\r
+   copiar_subarbol( a.Raiz, b.Raiz );\r
+   a.Corriente := a.Raiz;\r
+ end;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/T_COLAC.pas b/listas_pilas_colas/T_COLAC.pas
new file mode 100644 (file)
index 0000000..0cfe0de
--- /dev/null
@@ -0,0 +1,248 @@
+unit T_COLAC;\r
+\r
+{\r
+       IMPLEMENTACION : colas\r
+       ALMACENAMIENTO : CURSORES\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const COLAC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+       COLAC_puntero = integer;\r
+\r
+const\r
+   COLAC_nulo : COLAC_puntero = 0;\r
+\r
+type\r
+\r
+       COLAC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : COLAC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   COLAC_Almac = record\r
+      almacenamiento : array [ 1 .. COLAC_MAX_CURSOR ] of COLAC_Nodo;\r
+      disponibles     : array [ 1 .. COLAC_MAX_CURSOR ] of COLAC_Puntero;\r
+      primero_dispo  : COLAC_Puntero;\r
+   end;\r
+\r
+       \r
+   COLAC_Cola = RECORD\r
+               almac : COLAC_Almac;\r
+               primero: COLAC_puntero;\r
+      ultimo : COLAC_puntero;\r
+       END;\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE COLAC_Inicializar( VAR l: COLAC_Cola );\r
+FUNCTION  COLAC_vacio( l: COLAC_Cola): BOOLEAN;\r
+FUNCTION  COLAC_lleno( l: COLAC_Cola): BOOLEAN;\r
+\r
+PROCEDURE COLAC_poner( VAR l: COLAC_Cola; e: Tipo_Elem );\r
+PROCEDURE COLAC_sacar( VAR l: COLAC_Cola; VAR e: Tipo_Elem);\r
+PROCEDURE COLAC_vaciar( VAR l: COLAC_Cola );\r
+PROCEDURE COLAC_copiar( a: COLAC_Cola; VAR b: COLAC_Cola );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure COLAC_Almac_Inicializar( VAR almac : COLAC_Almac );\r
+var i : COLAC_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to COLAC_MAX_CURSOR - 1 do\r
+   begin\r
+      almac.disponibles[i] := i + 1;\r
+   end;\r
+   almac.disponibles[COLAC_MAX_CURSOR] := COLAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function COLAC_Almac_HayLugar( almac : COLAC_Almac ): boolean;\r
+begin\r
+   COLAC_Almac_HayLugar := almac.primero_dispo <> COLAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure COLAC_Almac_Reservar( VAR almac : COLAC_Almac; VAR puntero : COLAC_Puntero );\r
+begin\r
+   if not COLAC_Almac_HayLugar( almac )\r
+   then\r
+      puntero := COLAC_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.disponibles[ puntero ];\r
+   end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure COLAC_Almac_Liberar( VAR almac : COLAC_Almac; VAR puntero : COLAC_Puntero );\r
+begin\r
+   almac.disponibles[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := COLAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure COLAC_Almac_Acceder( almac : COLAC_Almac; puntero : COLAC_Puntero; VAR elemento : COLAC_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure COLAC_Almac_Modificar( VAR almac : COLAC_Almac; puntero : COLAC_Puntero; elemento : COLAC_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE COLAC_Inicializar( VAR l: COLAC_Cola );\r
+BEGIN\r
+   COLAC_Almac_Inicializar( l.almac );\r
+   l.primero := COLAC_Nulo;\r
+   l.ultimo := COLAC_Nulo;\r
+END;\r
+\r
+FUNCTION COLAC_vacio( l: COLAC_Cola): BOOLEAN;\r
+BEGIN\r
+       COLAC_vacio := ( l.Primero = COLAC_Nulo);\r
+END;\r
+\r
+FUNCTION COLAC_lleno( l: COLAC_Cola): BOOLEAN;\r
+BEGIN\r
+       COLAC_lleno := not COLAC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE COLAC_poner( VAR l: COLAC_Cola; e: Tipo_Elem);\r
+VAR\r
+       p : COLAC_puntero;\r
+   n : COLAC_Nodo;\r
+   np: COLAC_Puntero;\r
+   m : COLAC_Nodo;\r
+BEGIN\r
+       COLAC_Almac_Reservar( l.almac, np );\r
+       n.Elem := e;\r
+   n.sig := COLAC_Nulo;\r
+   COLAC_Almac_Modificar( l.almac, np, n );\r
+       \r
+   if l.ultimo <> COLAC_Nulo then begin\r
+      { la cola no esta vacia, entonces tengo que modificar el ultimo }\r
+\r
+      { accedo al almacenamiento por el ultimo }\r
+      COLAC_Almac_Acceder( l.almac, l.ultimo, m );\r
+      m.sig := np;\r
+      COLAC_Almac_Modificar( l.almac, l.ultimo, m );\r
+      end\r
+   else\r
+      { si el ultimo es nulo significa que la cola esta vacia }\r
+      { pongo el primero al ultimo tambien }\r
+      l.primero := np;\r
+   l.ultimo := np;\r
+END;\r
+\r
+{ pre: no esta vacia }\r
+PROCEDURE COLAC_sacar( VAR l: COLAC_Cola; VAR e: Tipo_Elem);\r
+VAR n : COLAC_Nodo;\r
+    tmp : COLAC_Nodo;\r
+    tmpp: COLAC_Puntero;\r
+BEGIN\r
+   COLAC_Almac_Acceder( l.almac, l.primero, n );\r
+   COLAC_Almac_Liberar( l.almac, l.primero );\r
+   l.primero := n.Sig;\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+\r
+   if n.sig = COLAC_Nulo then\r
+      { la cola quedo vacia }\r
+      { el ultimo pasa a nulo, y el primero ya es nulo porque el siguiente de n era nulo }\r
+      l.ultimo := COLAC_Nulo;\r
+END;\r
+\r
+PROCEDURE COLAC_vaciar( VAR l: COLAC_Cola );\r
+VAR np : COLAC_Puntero;\r
+    n : COLAC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> COLAC_Nulo ) do begin\r
+      COLAC_Almac_Acceder( l.almac, np, n );\r
+      COLAC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := COLAC_Nulo;\r
+   l.ultimo := COLAC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE COLAC_copiar( a : COLAC_Cola; VAR b : COLAC_Cola );\r
+VAR np, mp, tmpp : COLAC_Puntero;\r
+    n, m : COLAC_Nodo;\r
+BEGIN\r
+   if a.primero = COLAC_Nulo then exit;\r
+   np := a.primero;\r
+   COLAC_Almac_Acceder( a.almac, np, n );\r
+\r
+   COLAC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> COLAC_Nulo ) do begin\r
+\r
+      COLAC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      COLAC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      COLAC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := COLAC_Nulo;\r
+   b.ultimo := mp;\r
+   COLAC_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/T_LSC.pas b/listas_pilas_colas/T_LSC.pas
new file mode 100644 (file)
index 0000000..1ef8dcc
--- /dev/null
@@ -0,0 +1,305 @@
+unit T_LSC;\r
+\r
+{\r
+       IMPLEMENTACION : LISTAS SIMPLES\r
+       ALMACENAMIENTO : CURSORES\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const LSC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+       LSC_puntero = integer;\r
+\r
+const\r
+   LSC_nulo : LSC_puntero = 0;\r
+\r
+type\r
+\r
+       LSC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : LSC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   LSC_Almac = record\r
+      almacenamiento : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Nodo;\r
+      disponibles    : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Puntero;\r
+      primero_dispo  : LSC_Puntero;\r
+   end;\r
+\r
+       \r
+   LSC_Lista = RECORD\r
+               almac : LSC_Almac;\r
+               primero: LSC_puntero;\r
+      corriente : LSC_puntero;\r
+       END;\r
+\r
+       LSC_movimiento = ( LSC_primero, LSC_siguiente );\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE LSC_Inicializar( VAR l: LSC_Lista );\r
+FUNCTION  LSC_vacio( l: LSC_Lista): BOOLEAN;\r
+FUNCTION  LSC_lleno( l: LSC_Lista): BOOLEAN;\r
+\r
+PROCEDURE LSC_elem_cte( l: LSC_Lista; VAR e: Tipo_Elem);\r
+PROCEDURE LSC_modif_cte( VAR l: LSC_Lista; e: Tipo_Elem);\r
+PROCEDURE LSC_mover_cte( VAR l: LSC_Lista; m: LSC_movimiento; VAR error: BOOLEAN );\r
+PROCEDURE LSC_borrar_cte( VAR l: LSC_Lista );\r
+PROCEDURE LSC_insertar( VAR l: LSC_Lista; m: LSC_movimiento; e: Tipo_Elem );\r
+PROCEDURE LSC_vaciar( VAR l: LSC_Lista );\r
+PROCEDURE LSC_copiar( a: LSC_Lista; VAR b: LSC_Lista );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure LSC_Almac_Inicializar( VAR almac : LSC_Almac );\r
+var i : LSC_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to LSC_MAX_CURSOR - 1 do\r
+   begin\r
+      almac.disponibles[i] := i + 1;\r
+   end;\r
+   almac.disponibles[LSC_MAX_CURSOR] := LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function LSC_Almac_HayLugar( almac : LSC_Almac ): boolean;\r
+begin\r
+   LSC_Almac_HayLugar := almac.primero_dispo <> LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure LSC_Almac_Reservar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+begin\r
+   if not LSC_Almac_HayLugar( almac )\r
+   then\r
+      puntero := LSC_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.disponibles[ puntero ];\r
+   end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure LSC_Almac_Liberar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+begin\r
+   almac.disponibles[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure LSC_Almac_Acceder( almac : LSC_Almac; puntero : LSC_Puntero; VAR elemento : LSC_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure LSC_Almac_Modificar( VAR almac : LSC_Almac; puntero : LSC_Puntero; elemento : LSC_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE LSC_Inicializar( VAR l: LSC_Lista );\r
+BEGIN\r
+   LSC_Almac_Inicializar( l.almac );\r
+   l.primero := LSC_Nulo;\r
+   l.corriente := LSC_Nulo;\r
+END;\r
+\r
+FUNCTION LSC_vacio( l: LSC_Lista): BOOLEAN;\r
+BEGIN\r
+       LSC_vacio := ( l.Primero = LSC_Nulo);\r
+END;\r
+\r
+FUNCTION LSC_lleno( l: LSC_Lista): BOOLEAN;\r
+BEGIN\r
+       LSC_lleno := not LSC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE LSC_elem_cte( l: LSC_Lista; VAR e: Tipo_Elem);\r
+var n : LSC_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSC_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+END;\r
+\r
+PROCEDURE LSC_modif_cte( VAR l: LSC_Lista; e: Tipo_Elem);\r
+var n : LSC_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSC_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+   { y la asigno al parametro }\r
+   n.Elem := e;\r
+\r
+   { y modifico el almacenamiento }\r
+   LSC_Almac_Modificar( l.almac, l.Corriente, n );\r
+\r
+END;\r
+\r
+PROCEDURE LSC_mover_cte( VAR l: LSC_Lista; m: LSC_movimiento; VAR error: BOOLEAN );\r
+VAR n : LSC_Nodo;\r
+BEGIN\r
+       error := FALSE;\r
+       CASE m OF\r
+               LSC_primero:\r
+                       l.Corriente := l.Primero;\r
+               LSC_siguiente: begin\r
+\r
+         { accedo al almacenamiento por el nodo corriente }\r
+         LSC_Almac_Acceder( l.almac, l.Corriente, n );\r
+                       \r
+         IF n.sig = LSC_Nulo\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               l.corriente := n.sig;\r
+         end;\r
+               END;\r
+END;\r
+\r
+PROCEDURE LSC_borrar_cte( VAR l: LSC_Lista );\r
+VAR n : LSC_Nodo;\r
+    tmp : LSC_Nodo;\r
+    tmpp: LSC_Puntero;\r
+BEGIN\r
+   if l.corriente = l.primero then begin\r
+      LSC_Almac_Acceder( l.almac, l.primero, n );\r
+      l.primero := n.Sig;\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := l.primero;\r
+      end\r
+   else begin\r
+      tmpp := l.primero;\r
+      LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+      while( tmp.sig <> l.corriente ) do begin\r
+         tmpp := tmp.sig;\r
+         LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+         end;\r
+      LSC_Almac_Acceder( l.almac, l.corriente, n );\r
+      tmp.sig := n.Sig;\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := tmpp;\r
+      end;\r
+END;\r
+\r
+PROCEDURE LSC_insertar( VAR l: LSC_Lista; m: LSC_movimiento; e: Tipo_Elem );\r
+VAR\r
+       p : LSC_puntero;\r
+   n : LSC_Nodo;\r
+   np: LSC_Puntero;\r
+   an: LSC_Nodo;\r
+BEGIN\r
+       LSC_Almac_Reservar( l.almac, np );\r
+       n.Elem := e;\r
+       CASE m OF\r
+               LSC_primero: begin\r
+         n.sig := l.primero;\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+         l.primero := np;\r
+      end;\r
+               LSC_siguiente: begin\r
+         LSC_Almac_Acceder( l.almac, l.corriente, an );\r
+         n.sig := an.sig;\r
+         an.sig := np;\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+         LSC_Almac_Modificar( l.almac, l.corriente, an );\r
+      end;\r
+               END;\r
+\r
+       l.Corriente := np;\r
+\r
+END;\r
+\r
+PROCEDURE LSC_vaciar( VAR l: LSC_Lista );\r
+VAR np : LSC_Puntero;\r
+    n : LSC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> LSC_Nulo ) do begin\r
+      LSC_Almac_Acceder( l.almac, np, n );\r
+      LSC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := LSC_Nulo;\r
+   l.corriente := LSC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE LSC_copiar( a : LSC_Lista; VAR b : LSC_Lista );\r
+VAR np, mp, tmpp : LSC_Puntero;\r
+    n, m : LSC_Nodo;\r
+BEGIN\r
+   if a.primero = LSC_Nulo then exit;\r
+   np := a.primero;\r
+   LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+   LSC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   b.corriente := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> LSC_Nulo ) do begin\r
+\r
+      LSC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      LSC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := LSC_Nulo;\r
+   LSC_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/T_LSP.pas b/listas_pilas_colas/T_LSP.pas
new file mode 100644 (file)
index 0000000..2be356f
--- /dev/null
@@ -0,0 +1,288 @@
+unit T_LSP;\r
+\r
+{\r
+       IMPLEMENTACION : LISTAS SIMPLES\r
+       ALMACENAMIENTO : PUNTERO\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const LSP_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+type\r
+\r
+   LSP_puntero = ^LSP_nodo;\r
+\r
+       LSP_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : LSP_puntero;\r
+       END;\r
+       \r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   LSP_Almac = record\r
+   end;\r
+\r
+       \r
+   LSP_Lista = RECORD\r
+               almac : LSP_Almac;\r
+               primero: LSP_puntero;\r
+      corriente : LSP_puntero;\r
+       END;\r
+\r
+       LSP_movimiento = ( LSP_primero, LSP_siguiente );\r
+\r
+const\r
+   LSP_nulo : LSP_puntero = nil;\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE LSP_Inicializar( VAR l: LSP_Lista );\r
+FUNCTION  LSP_vacio( l: LSP_Lista): BOOLEAN;\r
+FUNCTION  LSP_lleno( l: LSP_Lista): BOOLEAN;\r
+\r
+PROCEDURE LSP_elem_cte( l: LSP_Lista; VAR e: Tipo_Elem);\r
+PROCEDURE LSP_modif_cte( VAR l: LSP_Lista; e: Tipo_Elem);\r
+PROCEDURE LSP_mover_cte( VAR l: LSP_Lista; m: LSP_movimiento; VAR error: BOOLEAN );\r
+PROCEDURE LSP_borrar_cte( VAR l: LSP_Lista );\r
+PROCEDURE LSP_insertar( VAR l: LSP_Lista; m: LSP_movimiento; e: Tipo_Elem );\r
+PROCEDURE LSP_vaciar( VAR l: LSP_Lista );\r
+PROCEDURE LSP_copiar( a: LSP_Lista; VAR b: LSP_Lista );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure LSP_Almac_Inicializar( VAR almac : LSP_Almac );\r
+begin\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function LSP_Almac_HayLugar( almac : LSP_Almac ): boolean;\r
+begin\r
+   LSP_Almac_HayLugar := true;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure LSP_Almac_Reservar( VAR almac : LSP_Almac; VAR puntero : LSP_Puntero );\r
+begin\r
+   puntero := new( LSP_puntero );\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure LSP_Almac_Liberar( VAR almac : LSP_Almac; VAR puntero : LSP_Puntero );\r
+begin\r
+   dispose( puntero );\r
+   puntero := LSP_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure LSP_Almac_Acceder( almac : LSP_Almac; puntero : LSP_Puntero; VAR elemento : LSP_Nodo );\r
+begin\r
+   elemento := puntero^;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure LSP_Almac_Modificar( VAR almac : LSP_Almac; puntero : LSP_Puntero; elemento : LSP_Nodo );\r
+begin\r
+   puntero^ := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE LSP_Inicializar( VAR l: LSP_Lista );\r
+BEGIN\r
+   LSP_Almac_Inicializar( l.almac );\r
+   l.primero := LSP_Nulo;\r
+   l.corriente := LSP_Nulo;\r
+END;\r
+\r
+FUNCTION LSP_vacio( l: LSP_Lista): BOOLEAN;\r
+BEGIN\r
+       LSP_vacio := ( l.Primero = LSP_Nulo);\r
+END;\r
+\r
+FUNCTION LSP_lleno( l: LSP_Lista): BOOLEAN;\r
+BEGIN\r
+       LSP_lleno := not LSP_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE LSP_elem_cte( l: LSP_Lista; VAR e: Tipo_Elem);\r
+var n : LSP_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSP_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+END;\r
+\r
+PROCEDURE LSP_modif_cte( VAR l: LSP_Lista; e: Tipo_Elem);\r
+var n : LSP_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSP_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+   { y la asigno al parametro }\r
+   n.Elem := e;\r
+\r
+   { y modifico el almacenamiento }\r
+   LSP_Almac_Modificar( l.almac, l.Corriente, n );\r
+\r
+END;\r
+\r
+PROCEDURE LSP_mover_cte( VAR l: LSP_Lista; m: LSP_movimiento; VAR error: BOOLEAN );\r
+VAR n : LSP_Nodo;\r
+BEGIN\r
+       error := FALSE;\r
+       CASE m OF\r
+               LSP_primero:\r
+                       l.Corriente := l.Primero;\r
+               LSP_siguiente: begin\r
+\r
+         { accedo al almacenamiento por el nodo corriente }\r
+         LSP_Almac_Acceder( l.almac, l.Corriente, n );\r
+                       \r
+         IF n.sig = LSP_Nulo\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               l.corriente := n.sig;\r
+         end;\r
+               END;\r
+END;\r
+\r
+PROCEDURE LSP_borrar_cte( VAR l: LSP_Lista );\r
+VAR n : LSP_Nodo;\r
+    tmp : LSP_Nodo;\r
+    tmpp: LSP_Puntero;\r
+BEGIN\r
+   if l.corriente = l.primero then begin\r
+      LSP_Almac_Acceder( l.almac, l.primero, n );\r
+      l.primero := n.Sig;\r
+      LSP_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := l.primero;\r
+      end\r
+   else begin\r
+      tmpp := l.primero;\r
+      LSP_Almac_Acceder( l.almac, tmpp, tmp );\r
+      while( tmp.sig <> l.corriente ) do begin\r
+         tmpp := tmp.sig;\r
+         LSP_Almac_Acceder( l.almac, tmpp, tmp );\r
+         end;\r
+      LSP_Almac_Acceder( l.almac, l.corriente, n );\r
+      tmp.sig := n.Sig;\r
+      LSP_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := tmpp;\r
+      end;\r
+END;\r
+\r
+PROCEDURE LSP_insertar( VAR l: LSP_Lista; m: LSP_movimiento; e: Tipo_Elem );\r
+VAR\r
+       p : LSP_puntero;\r
+   n : LSP_Nodo;\r
+   np: LSP_Puntero;\r
+   an: LSP_Nodo;\r
+BEGIN\r
+       LSP_Almac_Reservar( l.almac, np );\r
+       n.Elem := e;\r
+       CASE m OF\r
+               LSP_primero: begin\r
+         n.sig := l.primero;\r
+         LSP_Almac_Modificar( l.almac, np, n );\r
+         l.primero := np;\r
+      end;\r
+               LSP_siguiente: begin\r
+         LSP_Almac_Acceder( l.almac, l.corriente, an );\r
+         n.sig := an.sig;\r
+         an.sig := np;\r
+         LSP_Almac_Modificar( l.almac, np, n );\r
+         LSP_Almac_Modificar( l.almac, l.corriente, an );\r
+      end;\r
+               END;\r
+\r
+       l.Corriente := np;\r
+\r
+END;\r
+\r
+PROCEDURE LSP_vaciar( VAR l: LSP_Lista );\r
+VAR np : LSP_Puntero;\r
+    n : LSP_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> LSP_Nulo ) do begin\r
+      LSP_Almac_Acceder( l.almac, np, n );\r
+      LSP_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := LSP_Nulo;\r
+   l.corriente := LSP_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE LSP_copiar( a : LSP_Lista; VAR b : LSP_Lista );\r
+VAR np, mp, tmpp : LSP_Puntero;\r
+    n, m : LSP_Nodo;\r
+BEGIN\r
+   if a.primero = LSP_Nulo then exit;\r
+   np := a.primero;\r
+   LSP_Almac_Acceder( a.almac, np, n );\r
+\r
+   LSP_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   b.corriente := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> LSP_Nulo ) do begin\r
+\r
+      LSP_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      LSP_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      LSP_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := LSP_Nulo;\r
+   LSP_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/T_PILAC.pas b/listas_pilas_colas/T_PILAC.pas
new file mode 100644 (file)
index 0000000..50cbe0a
--- /dev/null
@@ -0,0 +1,225 @@
+unit T_PILAC;\r
+\r
+{\r
+       IMPLEMENTACION : pilas\r
+       ALMACENAMIENTO : CURSORES\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const PILAC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+       PILAC_puntero = integer;\r
+\r
+const\r
+   PILAC_nulo : PILAC_puntero = 0;\r
+\r
+type\r
+\r
+       PILAC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : PILAC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   PILAC_Almac = record\r
+      almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo;\r
+      disponibles     : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero;\r
+      primero_dispo  : PILAC_Puntero;\r
+   end;\r
+\r
+       \r
+   PILAC_Pila = RECORD\r
+               almac : PILAC_Almac;\r
+               primero: PILAC_puntero;\r
+       END;\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE PILAC_Inicializar( VAR l: PILAC_Pila );\r
+FUNCTION  PILAC_vacio( l: PILAC_Pila): BOOLEAN;\r
+FUNCTION  PILAC_lleno( l: PILAC_Pila): BOOLEAN;\r
+\r
+PROCEDURE PILAC_poner( VAR l: PILAC_Pila; e: Tipo_Elem );\r
+PROCEDURE PILAC_sacar( VAR l: PILAC_Pila; VAR e: Tipo_Elem);\r
+PROCEDURE PILAC_vaciar( VAR l: PILAC_Pila );\r
+PROCEDURE PILAC_copiar( a: PILAC_Pila; VAR b: PILAC_Pila );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac );\r
+var i : PILAC_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to PILAC_MAX_CURSOR - 1 do\r
+   begin\r
+      almac.disponibles[i] := i + 1;\r
+   end;\r
+   almac.disponibles[PILAC_MAX_CURSOR] := PILAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean;\r
+begin\r
+   PILAC_Almac_HayLugar := almac.primero_dispo <> PILAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+begin\r
+   if not PILAC_Almac_HayLugar( almac )\r
+   then\r
+      puntero := PILAC_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.disponibles[ puntero ];\r
+   end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+begin\r
+   almac.disponibles[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := PILAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure PILAC_Almac_Acceder( almac : PILAC_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE PILAC_Inicializar( VAR l: PILAC_Pila );\r
+BEGIN\r
+   PILAC_Almac_Inicializar( l.almac );\r
+   l.primero := PILAC_Nulo;\r
+END;\r
+\r
+FUNCTION PILAC_vacio( l: PILAC_Pila): BOOLEAN;\r
+BEGIN\r
+       PILAC_vacio := ( l.Primero = PILAC_Nulo);\r
+END;\r
+\r
+FUNCTION PILAC_lleno( l: PILAC_Pila): BOOLEAN;\r
+BEGIN\r
+       PILAC_lleno := not PILAC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE PILAC_poner( VAR l: PILAC_Pila; e: Tipo_Elem);\r
+VAR\r
+   n : PILAC_Nodo;\r
+   np: PILAC_Puntero;\r
+BEGIN\r
+       n.Elem := e;\r
+   n.sig := l.primero;\r
+       PILAC_Almac_Reservar( l.almac, np );\r
+   PILAC_Almac_Modificar( l.almac, np, n );\r
+   l.primero := np;\r
+END;\r
+\r
+{ pre: no esta vacia }\r
+PROCEDURE PILAC_sacar( VAR l: PILAC_Pila; VAR e: Tipo_Elem);\r
+VAR n : PILAC_Nodo;\r
+    tmp : PILAC_Nodo;\r
+    tmpp: PILAC_Puntero;\r
+BEGIN\r
+   PILAC_Almac_Acceder( l.almac, l.primero, n );\r
+   PILAC_Almac_Liberar( l.almac, l.primero );\r
+   l.primero := n.Sig;\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+END;\r
+\r
+PROCEDURE PILAC_vaciar( VAR l: PILAC_Pila );\r
+VAR np : PILAC_Puntero;\r
+    n : PILAC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> PILAC_Nulo ) do begin\r
+      PILAC_Almac_Acceder( l.almac, np, n );\r
+      PILAC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := PILAC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE PILAC_copiar( a : PILAC_Pila; VAR b : PILAC_Pila );\r
+VAR np, mp, tmpp : PILAC_Puntero;\r
+    n, m : PILAC_Nodo;\r
+\r
+BEGIN\r
+   if a.primero = PILAC_Nulo then exit;\r
+   np := a.primero;\r
+   PILAC_Almac_Acceder( a.almac, np, n );\r
+\r
+   PILAC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> PILAC_Nulo ) do begin\r
+\r
+      PILAC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      PILAC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      PILAC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := PILAC_Nulo;\r
+   PILAC_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/cola_c.pas b/listas_pilas_colas/cola_c.pas
new file mode 100644 (file)
index 0000000..8035f95
--- /dev/null
@@ -0,0 +1,248 @@
+unit cola_C;\r
+\r
+{\r
+       IMPLEMENTACION : colas\r
+       ALMACENAMIENTO : CURSORES\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const COLA_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+       COLAC_puntero = integer;\r
+\r
+const\r
+   COLAC_nulo : COLAC_puntero = 0;\r
+\r
+type\r
+\r
+       COLAC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : COLAC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   COLAC_Almac = record\r
+      almacenamiento : array [ 1 .. COLAC_MAX_CURSOR ] of COLAC_Nodo;\r
+      siguientes     : array [ 1 .. COLAC_MAX_CURSOR ] of COLAC_Puntero;\r
+      primero_dispo  : TTDA_Puntero;\r
+   end;\r
+\r
+       \r
+   COLAC_Cola = RECORD\r
+               almac : COLAC_Almac;\r
+               primero: COLAC_puntero;\r
+      ultimo : COLAC_puntero;\r
+       END;\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE COLAC_Inicializar( VAR l: COLAC_Cola );\r
+FUNCTION  COLAC_vacio( l: COLAC_Cola): BOOLEAN;\r
+FUNCTION  COLAC_lleno( l: COLAC_Cola): BOOLEAN;\r
+\r
+PROCEDURE COLAC_poner( VAR l: COLAC_Cola; e: Tipo_Elem );\r
+PROCEDURE COLAC_sacar( VAR l: COLAC_Cola; VAR e: Tipo_Elem);\r
+PROCEDURE COLAC_vaciar( VAR l: COLAC_Cola );\r
+PROCEDURE COLAC_copiar( l: COLAC_Cola; VAR b: COLAC_Cola );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure COLAC_Almac_Inicializar( VAR almac : COLAC_Almac );\r
+var i : COLAC_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to COLAC_CURSOR_MAX - 1 do\r
+   begin\r
+      siguientes[i] := i + 1;\r
+   end;\r
+   siguientes[COLAC_CURSOR_MAX] := COLAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function COLAC_Almac_HayLugar( almac : COLAC_Almac ): boolean;\r
+begin\r
+   COLAC_Almac_HayLugar := almac.primero_dispo = COLAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure COLAC_Almac_Reservar( VAR almac : COLAC_Almac; VAR puntero : COLAC_Puntero );\r
+begin\r
+   if not COLAC_Almac_HayLugar( almac )\r
+   then\r
+      puntero := COLAC_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.siguientes[ puntero ];\r
+   end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure COLAC_Almac_Liberar( VAR almac : COLAC_Almac; VAR puntero : COLAC_Puntero );\r
+begin\r
+   almac.siguientes[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := COLAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure COLAC_Almac_Acceder( almac : TTDA_Almac; puntero : COLAC_Puntero; VAR elemento : COLAC_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure COLAC_Almac_Modificar( VAR almac : COLAC_Almac; puntero : COLAC_Puntero; elemento : COLAC_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE COLAC_Inicializar( VAR l: COLAC_Cola );\r
+BEGIN\r
+   COLAC_Almac_Inicializar( l.almac );\r
+   primero := COLAC_Nulo;\r
+   ultimo := COLAC_Nulo;\r
+END;\r
+\r
+FUNCTION COLAC_vacio( l: COLAC_Cola): BOOLEAN;\r
+BEGIN\r
+       COLAC_vacio := ( l.Primero = COLAC_Nulo);\r
+END;\r
+\r
+FUNCTION COLAC_lleno( l: COLAC_Cola): BOOLEAN;\r
+BEGIN\r
+       COLAC_lleno := not COLAC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE COLAC_poner( VAR l: COLAC_Cola; e: Tipo_Elem);\r
+VAR\r
+       p : COLAC_puntero;\r
+   n : COLAC_Nodo;\r
+   np: COLAC_Puntero;\r
+   m : COLAC_Nodo;\r
+BEGIN\r
+       COLAC_Almac_Reservar( l.almac, np );\r
+       n.Elem := e;\r
+   n.sig := COLAC_Nulo;\r
+   COLAC_Almac_Modificar( l.almac, np, n );\r
+       \r
+   if l.ultimo <> COLAC_Nulo then begin\r
+      { la cola no esta vacia, entonces tengo que modificar el ultimo }\r
+\r
+      { accedo al almacenamiento por el ultimo }\r
+      COLAC_Almac_Acceder( l, l.ultimo, m );\r
+      m.sig := np;\r
+      COLAC_Almac_Modificar( l.almac, l.ultimo, m );\r
+      end;\r
+   else\r
+      { si el ultimo es nulo significa que la cola esta vacia }\r
+      { pongo el primero al ultimo tambien }\r
+      l.primero := np;\r
+   l.ultimo := np;\r
+END;\r
+\r
+{ pre: no esta vacia }\r
+PROCEDURE COLAC_sacar( l: COLAC_Cola; VAR e: Tipo_Elem);\r
+VAR n : COLAC_Nodo;\r
+    tmp : COLAC_Nodo;\r
+    tmpp: COLAC_Puntero;\r
+BEGIN\r
+   COLAC_Almac_Acceder( l.almac, l.primero, n );\r
+   COLAC_Almac_Liberar( l.almac, l.primero );\r
+   l.primero := n.Sig;\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+\r
+   if n.sig = COLAC_Nulo then\r
+      { la cola quedo vacia }\r
+      { el ultimo pasa a nulo, y el primero ya es nulo porque el siguiente de n era nulo }\r
+      l.ultimo := COLAC_Nulo;\r
+END;\r
+\r
+PROCEDURE COLAC_vaciar( VAR a: COLAC_Cola );\r
+VAR np : COLAC_Puntero;\r
+    n : COLAC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> COLAC_Nulo ) do begin\r
+      COLAC_Almac_Acceder( l.almac, np, n );\r
+      COLAC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := COLAC_Nulo;\r
+   l.ultimo := COLAC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE COLAC_copiar( a : COLAC_Cola; VAR b : COLAC_Cola );\r
+VAR np : COLAC_Puntero;\r
+    n : COLAC_Nodo;\r
+BEGIN\r
+   if a.primero = COLAC_Nulo then return;\r
+   np := a.primero;\r
+   COLAC_Almac_Acceder( a.almac, np, n );\r
+\r
+   COLAC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> COLAC_Nulo ) do begin\r
+\r
+      COLAC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      COLAC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      COLAC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := COLAC_Nulo;\r
+   b.ultimo := mp;\r
+   COLAC_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/eje_lista.pas b/listas_pilas_colas/eje_lista.pas
new file mode 100644 (file)
index 0000000..032a70c
--- /dev/null
@@ -0,0 +1,139 @@
+program eje_lista;\r
+\r
+{\r
+       IMPLEMENTACION : EJERCICIOS DE ARBOLES\r
+       \r
+}\r
+uses tda_gral, t_lSC;\r
+\r
+\r
+{ =========================================================================== }\r
+{ =========================================================================== }\r
+{ =========================================================================== }\r
+{\r
+   Este procedimiento elimina los duplicados de una lista\r
+}\r
+PROCEDURE eliminar_dupes( VAR l: LSC_lista);\r
+       \r
+   {\r
+      buscar a partir del corriente el proximo con un clave determinada\r
+   }\r
+       FUNCTION buscar( VAR l: LSC_lista; c: Tipo_Clave ): boolean;\r
+   VAR\r
+       enc, error: boolean;\r
+      e: Tipo_Elem;\r
+       BEGIN\r
+      { paso al siguiente de entrada }\r
+      LSC_mover_cte( l, LSC_siguiente, error );\r
+\r
+      enc := false;\r
+      WHILE(not error) and( not enc ) DO BEGIN\r
+         LSC_elem_cte( l, e );\r
+\r
+         IF Devolver_Clave_Elem( e ) = c\r
+         THEN { lo encontre }\r
+            enc := true\r
+         ELSE\r
+            { voy al siguiente }\r
+            LSC_mover_cte( l, LSC_siguiente, error );\r
+      END;\r
+\r
+       END;\r
+\r
+VAR\r
+       error: boolean;\r
+   e: Tipo_Elem;\r
+BEGIN\r
+   { si esta vacia no tengo nada que hacer }\r
+   if LSC_Vacio( l ) THEN EXIT;\r
+\r
+   LSC_mover_cte( l, LSC_primero, error );\r
+\r
+   WHILE not error DO BEGIN\r
+\r
+      { obtengo el elemento que voy a usar como pivote, para borrar sus duplicados }\r
+      LSC_elem_cte( l, e );\r
+\r
+      { itero borrando dupes }\r
+      WHILE buscar( l, Devolver_Clave_Elem( e ) ) DO\r
+            LSC_borrar_cte( l );\r
+\r
+      { vuelvo al primero para buscar el original }\r
+      LSC_mover_cte( l, LSC_primero, error );\r
+      error := buscar( l, Devolver_Clave_Elem( e ));\r
+      { paso al siguiente }\r
+      LSC_mover_cte( l, LSC_siguiente, error );\r
+\r
+   end;\r
+END;\r
+\r
+{\r
+   Insertar ordenado en una lista doblemente enlazada\r
+}\r
+PROCEDURE insertar_ordenado( VAR l: LDC_lista, e: Tipo_elem );\r
+       \r
+   {\r
+      buscar a partir del corriente el proximo con un clave determinada\r
+   }\r
+       FUNCTION buscar( VAR l: LDC_lista; c: Tipo_Clave ): boolean;\r
+   VAR\r
+       enc, error: boolean;\r
+      e: Tipo_Elem;\r
+       BEGIN\r
+      { paso al siguiente de entrada }\r
+      LDC_mover_cte( l, LDC_siguiente, error );\r
+\r
+      enc := false;\r
+      WHILE(not error) and( not enc ) DO BEGIN\r
+         LDC_elem_cte( l, e );\r
+\r
+         IF Devolver_Clave_Elem( e ) = c\r
+         THEN { lo encontre }\r
+            enc := true\r
+         ELSE\r
+            { voy al siguiente }\r
+            LDC_mover_cte( l, LDC_siguiente, error );\r
+      END;\r
+\r
+       END;\r
+\r
+VAR\r
+       error: boolean;\r
+   n: Tipo_Elem;\r
+BEGIN\r
+   { si esta vacia no tengo nada que hacer }\r
+   if LDC_Vacio( l )\r
+   THEN BEGIN\r
+      LDC_insertar( l, primero, error );\r
+      exit;\r
+      END;\r
+\r
+   LDC_mover_cte( l, LDC_primero, error );\r
+\r
+   { busco donde corresponde insertar el elem }\r
+   error := buscar( l, Devolver_Clave_Elem( e ));\r
+\r
+   { obtengo el elemento pivote }\r
+   LDC_elem_cte( l, n );\r
+\r
+   if error\r
+   THEN BEGIN\r
+      { aca se deberia manejar la insercion de duplicados }\r
+      LDC_insertar( l, LDC_siguiente, error );\r
+      END\r
+   ELSE BEGIN\r
+      IF Devolver_Clave_Elem( e ) > Devolver_Clave_Elem( n )\r
+      THEN\r
+         LDC_insertar( l, LDC_siguiente, error )\r
+      ELSE\r
+         LDC_insertar( l, LDC_anterior, error );\r
+\r
+END;\r
+\r
+\r
+{ procedimiento principal }\r
+VAR\r
+       a: integer;\r
+BEGIN\r
+\r
+END.\r
diff --git a/listas_pilas_colas/lista_simple_c.pas b/listas_pilas_colas/lista_simple_c.pas
new file mode 100644 (file)
index 0000000..9ed0599
--- /dev/null
@@ -0,0 +1,300 @@
+unit lista_simple_C;\r
+\r
+{\r
+       IMPLEMENTACION : LISTAS SIMPLES\r
+       ALMACENAMIENTO : CURSORES\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const LSC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+       LSC_puntero = integer;\r
+\r
+const\r
+   LSC_nulo : LSC_puntero = 0;\r
+\r
+type\r
+\r
+       LSC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : LSC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   LSC_Almac = record\r
+      almacenamiento : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Nodo;\r
+      siguientes     : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Puntero;\r
+      primero_dispo  : TTDA_Puntero;\r
+   end;\r
+\r
+       \r
+   LSC_Lista_Simple_C = RECORD\r
+               almac : LSC_Almac;\r
+               primero: LSC_puntero;\r
+      corriente : LSC_puntero;\r
+       END;\r
+\r
+       LSC_movimiento = ( LSC_primero, LSC_siguiente );\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE LSC_Inicializar( VAR l: LSC_Lista_Simple_C );\r
+FUNCTION  LSC_vacio( l: LSC_Lista_Simple_C): BOOLEAN;\r
+FUNCTION  LSC_lleno( l: LSC_Lista_Simple_C): BOOLEAN;\r
+\r
+PROCEDURE LSC_elem_cte( l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+PROCEDURE LSC_modif_cte( VAR l: LSC_Lista_Simple_C; e: Tipo_Elem);\r
+PROCEDURE LSC_mover_cte( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; VAR error: BOOLEAN );\r
+PROCEDURE LSC_borrar_cte( VAR l: LSC_Lista_Simple_C );\r
+PROCEDURE LSC_insertar( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; e: Tipo_Elem );\r
+PROCEDURE LSC_vaciar( VAR l: LSC_Lista_Simple_C );\r
+PROCEDURE LSC_copiar( l: LSC_Lista_Simple_C; VAR b: LSC_Lista_Simple_C );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure LSC_Almac_Inicializar( VAR almac : LSC_Almac );\r
+var i : LSC_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to LSC_CURSOR_MAX - 1 do\r
+   begin\r
+      siguientes[i] := i + 1;\r
+   end;\r
+   siguientes[LSC_CURSOR_MAX] := LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function LSC_Almac_HayLugar( almac : LSC_Almac ): boolean;\r
+begin\r
+   LSC_Almac_HayLugar := almac.primero_dispo = LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure LSC_Almac_Reservar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+begin\r
+   if not LSC_Almac_HayLugar( almac )\r
+   then\r
+      puntero := LSC_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.siguientes[ puntero ];\r
+   end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure LSC_Almac_Liberar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+begin\r
+   almac.siguientes[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure LSC_Almac_Acceder( almac : TTDA_Almac; puntero : LSC_Puntero; VAR elemento : LSC_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure LSC_Almac_Modificar( VAR almac : LSC_Almac; puntero : LSC_Puntero; elemento : LSC_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE LSC_Inicializar( VAR l: LSC_Lista_Simple_C );\r
+BEGIN\r
+   LSC_Almac_Inicializar( l.almac );\r
+   primero := LSC_Nulo;\r
+   corriente := LSC_Nulo;\r
+END;\r
+\r
+FUNCTION LSC_vacio( l: LSC_Lista_Simple_C): BOOLEAN;\r
+BEGIN\r
+       LSC_vacio := ( l.Primero = LSC_Nulo);\r
+END;\r
+\r
+FUNCTION LSC_lleno( l: LSC_Lista_Simple_C): BOOLEAN;\r
+BEGIN\r
+       LSC_lleno := not LSC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE LSC_elem_cte( l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+var n : LSC_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSC_Almac_Acceder( l, l.Corriente, n );\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+END;\r
+\r
+PROCEDURE LSC_modif_cte( VAR l: LSC_Lista_Simple_C; e: Tipo_Elem);\r
+var n : LSC_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSC_Almac_Acceder( l, l.Corriente, n );\r
+\r
+   { y la asigno al parametro }\r
+   n.Elem := e;\r
+\r
+   { y modifico el almacenamiento }\r
+   LSC_Almac_Modificar( l, l.Corriente, n );\r
+\r
+END;\r
+\r
+PROCEDURE LSC_mover_cte( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; VAR error: BOOLEAN );\r
+VAR n : LSC_Nodo;\r
+BEGIN\r
+       error := FALSE;\r
+       CASE m OF\r
+               LSC_primero:\r
+                       l.Corriente := l.Primero;\r
+               LSC_siguiente:\r
+         { accedo al almacenamiento por el nodo corriente }\r
+         LSC_Almac_Acceder( l, l.Corriente, n );\r
+                       \r
+         IF n.siguiente = LSC_Nulo\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               l.corriente := n.siguiente;\r
+               END;\r
+END;\r
+\r
+PROCEDURE LSC_borrar_cte( VAR l: LSC_Lista_Simple_C );\r
+VAR n : LSC_Nodo;\r
+    tmp : LSC_Nodo;\r
+    tmpp: LSC_Puntero;\r
+BEGIN\r
+   if l.corriente = l.primero then begin\r
+      LSC_Almac_Acceder( l.almac, l.primero, n );\r
+      l.primero := n.Sig;\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := l.primero;\r
+      end;\r
+   else begin\r
+      tmpp := l.primero;\r
+      LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+      while( tmp.sig <> l.corriente ) do begin\r
+         tmpp := tmp.sig;\r
+         LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+         end;\r
+      LSC_Almac_Acceder( l.almac, l.corriente, n );\r
+      tmp.sig := n.Sig;\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := tmpp;\r
+      end;\r
+END;\r
+\r
+PROCEDURE LSC_insertar( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; e: Tipo_Elem );\r
+VAR\r
+       p : LSC_puntero;\r
+   n : LSC_Nodo;\r
+   np: LSC_Puntero;\r
+BEGIN\r
+       LSC_Almac_Reservar( l.almac, np );\r
+       n.Elem := e;\r
+       CASE m OF\r
+               LSC_primero:\r
+         n.sig := l.primero;\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+         l.primero := np;\r
+               LSC_siguiente:\r
+         LSC_Almac_Acceder( l.almac, l.corriente, ant );\r
+         n.sig := ant.sig;\r
+         ant.sig := np;\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+         LSC_Almac_Modificar( l.almac, l.corriente, ant );\r
+               END;\r
+\r
+       l.Corriente := np;\r
+\r
+END;\r
+\r
+PROCEDURE LSC_vaciar( VAR a: LSC_Lista_Simple_C );\r
+VAR np : LSC_Puntero;\r
+    n : LSC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> LSC_Nulo ) do begin\r
+      LSC_Almac_Acceder( l.almac, np, n );\r
+      LSC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := LSC_Nulo;\r
+   l.corriente := LSC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE LSC_copiar( a : LSC_Lista_Simple_C; VAR b : LSC_Lista_Simple_C );\r
+VAR np : LSC_Puntero;\r
+    n : LSC_Nodo;\r
+BEGIN\r
+   if a.primero = LSC_Nulo then return;\r
+   np := a.primero;\r
+   LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+   LSC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   b.corriente := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> LSC_Nulo ) do begin\r
+\r
+      LSC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      LSC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := LSC_Nulo;\r
+   LSC_Almac_Modificar( l.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/lista_simple_p.pas b/listas_pilas_colas/lista_simple_p.pas
new file mode 100644 (file)
index 0000000..093ca5f
--- /dev/null
@@ -0,0 +1,282 @@
+unit lista_simple_P;\r
+\r
+{\r
+       IMPLEMENTACION : LISTAS SIMPLES\r
+       ALMACENAMIENTO : PUNTERO\r
+       \r
+}\r
+\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const LSC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el almacenamiento }\r
+TYPE\r
+       LSC_puntero = ^LSC_Nodo;\r
+\r
+const\r
+   LSC_nulo : LSC_puntero = nil;\r
+\r
+type\r
+\r
+       LSC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : LSC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   LSC_Almac = record\r
+   end;\r
+\r
+       \r
+   LSC_Lista_Simple_C = RECORD\r
+               almac : LSC_Almac;\r
+               primero: LSC_puntero;\r
+      corriente : LSC_puntero;\r
+       END;\r
+\r
+       LSC_movimiento = ( LSC_primero, LSC_siguiente );\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE LSC_Inicializar( VAR l: LSC_Lista_Simple_C );\r
+FUNCTION  LSC_vacio( l: LSC_Lista_Simple_C): BOOLEAN;\r
+FUNCTION  LSC_lleno( l: LSC_Lista_Simple_C): BOOLEAN;\r
+\r
+PROCEDURE LSC_elem_cte( l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+PROCEDURE LSC_modif_cte( VAR l: LSC_Lista_Simple_C; e: Tipo_Elem);\r
+PROCEDURE LSC_mover_cte( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; VAR error: BOOLEAN );\r
+PROCEDURE LSC_borrar_cte( VAR l: LSC_Lista_Simple_C );\r
+PROCEDURE LSC_insertar( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; e: Tipo_Elem );\r
+PROCEDURE LSC_vaciar( VAR l: LSC_Lista_Simple_C );\r
+PROCEDURE LSC_copiar( l: LSC_Lista_Simple_C; VAR b: LSC_Lista_Simple_C );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure LSC_Almac_Inicializar( VAR almac : LSC_Almac );\r
+begin\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function LSC_Almac_HayLugar( almac : LSC_Almac ): boolean;\r
+begin\r
+   LSC_Almac_HayLugar := true;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure LSC_Almac_Reservar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+begin\r
+   puntero := new( LSC_Nodo );\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure LSC_Almac_Liberar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+begin\r
+   dispose( puntero );\r
+   puntero := LSC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure LSC_Almac_Acceder( almac : TTDA_Almac; puntero : LSC_Puntero; VAR elemento : LSC_Nodo );\r
+begin\r
+   elemento := puntero^;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure LSC_Almac_Modificar( VAR almac : LSC_Almac; puntero : LSC_Puntero; elemento : LSC_Nodo );\r
+begin\r
+   puntero^ := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE LSC_Inicializar( VAR l: LSC_Lista_Simple_C );\r
+BEGIN\r
+   LSC_Almac_Inicializar( l.almac );\r
+   primero := LSC_Nulo;\r
+   corriente := LSC_Nulo;\r
+END;\r
+\r
+FUNCTION LSC_vacio( l: LSC_Lista_Simple_C): BOOLEAN;\r
+BEGIN\r
+       LSC_vacio := ( l.Primero = LSC_Nulo);\r
+END;\r
+\r
+FUNCTION LSC_lleno( l: LSC_Lista_Simple_C): BOOLEAN;\r
+BEGIN\r
+       LSC_lleno := not LSC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE LSC_elem_cte( l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+var n : LSC_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSC_Almac_Acceder( l, l.Corriente, n );\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+END;\r
+\r
+PROCEDURE LSC_modif_cte( VAR l: LSC_Lista_Simple_C; e: Tipo_Elem);\r
+var n : LSC_Nodo;\r
+BEGIN\r
+       { accedo al almacenamiento por el nodo corriente }\r
+   LSC_Almac_Acceder( l, l.Corriente, n );\r
+\r
+   { y la asigno al parametro }\r
+   n.Elem := e;\r
+\r
+   { y modifico el almacenamiento }\r
+   LSC_Almac_Modificar( l, l.Corriente, n );\r
+\r
+END;\r
+\r
+PROCEDURE LSC_mover_cte( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; VAR error: BOOLEAN );\r
+VAR n : LSC_Nodo;\r
+BEGIN\r
+       error := FALSE;\r
+       CASE m OF\r
+               LSC_primero:\r
+                       l.Corriente := l.Primero;\r
+               LSC_siguiente:\r
+         { accedo al almacenamiento por el nodo corriente }\r
+         LSC_Almac_Acceder( l, l.Corriente, n );\r
+                       \r
+         IF n.siguiente = LSC_Nulo\r
+                       THEN\r
+                               error := TRUE\r
+                       ELSE\r
+                               l.corriente := n.siguiente;\r
+               END;\r
+END;\r
+\r
+PROCEDURE LSC_borrar_cte( VAR l: LSC_Lista_Simple_C );\r
+VAR n : LSC_Nodo;\r
+    tmp : LSC_Nodo;\r
+    tmpp: LSC_Puntero;\r
+BEGIN\r
+   if l.corriente = l.primero then begin\r
+      LSC_Almac_Acceder( l.almac, l.primero, n );\r
+      l.primero := n.Sig;\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := l.primero;\r
+      end;\r
+   else begin\r
+      tmpp := l.primero;\r
+      LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+      while( tmp.sig <> l.corriente ) do begin\r
+         tmpp := tmp.sig;\r
+         LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+         end;\r
+      LSC_Almac_Acceder( l.almac, l.corriente, n );\r
+      tmp.sig := n.Sig;\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+      l.corriente := tmpp;\r
+      end;\r
+END;\r
+\r
+PROCEDURE LSC_insertar( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; e: Tipo_Elem );\r
+VAR\r
+       p : LSC_puntero;\r
+   n : LSC_Nodo;\r
+   np: LSC_Puntero;\r
+BEGIN\r
+       LSC_Almac_Reservar( l.almac, np );\r
+       n.Elem := e;\r
+       CASE m OF\r
+               LSC_primero:\r
+         n.sig := l.primero;\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+         l.primero := np;\r
+               LSC_siguiente:\r
+         LSC_Almac_Acceder( l.almac, l.corriente, ant );\r
+         n.sig := ant.sig;\r
+         ant.sig := np;\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+         LSC_Almac_Modificar( l.almac, l.corriente, ant );\r
+               END;\r
+\r
+       l.Corriente := np;\r
+\r
+END;\r
+\r
+PROCEDURE LSC_vaciar( VAR a: LSC_Lista_Simple_C );\r
+VAR np : LSC_Puntero;\r
+    n : LSC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> LSC_Nulo ) do begin\r
+      LSC_Almac_Acceder( l.almac, np, n );\r
+      LSC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := LSC_Nulo;\r
+   l.corriente := LSC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE LSC_copiar( a : LSC_Lista_Simple_C; VAR b : LSC_Lista_Simple_C );\r
+VAR np : LSC_Puntero;\r
+    n : LSC_Nodo;\r
+BEGIN\r
+   if a.primero = LSC_Nulo then return;\r
+   np := a.primero;\r
+   LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+   LSC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   b.corriente := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> LSC_Nulo ) do begin\r
+\r
+      LSC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      LSC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := LSC_Nulo;\r
+   LSC_Almac_Modificar( l.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/pila_c.pas b/listas_pilas_colas/pila_c.pas
new file mode 100644 (file)
index 0000000..02539b9
--- /dev/null
@@ -0,0 +1,224 @@
+unit pila_C;\r
+\r
+{\r
+       IMPLEMENTACION : pilas\r
+       ALMACENAMIENTO : CURSORES\r
+       \r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses tda_gral;\r
+\r
+{ maximo tamano del cursor }\r
+const COLA_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+       PILAC_puntero = integer;\r
+\r
+const\r
+   PILAC_nulo : PILAC_puntero = 0;\r
+\r
+type\r
+\r
+       PILAC_nodo = RECORD\r
+               Elem : Tipo_Elem;\r
+               Sig : PILAC_puntero;\r
+       END;\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+   PILAC_Almac = record\r
+      almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo;\r
+      siguientes     : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero;\r
+      primero_dispo  : TTDA_Puntero;\r
+   end;\r
+\r
+       \r
+   PILAC_Pila = RECORD\r
+               almac : PILAC_Almac;\r
+               primero: PILAC_puntero;\r
+       END;\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE PILAC_Inicializar( VAR l: PILAC_Pila );\r
+FUNCTION  PILAC_vacio( l: PILAC_Pila): BOOLEAN;\r
+FUNCTION  PILAC_lleno( l: PILAC_Pila): BOOLEAN;\r
+\r
+PROCEDURE PILAC_poner( VAR l: PILAC_Pila; e: Tipo_Elem );\r
+PROCEDURE PILAC_sacar( VAR l: PILAC_Pila; VAR e: Tipo_Elem);\r
+PROCEDURE PILAC_vaciar( VAR l: PILAC_Pila );\r
+PROCEDURE PILAC_copiar( l: PILAC_Pila; VAR b: PILAC_Pila );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac );\r
+var i : PILAC_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to PILAC_CURSOR_MAX - 1 do\r
+   begin\r
+      siguientes[i] := i + 1;\r
+   end;\r
+   siguientes[PILAC_CURSOR_MAX] := PILAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean;\r
+begin\r
+   PILAC_Almac_HayLugar := almac.primero_dispo = PILAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+begin\r
+   if not PILAC_Almac_HayLugar( almac )\r
+   then\r
+      puntero := PILAC_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.siguientes[ puntero ];\r
+   end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+begin\r
+   almac.siguientes[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := PILAC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure PILAC_Almac_Acceder( almac : TTDA_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE PILAC_Inicializar( VAR l: PILAC_Pila );\r
+BEGIN\r
+   PILAC_Almac_Inicializar( l.almac );\r
+   primero := PILAC_Nulo;\r
+END;\r
+\r
+FUNCTION PILAC_vacio( l: PILAC_Pila): BOOLEAN;\r
+BEGIN\r
+       PILAC_vacio := ( l.Primero = PILAC_Nulo);\r
+END;\r
+\r
+FUNCTION PILAC_lleno( l: PILAC_Pila): BOOLEAN;\r
+BEGIN\r
+       PILAC_lleno := not PILAC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE PILAC_poner( VAR l: PILAC_Pila; e: Tipo_Elem);\r
+VAR\r
+   n : PILAC_Nodo;\r
+   np: PILAC_Puntero;\r
+BEGIN\r
+       n.Elem := e;\r
+   n.sig := l.primero;\r
+       PILAC_Almac_Reservar( l.almac, np );\r
+   PILAC_Almac_Modificar( l.almac, np, n );\r
+   l.primero := np;\r
+END;\r
+\r
+{ pre: no esta vacia }\r
+PROCEDURE PILAC_sacar( l: PILAC_Pila; VAR e: Tipo_Elem);\r
+VAR n : PILAC_Nodo;\r
+    tmp : PILAC_Nodo;\r
+    tmpp: PILAC_Puntero;\r
+BEGIN\r
+   PILAC_Almac_Acceder( l.almac, l.primero, n );\r
+   PILAC_Almac_Liberar( l.almac, l.primero );\r
+   l.primero := n.Sig;\r
+\r
+   { y se lo asigno al parametro }\r
+   e := n.Elem;\r
+END;\r
+\r
+PROCEDURE PILAC_vaciar( VAR a: PILAC_Pila );\r
+VAR np : PILAC_Puntero;\r
+    n : PILAC_Nodo;\r
+BEGIN\r
+   np := l.primero;\r
+   while( np <> PILAC_Nulo ) do begin\r
+      PILAC_Almac_Acceder( l.almac, np, n );\r
+      PILAC_Almac_Liberar( l.almac, np );\r
+      np := n.sig;\r
+      end;\r
+   l.primero := PILAC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE PILAC_copiar( a : PILAC_Pila; VAR b : PILAC_Pila );\r
+VAR np : PILAC_Puntero;\r
+    n : PILAC_Nodo;\r
+BEGIN\r
+   if a.primero = PILAC_Nulo then return;\r
+   np := a.primero;\r
+   PILAC_Almac_Acceder( a.almac, np, n );\r
+\r
+   PILAC_Almac_Reservar( b.almac, mp );\r
+   b.primero := mp;\r
+   m.elem := n.elem;\r
+\r
+   while( n.sig <> PILAC_Nulo ) do begin\r
+\r
+      PILAC_Almac_Reservar( b.almac, tmpp );\r
+      m.sig := tmpp;\r
+      PILAC_Almac_Modificar( b.almac, mp, m );\r
+\r
+      np := n.sig;\r
+      PILAC_Almac_Acceder( a.almac, np, n );\r
+\r
+      mp := tmpp;\r
+      m.elem := n.elem;\r
+\r
+      end;\r
+   m.sig := PILAC_Nulo;\r
+   PILAC_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
diff --git a/listas_pilas_colas/tda_almac.pas b/listas_pilas_colas/tda_almac.pas
new file mode 100644 (file)
index 0000000..c2febea
--- /dev/null
@@ -0,0 +1,243 @@
+unit tda_almac;\r
+{\r
+   unidad basica de almacenamiento de elementos en los tipos de dato abstractos\r
+\r
+   en esta unidad pretendemos definir como se almacenan los elementos en las listas, pilas, etc...\r
+   vamos a definir una base sobre la cual ellas van a pedir y liberar elemntos.\r
+   esta base no es necesariamente general para todos los TDAs que se definan,\r
+   simplemente demuestra como se puede hacer una interface unica, y que luego se implemente de\r
+   distintas maneras, por ejemplo cursores, punteros, etc, sin cambiar la implementacion del tipo.\r
+}\r
+\r
+{\r
+   ACLARACION RESPECTO A LA INTERFASE\r
+   ++++++++++++++++++++++++++++++++++\r
+\r
+   por razones que no vienen al caso explicar en este comentario, se deben definir e implementar estas\r
+   primitivas para cada tipo que se vaya a usar, obviamente con nombres distintos.\r
+   Asi que vamos a definir como notacion poner un prefijo que indique el tipo que se esta refiriendo\r
+\r
+\r
+   ACLARACION 2\r
+   ============\r
+\r
+   este codigo no compila, porque su intencion es mostrar ambas interfases juntas, para cada implementacion\r
+   se debe codificar la que corresponda\r
+\r
+}\r
+\r
+interface\r
+\r
+uses tda_gral;\r
+\r
+{\r
+   esta es la interfase comun para el almacenamiento de elementos\r
+   usando esta interfase se pueden hacer todas lo necesario con los datos\r
+   y se puede implementar de la forma mas conveniente.\r
+   Vamos a implementar esta interfase con cursores y punteros,\r
+   ambas al mismo tiempo, asi se pueden ver las diferencias entre una y otra\r
+}\r
+const\r
+{ ================================================================= }\r
+{ para cursores debo definir primero cuanto es el tamano del cursor }\r
+TTDA_MAX_CURSOR = 100;\r
+\r
+\r
+type\r
+{ =================================== }\r
+{ defino el puntero de almacenamiento }\r
+\r
+{ CURSORES }\r
+TTDA_Puntero = int;\r
+\r
+{ PUNTEROS }\r
+TTDA_Puntero = ^TTDA_Nodo;\r
+\r
+\r
+const\r
+{ ======================================= }\r
+{ debemos definir un tipo de puntero nulo }\r
+\r
+{ CURSORES }\r
+TTDA_Nulo : TTDA_Puntero = 0;\r
+\r
+{ PUNTEROS }\r
+TTDA_Nulo : TTDA_Puntero = nil;\r
+\r
+\r
+type\r
+{ ====================================== }\r
+{ defino la estructura de almacenamiento }\r
+\r
+{ CURSORES }\r
+TTDA_Almac = record\r
+   almacenamiento : array [ 1 .. TTDA_MAX_CURSOR ] of TTDA_Nodo;\r
+   siguientes     : array [ 1 .. TTDA_MAX_CURSOR ] of TTDA_Puntero;\r
+   primero_dispo  : TTDA_Puntero;\r
+end;\r
+\r
+{ PUNTEROS }\r
+TTDA_Almac = record\r
+   { esta vacia porque logicamente esta administracion la hace el lenguaje }\r
+end;\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado  }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure TTDA_Almac_Inicializar( VAR almac : TTDA_Almac );\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces retorna TRUE y sino FALSE }\r
+function TTDA_Almac_HayLugar( almac : TTDA_Almac ): boolean;\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado  }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure TTDA_Almac_Reservar( VAR almac : TTDA_Almac; VAR puntero : TTDA_Puntero );\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure TTDA_Almac_Liberar( VAR almac : TTDA_Almac; VAR puntero : TTDA_Puntero );\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure TTDA_Almac_Acceder( almac : TTDA_Almac; puntero : TTDA_Puntero; VAR elemento : TTDA_Nodo );\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure TTDA_Almac_Modificar( VAR almac : TTDA_Almac; puntero : TTDA_Puntero; elemento : TTDA_Nodo );\r
+\r
+\r
+implementation\r
+\r
+{ CURSORES }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+procedure TTDA_Almac_Inicializar( VAR almac : TTDA_Almac );\r
+var i : TTDA_Puntero;\r
+begin\r
+   almac.primero_dispo := 1;\r
+   for i := 1 to TTDA_CURSOR_MAX - 1 do\r
+   begin\r
+      siguientes[i] := i + 1;\r
+   end;\r
+   siguientes[TTDA_CURSOR_MAX] := TTDA_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+function TTDA_Almac_HayLugar( almac : TTDA_Almac ): boolean;\r
+begin\r
+   TTDA_Almac_HayLugar := almac.primero_dispo = TTDA_Nulo;\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+procedure TTDA_Almac_Reservar( VAR almac : TTDA_Almac; VAR puntero : TTDA_Puntero );\r
+begin\r
+   if not TTDA_Almac_HayLugar( almac )\r
+   then\r
+      puntero := TTDA_Nulo\r
+   else begin\r
+      puntero := almac.primero_dispo;\r
+      almac.primero_dispo := almac.siguientes[ puntero ];\r
+   end;\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+procedure TTDA_Almac_Liberar( VAR almac : TTDA_Almac; VAR puntero : TTDA_Puntero );\r
+begin\r
+   almac.siguientes[ puntero ] := almac.primero_dispo;\r
+   almac.primero_dispo := puntero;\r
+   puntero := TTDA_Nulo;\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+procedure TTDA_Almac_Acceder( almac : TTDA_Almac; puntero : TTDA_Puntero; VAR elemento : TTDA_Nodo );\r
+begin\r
+   elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+procedure TTDA_Almac_Modificar( VAR almac : TTDA_Almac; puntero : TTDA_Puntero; elemento : TTDA_Nodo );\r
+begin\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ PUNTEROS }\r
+{ ========================================================================== }\r
+{  inicializar el almacenamiento }\r
+procedure TTDA_Almac_Inicializar( VAR almac : TTDA_Almac );\r
+begin\r
+end;\r
+\r
+{ ========================================================================== }\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+function TTDA_Almac_HayLugar( almac : TTDA_Almac ): boolean;\r
+begin\r
+   { aca habria que hacer alguna consulta a la memoria libre }\r
+   TTDA_Almac_HayLugar := true;\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+procedure TTDA_Almac_Reservar( VAR almac : TTDA_Almac; VAR puntero : TTDA_Puntero );\r
+begin\r
+   puntero := new( TTDA_Nodo );\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  liberar un elemento del almacenamiento }\r
+procedure TTDA_Almac_Liberar( VAR almac : TTDA_Almac; VAR puntero : TTDA_Puntero );\r
+begin\r
+   dispose( puntero );\r
+   puntero := TTDA_Nulo;\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+procedure TTDA_Almac_Acceder( almac : TTDA_Almac; puntero : TTDA_Puntero; VAR elemento : TTDA_Nodo );\r
+begin\r
+   elemento := puntero^;\r
+end;\r
+\r
+\r
+{ ========================================================================== }\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+procedure TTDA_Almac_Modificar( VAR almac : TTDA_Almac; puntero : TTDA_Puntero; elemento : TTDA_Nodo );\r
+begin\r
+   puntero^ := elemento;\r
+end;\r
+\r
+\r
+{ fin de la unidad }\r
+end.\r
diff --git a/listas_pilas_colas/tda_gral.pas b/listas_pilas_colas/tda_gral.pas
new file mode 100644 (file)
index 0000000..dadd909
--- /dev/null
@@ -0,0 +1,55 @@
+unit tda_gral;\r
+{ funciones y datos y tipo generales de los TDA de almacenamiento }\r
+\r
+interface\r
+\r
+{ aca se define el famoso tipo_elem }\r
+type\r
+    TipoDNI = 1000000..50000000;\r
+    Persona = record\r
+            DNI : TipoDNI;\r
+            Nombre : String;\r
+            Apellido : String;\r
+            end;\r
+\r
+    Tipo_Clave = TipoDNI;\r
+    Tipo_Elem = Persona;\r
+\r
+{ esta funcion devuelve la clave de un elemento almacenado }\r
+{ PRE : ninguna }\r
+{ POST: devuelve la clave de un elemento E }\r
+function Devolver_Clave_Elem( E: Tipo_Elem): Tipo_Clave;\r
+\r
+{ este procedimiento se usa en recorridos e imprime los datos del elemento }\r
+{ PRE : ninguna }\r
+{ POST: se imprimieron los datos  }\r
+procedure Procesar_Elem_Recorrido( var e: Tipo_Elem);\r
+\r
+{ compara dos elementos completos para ver si cumplen con el criterio o no }\r
+FUNCTION       Comparar_Elementos( a: Tipo_Elem; b: Tipo_Elem ): boolean;\r
+\r
+implementation\r
+\r
+{ esta funcion devuelve la clave de un elemento almacenado }\r
+function Devolver_Clave_Elem( E: Tipo_Elem): Tipo_Clave;\r
+begin\r
+      Devolver_Clave_Elem := E.DNI;\r
+end;\r
+\r
+{ este procedimiento se usa en recorridos e imprime los datos del elemento }\r
+procedure Procesar_Elem_Recorrido( var e: Tipo_Elem);\r
+BEGIN\r
+       \r
+END;\r
+\r
+{ compara dos elementos completos para ver si cumplen con el criterio o no }\r
+FUNCTION       Comparar_elementos( a: Tipo_Elem; b: Tipo_Elem ): boolean;\r
+BEGIN\r
+       IF a.DNI = b.DNI \r
+       THEN \r
+               Comparar_Elementos := true\r
+       ELSE \r
+               Comparar_Elementos := false;\r
+END;\r
+\r
+end.\r
diff --git a/tp_ejemplo/comandos.pas b/tp_ejemplo/comandos.pas
new file mode 100644 (file)
index 0000000..b526fe3
--- /dev/null
@@ -0,0 +1,69 @@
+program comandos;\r
+{\r
+        TRABAJO PRACTICO NUMERO 1\r
+        1er Cuatrimestre 2000\r
+        Este programa sirve para generar los archivos binarios de entrada\r
+        para el programa del TP nro 1, ya que en clase se acordo hacerlos\r
+        binarios. Hubiera sido mas comodo que fueran de texto, pero que le\r
+        vamos a hacer.\r
+        Parametros: archivo de salida\r
+\r
+}\r
+\r
+Type\r
+    T_registro_entrada = record\r
+                         Comando: string[2];\r
+                         DNI: string[8];\r
+                         Nombre: string[40];\r
+                         Movimiento: string[1];\r
+                         DNI_hasta: string[8];\r
+                        End;\r
+\r
+\r
+Var outfile: file of T_registro_entrada;\r
+    r: T_registro_entrada;\r
+\r
+begin\r
+\r
+   If paramcount >= 1 then begin\r
+     Writeln('Archivo de Salida :',ParamStr(1));\r
+\r
+     Assign(outfile, ParamStr(1));\r
+\r
+     Rewrite (outfile);\r
+\r
+   {  readln(r.comando);{, r.dni, r.nombre);}\r
+\r
+     while true do begin\r
+\r
+     write('COMANDO :');\r
+     readln(r.comando);\r
+     if r.comando = '' then exit;\r
+\r
+     write('DNI :');\r
+     readln(r.dni);\r
+     if r.dni = '' then r.dni := '*';\r
+\r
+     write('NOMBRE :');\r
+     readln(r.nombre);\r
+     if r.nombre = '' then r.nombre := '*';\r
+\r
+     write('MOVIMIENTO p/a/s/u:');\r
+     readln(r.movimiento);\r
+     if r.movimiento = '' then r.movimiento := '*';\r
+\r
+     write('DNI_HASTA :');\r
+     readln(r.dni_hasta);\r
+     if r.dni_hasta = '' then r.dni_hasta := '*';\r
+\r
+\r
+     write(outfile, r);\r
+\r
+     end;\r
+\r
+   end\r
+   else writeln ('Numero de parametros incorrecto. Uso comandos <archivo_de_salida>');\r
+\r
+\r
+end.\r
+\r
diff --git a/tp_ejemplo/ldoblec.pas b/tp_ejemplo/ldoblec.pas
new file mode 100644 (file)
index 0000000..a283f17
--- /dev/null
@@ -0,0 +1,757 @@
+unit ldoblec;\r
+\r
+\r
+\r
+{\r
+\r
+       IMPLEMENTACION : LISTAS DOBLEMENTE ENLAZADAS\r
+\r
+       ALMACENAMIENTO : CURSORES\r
+\r
+\r
+\r
+}\r
+\r
+\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+(*\r
+Este c¢digo esta basado en la implementacion de listas simples dada\r
+por la c tedra.\r
+*)\r
+\r
+interface\r
+\r
+\r
+\r
+{ usa las funciones generales de TDAs }\r
+\r
+uses tda_gral;\r
+\r
+\r
+\r
+{ maximo tamano del cursor }\r
+\r
+const LSC_MAX_CURSOR = 100;\r
+\r
+\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+\r
+TYPE\r
+\r
+       LSC_puntero = Integer;\r
+\r
+\r
+\r
+const\r
+\r
+   LSC_nulo : LSC_puntero = 0;\r
+\r
+\r
+\r
+type\r
+\r
+\r
+\r
+       LSC_nodo = RECORD\r
+\r
+               Elem : Tipo_Elem;   {definido en TDA_GRAL}\r
+\r
+                Sig,Ant : LSC_puntero;\r
+\r
+       END;\r
+\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+\r
+   LSC_Almac = record\r
+\r
+      almacenamiento : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Nodo;\r
+\r
+      siguientes     : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Puntero;\r
+\r
+      anteriores     : array [ 1 .. LSC_MAX_CURSOR ] of LSC_Puntero;\r
+\r
+      {decia: primero_dispo  : TTDA_Puntero;}\r
+      primero_dispo: LSC_puntero;\r
+\r
+   end;\r
+\r
+\r
+\r
+\r
+\r
+   LSC_Lista_Simple_C = RECORD\r
+\r
+               almac : LSC_Almac;\r
+\r
+               primero: LSC_puntero;\r
+\r
+                corriente : LSC_puntero;\r
+\r
+       END;\r
+\r
+\r
+\r
+       LSC_movimiento = (LSC_primero, LSC_ultimo, LSC_siguiente,LSC_anterior );\r
+\r
+\r
+\r
+\r
+\r
+{ ========= }\r
+\r
+{ INTERFACE }\r
+\r
+\r
+\r
+\r
+\r
+PROCEDURE LSC_Inicializar ( VAR l: LSC_Lista_Simple_C );\r
+\r
+FUNCTION  LSC_vacio( l: LSC_Lista_Simple_C): BOOLEAN;\r
+\r
+FUNCTION  LSC_lleno( l: LSC_Lista_Simple_C): BOOLEAN;\r
+\r
+\r
+\r
+PROCEDURE LSC_elem_cte ( l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+\r
+PROCEDURE LSC_modif_cte ( VAR l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+\r
+PROCEDURE LSC_mover_cte ( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; VAR error: BOOLEAN );\r
+\r
+PROCEDURE LSC_borrar_cte ( VAR l: LSC_Lista_Simple_C );\r
+\r
+PROCEDURE LSC_insertar ( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; var e: Tipo_Elem );\r
+\r
+PROCEDURE LSC_vaciar ( VAR l: LSC_Lista_Simple_C );\r
+\r
+PROCEDURE LSC_copiar ( a: LSC_Lista_Simple_C; VAR b: LSC_Lista_Simple_C );\r
+\r
+\r
+\r
+implementation\r
+\r
+\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+\r
+{ ========================================================================== }\r
+\r
+{  inicializar el almacenamiento }\r
+\r
+{ PRE : 'almac' no esta inicializado  }\r
+\r
+{ POST: 'almac' esta inicializado y vacio }\r
+\r
+procedure LSC_Almac_Inicializar( VAR almac : LSC_Almac );\r
+\r
+var i : LSC_Puntero;\r
+\r
+begin\r
+\r
+   almac.primero_dispo := 1;\r
+\r
+{   almac.anteriores[1] := LSC_Nulo;}\r
+\r
+   for i := 1 to LSC_MAX_CURSOR - 1 do\r
+\r
+   begin\r
+\r
+      almac.siguientes[i] := i + 1;\r
+{      almac.anteriores[i+1] := i;}\r
+\r
+   end;\r
+\r
+   almac.siguientes[LSC_MAX_CURSOR] := LSC_Nulo;\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+\r
+{ PRE : 'almac' esta inicializado  }\r
+\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+\r
+            entonces retorna TRUE y sino FALSE }\r
+{MODIFICACION: Retornaba false si NO habia lugar. Ademas el\r
+parametro ahora viene por referencia.}\r
+\r
+function LSC_Almac_HayLugar( var almac : LSC_Almac ): boolean;\r
+\r
+begin\r
+\r
+   LSC_Almac_HayLugar := NOT (almac.primero_dispo = LSC_Nulo);\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+\r
+{ PRE : 'almac' esta inicializado  }\r
+\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+\r
+procedure LSC_Almac_Reservar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+\r
+begin\r
+\r
+   if not LSC_Almac_HayLugar( almac )\r
+\r
+   then\r
+\r
+      puntero := LSC_Nulo\r
+\r
+   else begin\r
+\r
+      puntero := almac.primero_dispo;\r
+\r
+      almac.primero_dispo := almac.siguientes[ puntero ];\r
+\r
+   end;\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  liberar un elemento del almacenamiento }\r
+\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+\r
+procedure LSC_Almac_Liberar( VAR almac : LSC_Almac; VAR puntero : LSC_Puntero );\r
+\r
+begin\r
+\r
+   almac.siguientes[ puntero ] := almac.primero_dispo;\r
+\r
+   almac.primero_dispo := puntero;\r
+\r
+   puntero := LSC_Nulo;\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+\r
+procedure LSC_Almac_Acceder( almac : LSC_Almac; puntero : LSC_Puntero; VAR elemento : LSC_Nodo );\r
+\r
+begin\r
+\r
+   elemento := almac.almacenamiento[ puntero ];\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+\r
+procedure LSC_Almac_Modificar( VAR almac : LSC_Almac; puntero : LSC_Puntero; elemento : LSC_Nodo );\r
+\r
+begin\r
+\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+\r
+end;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+\r
+\r
+PROCEDURE LSC_Inicializar ( VAR l: LSC_Lista_Simple_C );\r
+\r
+BEGIN\r
+\r
+   LSC_Almac_Inicializar( l.almac );\r
+\r
+   l.primero := LSC_Nulo;\r
+\r
+   l.corriente := LSC_Nulo;\r
+\r
+END;\r
+\r
+\r
+\r
+FUNCTION LSC_vacio( l: LSC_Lista_Simple_C): BOOLEAN;\r
+\r
+BEGIN\r
+\r
+       LSC_vacio := ( l.Primero = LSC_Nulo);\r
+\r
+END;\r
+\r
+\r
+\r
+FUNCTION LSC_lleno( l: LSC_Lista_Simple_C): BOOLEAN;\r
+\r
+BEGIN\r
+\r
+       LSC_lleno := not LSC_Almac_HayLugar( l.almac );\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE LSC_elem_cte ( l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+\r
+var n : LSC_Nodo;\r
+\r
+BEGIN\r
+\r
+   { accedo al almacenamiento por el nodo corriente }\r
+\r
+   LSC_Almac_Acceder ( l.almac, l.Corriente, n );\r
+\r
+\r
+\r
+   { y se lo asigno al parametro }\r
+\r
+   e := n.Elem;\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE LSC_modif_cte ( VAR l: LSC_Lista_Simple_C; VAR e: Tipo_Elem);\r
+\r
+var n : LSC_Nodo;\r
+\r
+BEGIN\r
+\r
+   { accedo al almacenamiento por el nodo corriente }\r
+\r
+   LSC_Almac_Acceder ( l.almac, l.Corriente, n );\r
+\r
+\r
+\r
+   { y la asigno al parametro }\r
+\r
+   n.Elem := e;\r
+\r
+\r
+\r
+   { y modifico el almacenamiento }\r
+\r
+   LSC_Almac_Modificar ( l.almac, l.Corriente, n );\r
+\r
+\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE LSC_mover_cte ( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; VAR error: BOOLEAN );\r
+\r
+VAR n : LSC_Nodo; prueba: integer ;\r
+\r
+BEGIN\r
+\r
+       error := FALSE;\r
+\r
+       CASE m OF\r
+\r
+               LSC_primero:\r
+\r
+                       l.Corriente := l.Primero;\r
+\r
+               LSC_anterior:\r
+\r
+                  BEGIN\r
+                        { accedo al almacenamiento por el nodo corriente }\r
+\r
+                        LSC_Almac_Acceder ( l.almac, l.Corriente, n );\r
+\r
+\r
+\r
+                        {modificado, decia n.siguiente}\r
+                        IF n.ant = LSC_Nulo\r
+\r
+\r
+                       THEN\r
+\r
+                            error := TRUE\r
+\r
+                       ELSE\r
+\r
+                               l.corriente := n.ant;\r
+\r
+\r
+                  END; {BEGIN}\r
+\r
+               LSC_siguiente:\r
+                  BEGIN\r
+                        { accedo al almacenamiento por el nodo corriente }\r
+                             LSC_Almac_Acceder ( l.almac, l.Corriente, n );\r
+\r
+\r
+\r
+                             {modificado, decia n.siguiente}\r
+                             IF n.sig = LSC_Nulo\r
+\r
+\r
+                            THEN\r
+\r
+                                 error := TRUE\r
+\r
+                            ELSE\r
+\r
+{decia:                                l.corriente := n.siguiente;}\r
+                               l.corriente := n.sig;\r
+\r
+                  END; {BEGIN}\r
+\r
+                {Implementacion recursiva de mover al ultimo,para listas\r
+                doblemente enlazadas.}\r
+\r
+               LSC_ultimo:\r
+                  BEGIN\r
+                        { accedo al almacenamiento por el nodo corriente }\r
+\r
+\r
+                        LSC_mover_cte ( l, lsc_siguiente, error);\r
+\r
+                        IF error <> true then\r
+\r
+                            LSC_mover_cte ( l, lsc_ultimo, error);\r
+\r
+                        error:= false\r
+\r
+                  END; {BEGIN}\r
+\r
+               END;{CASE}\r
+\r
+END; {PROCEDURE}\r
+\r
+\r
+\r
+PROCEDURE LSC_borrar_cte ( VAR l: LSC_Lista_Simple_C );\r
+\r
+VAR n : LSC_Nodo;\r
+\r
+    tmp,tmp2 : LSC_Nodo;\r
+\r
+    tmpp : LSC_Puntero;\r
+\r
+BEGIN\r
+\r
+   if l.corriente = l.primero then begin\r
+\r
+      LSC_Almac_Acceder( l.almac, l.primero, n );\r
+\r
+      l.primero := n.Sig;\r
+\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+\r
+      l.corriente := l.primero;\r
+\r
+      {Asigno a l.primero^.ant un valor LSC_Nulo, en las siguientes 3 lineas}\r
+\r
+      LSC_Almac_Acceder( l.almac, l.primero, tmp );\r
+\r
+      tmp.ant:= LSC_Nulo;\r
+\r
+      LSC_Almac_Modificar( l.almac, l.primero, tmp );\r
+\r
+      end\r
+\r
+   else begin\r
+\r
+      tmpp := l.primero;\r
+\r
+      LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+\r
+      while( tmp.sig <> l.corriente ) do begin\r
+\r
+         tmpp := tmp.sig;\r
+\r
+         LSC_Almac_Acceder( l.almac, tmpp, tmp );\r
+\r
+         end;\r
+\r
+      LSC_Almac_Acceder( l.almac, l.corriente, n );\r
+\r
+      tmp.sig := n.Sig;\r
+\r
+      LSC_Almac_Modificar( l.almac, tmpp, tmp ); {creo que esto faltaba}\r
+\r
+      {Agregado: este IF  modifica el anterior del siguiente, siempre\r
+      que corriente no sea el ultimo}\r
+\r
+      IF n.sig <> LSC_Nulo THEN\r
+         BEGIN\r
+\r
+               LSC_Almac_Acceder( l.almac, n.sig, tmp2 );\r
+\r
+               tmp2.ant:= tmpp;\r
+\r
+               LSC_Almac_Modificar( l.almac, tmp.sig, tmp2 );\r
+         END;\r
+\r
+      LSC_Almac_Liberar( l.almac, l.corriente );\r
+\r
+      l.corriente := tmpp;\r
+\r
+      end;\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE LSC_insertar ( VAR l: LSC_Lista_Simple_C; m: LSC_movimiento; var e: Tipo_Elem );\r
+\r
+VAR\r
+\r
+   p : LSC_puntero;\r
+\r
+   n : LSC_Nodo;\r
+\r
+   ant,sig : LSC_Nodo;\r
+\r
+   np: LSC_Puntero;\r
+\r
+BEGIN\r
+\r
+        n.ant:= lsc_nulo;\r
+\r
+       LSC_Almac_Reservar( l.almac, np );\r
+\r
+       n.Elem := e;\r
+\r
+       CASE m OF\r
+\r
+               LSC_primero:\r
+\r
+                BEGIN\r
+\r
+         {Agregado: cambiar l.primero^.ant a el nuevo nodo}\r
+         IF l.primero <> LSC_NULO THEN\r
+         BEGIN\r
+              LSC_Almac_Acceder( l.almac, l.primero, ant );\r
+\r
+              ant.ant := np;\r
+\r
+              LSC_Almac_Modificar( l.almac, l.primero, ant );\r
+         END;\r
+\r
+         n.sig := l.primero;\r
+\r
+         LSC_Almac_Modificar ( l.almac, np, n );\r
+\r
+         l.primero := np;\r
+\r
+                END;\r
+\r
+        LSC_anterior:\r
+\r
+                BEGIN\r
+\r
+\r
+         LSC_Almac_Acceder( l.almac, l.corriente, sig );\r
+\r
+         n.sig := l.corriente;\r
+         n.ant := sig.ant;\r
+\r
+         sig.ant := np;\r
+\r
+\r
+         IF n.ant <> lsc_nulo then begin\r
+\r
+         LSC_Almac_Acceder( l.almac, n.ant, ant );\r
+\r
+         ant.sig := np;\r
+\r
+         LSC_Almac_Modificar( l.almac, n.ant, ant );\r
+\r
+         end;\r
+\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+\r
+         LSC_Almac_Modificar( l.almac, l.corriente, sig );\r
+\r
+         If l.corriente = L.primero then l.primero:= np;\r
+\r
+\r
+                END;{BEGIN}\r
+\r
+        LSC_siguiente:\r
+\r
+                BEGIN\r
+\r
+\r
+         LSC_Almac_Acceder( l.almac, l.corriente, ant );\r
+\r
+         n.sig := ant.sig;\r
+         n.ant := l.corriente;\r
+\r
+         ant.sig := np;\r
+\r
+         {Agregado: cambia n.sig^.ant a el nuevo nodo}\r
+\r
+         IF n.sig <> lsc_nulo then begin\r
+\r
+         LSC_Almac_Acceder( l.almac, n.sig, sig );\r
+\r
+         sig.ant := np;\r
+\r
+         LSC_Almac_Modificar( l.almac, n.sig, sig );\r
+\r
+         end;\r
+\r
+         LSC_Almac_Modificar( l.almac, np, n );\r
+\r
+         LSC_Almac_Modificar( l.almac, l.corriente, ant );\r
+\r
+\r
+\r
+                END;{BEGIN}\r
+               END;{CASE}\r
+\r
+\r
+\r
+       l.Corriente := np;\r
+\r
+\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE LSC_vaciar ( VAR l: LSC_Lista_Simple_C );\r
+\r
+VAR np : LSC_Puntero;\r
+\r
+    n : LSC_Nodo;\r
+\r
+BEGIN\r
+\r
+     LSC_Inicializar(l); {esta es otra forma de vaciar una lista, ya que la\r
+                         original no estoy seguro de que funciona}\r
+\r
+\r
+(*   np := l.primero;\r
+\r
+   while( np <> LSC_Nulo ) do begin\r
+\r
+      LSC_Almac_Acceder( l.almac, np, n );\r
+\r
+      LSC_Almac_Liberar( l.almac, np );\r
+\r
+      np := n.sig;\r
+\r
+      end;\r
+\r
+   l.primero := LSC_Nulo;\r
+\r
+   l.corriente := LSC_Nulo;\r
+*)\r
+\r
+END;\r
+\r
+\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+\r
+PROCEDURE LSC_copiar ( a : LSC_Lista_Simple_C; VAR b : LSC_Lista_Simple_C );\r
+\r
+VAR np,mp,tmpp : LSC_Puntero;\r
+\r
+    n,m : LSC_Nodo;\r
+\r
+BEGIN\r
+\r
+{   if a.primero = LSC_Nulo then return; {return no existe}\r
+\r
+   if a.primero = LSC_Nulo then exit;\r
+\r
+\r
+   np := a.primero;\r
+\r
+   LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+\r
+\r
+   LSC_Almac_Reservar( b.almac, mp );\r
+\r
+   b.primero := mp;\r
+\r
+   b.corriente := mp;\r
+\r
+   m.elem := n.elem;\r
+\r
+   m.ant := n.ant; {agregado para listas dobles}\r
+\r
+\r
+   while( n.sig <> LSC_Nulo ) do begin\r
+\r
+\r
+\r
+      LSC_Almac_Reservar( b.almac, tmpp );\r
+\r
+      m.sig := tmpp;\r
+\r
+      LSC_Almac_Modificar( b.almac, mp, m );\r
+\r
+\r
+      np := n.sig;\r
+\r
+      LSC_Almac_Acceder( a.almac, np, n );\r
+\r
+\r
+\r
+      mp := tmpp;\r
+\r
+      m.elem := n.elem;\r
+\r
+      m.ant:= n.ant\r
+\r
+\r
+      end;\r
+\r
+   m.sig := LSC_Nulo;\r
+\r
+   LSC_Almac_Modificar( b.almac, mp, m );\r
+\r
+END;\r
+\r
+\r
+\r
+end.\r
+\r
diff --git a/tp_ejemplo/leeme.txt b/tp_ejemplo/leeme.txt
new file mode 100644 (file)
index 0000000..58c607a
--- /dev/null
@@ -0,0 +1,22 @@
+El Programa primcipal es TP1.PAS\r
+\r
+Para generar un archivo de entrada se usa el Programa comandos. \r
+Los comandos introducidos deben estar en MAYUSCULAS.\r
+Se incluye en este disco un archivo de entrada llamado prueba,\r
+y el archivo outfile.txt, que fue generado por este. Los registros que\r
+se insertan al usar prueba tienen como clave letras en vez de numeros de\r
+dni, porque el campo es de caracteres y esto sirve para ver el resultado\r
+de la order OR (ordenar).\r
+\r
+Uso del programa:\r
+\r
+       TP1.exe <infile> <outfile>\r
+\r
+       Ejemplo: TP1 in.bin outfile.txt\r
+\r
+Uso de comandos:\r
+\r
+       comandos <file>\r
+       donde <file> es el nombre del archivo de entrada para TP1.exe\r
+       que será creado.\r
+\r
diff --git a/tp_ejemplo/outfile.txt b/tp_ejemplo/outfile.txt
new file mode 100644 (file)
index 0000000..030b9db
--- /dev/null
@@ -0,0 +1,100 @@
+Archivo de Entrada:prueba\r
+Archivo de Salida :outfile.txt\r
+\r
+\r
+>IN V MARIANO P *\r
+\r
+>IN L PEPE S *\r
+\r
+>IN K JUAN P *\r
+\r
+>IN B HERNAN U *\r
+\r
+>IN A PEDRO U *\r
+\r
+>LS * * * *\r
+ K - JUAN\r
+ V - MARIANO\r
+ L - PEPE\r
+ B - HERNAN\r
+ A - PEDRO\r
+\r
+>LC * * * *\r
+ A - PEDRO\r
+\r
+>IN F FEDERICO S *\r
+\r
+>LS * * * *\r
+ K - JUAN\r
+ V - MARIANO\r
+ L - PEPE\r
+ B - HERNAN\r
+ A - PEDRO\r
+ F - FEDERICO\r
+\r
+>LC * * * *\r
+ F - FEDERICO\r
+\r
+>OR * * * *\r
+\r
+>LC * * * *\r
+ F - FEDERICO\r
+\r
+>LS * * * *\r
+ A - PEDRO\r
+ B - HERNAN\r
+ F - FEDERICO\r
+ K - JUAN\r
+ L - PEPE\r
+ V - MARIANO\r
+\r
+>IO G GASTON * *\r
+\r
+>LC * * * *\r
+ G - GASTON\r
+\r
+>LS * * * *\r
+ A - PEDRO\r
+ B - HERNAN\r
+ F - FEDERICO\r
+ G - GASTON\r
+ K - JUAN\r
+ L - PEPE\r
+ V - MARIANO\r
+\r
+>MO T TOMAS * *\r
+\r
+>LC * * * *\r
+ T - TOMAS\r
+\r
+>LS * * * *\r
+ A - PEDRO\r
+ B - HERNAN\r
+ F - FEDERICO\r
+ G - GASTON\r
+ K - JUAN\r
+ L - PEPE\r
+ T - TOMAS\r
+\r
+>OR * * * *\r
+\r
+>LC * * * *\r
+ T - TOMAS\r
+\r
+>BO * * * *\r
+\r
+>LS * * * *\r
+ A - PEDRO\r
+ B - HERNAN\r
+ F - FEDERICO\r
+ G - GASTON\r
+ K - JUAN\r
+ L - PEPE\r
+\r
+>LC * * * *\r
+ L - PEPE\r
+\r
+>LI * * * *\r
+\r
+>LS * * * *\r
+TABLA VACIA\r
diff --git a/tp_ejemplo/pila_c.pas b/tp_ejemplo/pila_c.pas
new file mode 100644 (file)
index 0000000..1a9dbd9
--- /dev/null
@@ -0,0 +1,450 @@
+unit pila_C;\r
+\r
+\r
+\r
+{\r
+\r
+       IMPLEMENTACION : pilas\r
+\r
+       ALMACENAMIENTO : CURSORES\r
+\r
+        MODIFICADO PARA QUE COMPILE, y un par de errores que tenia (estan marcados)\r
+\r
+}\r
+\r
+\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+\r
+interface\r
+\r
+\r
+\r
+{ usa las funciones generales de TDAs }\r
+\r
+uses tda_gral;\r
+\r
+\r
+\r
+{ maximo tamano del cursor }\r
+\r
+const PILAC_MAX_CURSOR = 100;\r
+\r
+\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+\r
+TYPE\r
+\r
+       PILAC_puntero = integer;\r
+\r
+\r
+\r
+const\r
+\r
+   PILAC_nulo : PILAC_puntero = 0;\r
+\r
+\r
+\r
+type\r
+\r
+\r
+\r
+       PILAC_nodo = RECORD\r
+\r
+               Elem : Tipo_Elem;\r
+\r
+               Sig : PILAC_puntero;\r
+\r
+       END;\r
+\r
+\r
+\r
+\r
+\r
+   { ahora le toca definir el cursor }\r
+\r
+   PILAC_Almac = record\r
+\r
+      almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo;\r
+\r
+      siguientes     : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero;\r
+\r
+      primero_dispo  : PILAC_puntero;\r
+\r
+   end;\r
+\r
+\r
+\r
+\r
+\r
+   PILAC_Pila = RECORD\r
+\r
+               almac : PILAC_Almac;\r
+\r
+               primero: PILAC_puntero;\r
+\r
+       END;\r
+\r
+\r
+\r
+\r
+\r
+{ ========= }\r
+\r
+{ INTERFASE }\r
+\r
+\r
+\r
+\r
+\r
+PROCEDURE PILAC_Inicializar ( VAR l: PILAC_Pila );\r
+\r
+FUNCTION  PILAC_vacio( l: PILAC_Pila): BOOLEAN;\r
+\r
+FUNCTION  PILAC_lleno( l: PILAC_Pila): BOOLEAN;\r
+\r
+\r
+\r
+PROCEDURE PILAC_poner ( VAR l: PILAC_Pila; VAR e: Tipo_Elem );\r
+\r
+PROCEDURE PILAC_sacar ( VAR l: PILAC_Pila; VAR e: Tipo_Elem);\r
+\r
+PROCEDURE PILAC_vaciar ( VAR l: PILAC_Pila );\r
+\r
+PROCEDURE PILAC_copiar ( a: PILAC_Pila; VAR b: PILAC_Pila );\r
+\r
+\r
+\r
+implementation\r
+\r
+\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+\r
+{ ========================================================================== }\r
+\r
+{  inicializar el almacenamiento }\r
+\r
+{ PRE : 'almac' no esta inicializado  }\r
+\r
+{ POST: 'almac' esta inicializado y vacio }\r
+\r
+procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac );\r
+\r
+var i : PILAC_Puntero;\r
+\r
+begin\r
+\r
+   almac.primero_dispo := 1;\r
+\r
+   for i := 1 to PILAC_MAX_CURSOR - 1 do\r
+\r
+   begin\r
+\r
+      almac.siguientes[i] := i + 1;\r
+\r
+   end;\r
+\r
+   almac.siguientes[PILAC_MAX_CURSOR] := PILAC_Nulo;\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+\r
+{ PRE : 'almac' esta inicializado  }\r
+\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+\r
+            entonces retorna TRUE y sino FALSE }\r
+{ANDABA AL REVES, CORREGIDO}\r
+\r
+\r
+function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean;\r
+\r
+begin\r
+\r
+   PILAC_Almac_HayLugar := NOT (almac.primero_dispo = PILAC_Nulo);\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  el pedido de un nuevo elemento al almacenamiento }\r
+\r
+{ PRE : 'almac' esta inicializado  }\r
+\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r
+\r
+procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+\r
+begin\r
+\r
+   if not PILAC_Almac_HayLugar( almac )\r
+\r
+   then\r
+\r
+      puntero := PILAC_Nulo\r
+\r
+   else begin\r
+\r
+      puntero := almac.primero_dispo;\r
+\r
+      almac.primero_dispo := almac.siguientes[ puntero ];\r
+\r
+   end;\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  liberar un elemento del almacenamiento }\r
+\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+\r
+procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+\r
+begin\r
+\r
+   almac.siguientes[ puntero ] := almac.primero_dispo;\r
+\r
+   almac.primero_dispo := puntero;\r
+\r
+   puntero := PILAC_Nulo;\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r
+\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r
+\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+\r
+procedure PILAC_Almac_Acceder( almac : PilaC_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo );\r
+\r
+begin\r
+\r
+   elemento := almac.almacenamiento[ puntero ];\r
+\r
+end;\r
+\r
+\r
+\r
+{ ========================================================================== }\r
+\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r
+\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+\r
+procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo );\r
+\r
+begin\r
+\r
+   almac.almacenamiento[ puntero ] := elemento;\r
+\r
+end;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+\r
+\r
+PROCEDURE PILAC_Inicializar ( VAR l: PILAC_Pila );\r
+\r
+BEGIN\r
+\r
+   PILAC_Almac_Inicializar( l.almac );\r
+\r
+   l.primero := PILAC_Nulo;\r
+\r
+END;\r
+\r
+\r
+\r
+FUNCTION PILAC_vacio( l: PILAC_Pila): BOOLEAN;\r
+\r
+BEGIN\r
+\r
+       PILAC_vacio := ( l.Primero = PILAC_Nulo);\r
+\r
+END;\r
+\r
+\r
+\r
+FUNCTION PILAC_lleno( l: PILAC_Pila): BOOLEAN;\r
+\r
+BEGIN\r
+\r
+       PILAC_lleno := not PILAC_Almac_HayLugar( l.almac );\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE PILAC_poner ( VAR l: PILAC_Pila; var e: Tipo_Elem);\r
+\r
+VAR\r
+\r
+   n : PILAC_Nodo;\r
+\r
+   np: PILAC_Puntero;\r
+\r
+BEGIN\r
+\r
+       n.Elem := e;\r
+\r
+   n.sig := l.primero;\r
+\r
+       PILAC_Almac_Reservar( l.almac, np );\r
+\r
+   PILAC_Almac_Modificar( l.almac, np, n );\r
+\r
+   l.primero := np;\r
+\r
+END;\r
+\r
+\r
+\r
+{ pre: no esta vacia }\r
+\r
+PROCEDURE PILAC_sacar ( VAR l: PILAC_Pila; VAR e: Tipo_Elem);\r
+\r
+VAR n : PILAC_Nodo;\r
+\r
+    tmp : PILAC_Nodo;\r
+\r
+    tmpp: PILAC_Puntero;\r
+\r
+BEGIN\r
+\r
+   PILAC_Almac_Acceder( l.almac, l.primero, n );\r
+\r
+   PILAC_Almac_Liberar( l.almac, l.primero );\r
+\r
+   l.primero := n.Sig;\r
+\r
+\r
+\r
+   { y se lo asigno al parametro }\r
+\r
+   e := n.Elem;\r
+\r
+END;\r
+\r
+\r
+\r
+PROCEDURE PILAC_vaciar ( VAR l: PILAC_Pila );\r
+\r
+VAR np : PILAC_Puntero;\r
+\r
+    n : PILAC_Nodo;\r
+\r
+BEGIN\r
+\r
+   np := l.primero;\r
+\r
+   while( np <> PILAC_Nulo ) do begin\r
+\r
+      PILAC_Almac_Acceder( l.almac, np, n );\r
+\r
+      PILAC_Almac_Liberar( l.almac, np );\r
+\r
+      np := n.sig;\r
+\r
+      end;\r
+\r
+   l.primero := PILAC_Nulo;\r
+\r
+END;\r
+\r
+\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+\r
+PROCEDURE PILAC_copiar ( a : PILAC_Pila; VAR b : PILAC_Pila );\r
+\r
+VAR np, mp, tmpp : PILAC_Puntero;\r
+\r
+    n,m : PILAC_Nodo;\r
+\r
+BEGIN\r
+\r
+   if a.primero = PILAC_Nulo then exit;\r
+\r
+   np := a.primero;\r
+\r
+   PILAC_Almac_Acceder( a.almac, np, n );\r
+\r
+\r
+\r
+   PILAC_Almac_Reservar( b.almac, mp );\r
+\r
+   b.primero := mp;\r
+\r
+   m.elem := n.elem;\r
+\r
+\r
+\r
+   while( n.sig <> PILAC_Nulo ) do begin\r
+\r
+\r
+\r
+      PILAC_Almac_Reservar( b.almac, tmpp );\r
+\r
+      m.sig := tmpp;\r
+\r
+      PILAC_Almac_Modificar( b.almac, mp, m );\r
+\r
+\r
+\r
+      np := n.sig;\r
+\r
+      PILAC_Almac_Acceder( a.almac, np, n );\r
+\r
+\r
+\r
+      mp := tmpp;\r
+\r
+      m.elem := n.elem;\r
+\r
+\r
+\r
+      end;\r
+\r
+   m.sig := PILAC_Nulo;\r
+\r
+   PILAC_Almac_Modificar( b.almac, mp, m );\r
+\r
+END;\r
+\r
+\r
+\r
+end.\r
+\r
diff --git a/tp_ejemplo/prueba b/tp_ejemplo/prueba
new file mode 100644 (file)
index 0000000..d791870
Binary files /dev/null and b/tp_ejemplo/prueba differ
diff --git a/tp_ejemplo/tabla.pas b/tp_ejemplo/tabla.pas
new file mode 100644 (file)
index 0000000..ef19efa
--- /dev/null
@@ -0,0 +1,377 @@
+unit tabla;\r
+\r
+\r
+\r
+{\r
+\r
+       IMPLEMENTACION : TDA_TABLA\r
+\r
+\r
+}\r
+{\r
+POR AHORA COMPILA\r
+}\r
+\r
+interface\r
+\r
+uses TDA_GRAL, ldoblec, pila_C;\r
+\r
+TYPE\r
+\r
+    T_MOVIM = LSC_movimiento;\r
+\r
+    T_CLAVE = Tipo_Clave;\r
+\r
+    T_REGISTRO = Tipo_Elem;\r
+\r
+    T_TABLA = record\r
+\r
+            lista : LSC_Lista_Simple_C; {si bien el nombre dice simple, es una lista doble\r
+                                        no lo cambie aun para evitar mas errores}\r
+            ordenada: boolean;\r
+\r
+    end; {record}\r
+\r
+\r
+\r
+Procedure T_TABLA_Crear ( var T: T_TABLA);\r
+\r
+Function  T_TABLA_Vacia ( T: T_TABLA ) : boolean;\r
+\r
+Function  T_TABLA_Llena ( T: T_TABLA ) : boolean;\r
+\r
+Function  T_TABLA_Ordenada ( T: T_TABLA ) : boolean;\r
+\r
+Procedure T_TABLA_Elem_Cte ( T: T_TABLA ; var R: T_REGISTRO );\r
+\r
+Procedure T_TABLA_Mover_Cte ( var T: T_TABLA ; M: T_MOVIM; var error: boolean );\r
+\r
+Procedure T_TABLA_Insertar ( var T: T_TABLA ; var R: T_REGISTRO; M: T_MOVIM );\r
+\r
+Procedure T_TABLA_Insertar_O ( var T: T_TABLA ; var R: T_REGISTRO);\r
+\r
+Procedure T_TABLA_Limpiar ( var T: T_TABLA );\r
+\r
+Procedure T_TABLA_Borrar_Cte ( var T: T_TABLA );\r
+\r
+Procedure T_TABLA_Modif_Cte ( var T: T_TABLA ; var R: T_REGISTRO );\r
+\r
+Procedure T_TABLA_Ordenar ( var T: T_TABLA );\r
+\r
+Procedure T_TABLA_Buscar_Clave ( var T: T_TABLA ; C: T_CLAVE; var error :boolean);\r
+\r
+PROCEDURE Buscar_por_Rango(var T: T_TABLA; D, H: T_CLAVE; var L: PILAC_Pila);\r
+\r
+{-------------------------------------}\r
+IMPLEMENTATION\r
+\r
+\r
+Procedure T_TABLA_Crear ( var T: T_TABLA);\r
+{\r
+         PRE   :T nunca fue creada.\r
+         POST: T creada y vac¡a.\r
+}\r
+\r
+BEGIN\r
+\r
+     LSC_Inicializar ( t.lista );\r
+\r
+     {una lista vacia esta ordenada}\r
+     t.ordenada := true;\r
+\r
+END;\r
+Function T_TABLA_Vacia ( T: T_TABLA ) : boolean;\r
+{\r
+        PRE   :T creada.\r
+        POST: Si T tiene elementos, entonces es FALSE, sino es TRUE.\r
+}\r
+BEGIN\r
+\r
+     T_TABLA_Vacia := LSC_vacio( t.lista );\r
+\r
+END;\r
+\r
+\r
+Function T_TABLA_Llena ( T: T_TABLA ) : boolean;\r
+{\r
+         PRE   :T creada.\r
+         POST: Si T tiene lugar para insertar nuevos elementos, entonces es FALSE, sino es TRUE.\r
+}\r
+BEGIN\r
+\r
+     T_TABLA_Llena := LSC_lleno( t.lista );\r
+\r
+END;\r
+\r
+Function T_TABLA_Ordenada ( T: T_TABLA ) : boolean;\r
+{\r
+         PRE   :T no vac¡a.\r
+         POST: Si T est  ordenada, entonces es verdadero, sino es falso.\r
+}\r
+\r
+BEGIN\r
+\r
+     T_TABLA_Ordenada:= t.ordenada;\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Elem_Cte ( T: T_TABLA ; var R: T_REGISTRO );\r
+{\r
+          PRE   :T no vac¡a.\r
+          POST: R contiene el registro corriente.\r
+}\r
+\r
+BEGIN\r
+\r
+     LSC_elem_cte ( t.lista, r);\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Mover_Cte ( var T: T_TABLA ; M: T_MOVIM; var error: boolean );\r
+{\r
+          PRE   :T no vac¡a.\r
+          POST: Si M = primero, el nuevo corriente es el primer registro y error es falso.\r
+                Si M = ultimo, el nuevo corriente es el £ltimo registro y error es falso.\r
+                Si M = siguiente, el nuevo corriente es el siguiente registro del actual\r
+                corriente y error es falso. Si el corriente era el £ltimo registro, entonces\r
+                error es verdadero y el corriente sigue siendo el £ltimo registro.\r
+                Si M = anterior, el nuevo corriente es el anterior registro del actual\r
+                corriente y error es falso. Si el corriente era el primer registro, entonces\r
+                error es verdadero y el corriente sigue siendo el primer registro.\r
+\r
+                (Los valores para M son de tipo t_movim)\r
+}\r
+\r
+BEGIN\r
+\r
+LSC_mover_cte ( t.lista, m, error );\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Insertar ( var T: T_TABLA ; var R: T_REGISTRO; M: T_MOVIM );\r
+{\r
+          PRE   : T no est  llena.\r
+          POST: Si M = primero, R se agreg¢, es el primer registro y el nuevo corriente.\r
+                Si M = ultimo, R se agreg¢, es el £ltimo registro y el nuevo corriente.\r
+                Si M = siguiente, R se agreg¢, es el siguiente registro del corriente, y es el nuevo corriente\r
+                Si M = anterior, R se agreg¢, es el anterior registro del corriente, y es el nuevo corriente.\r
+\r
+                Para no complicar mas la implementacion de la lista doble,\r
+                el insertar al final esta implementado aca\r
+}\r
+\r
+VAR error: boolean;\r
+\r
+BEGIN\r
+\r
+     IF m = LSC_ULTIMO then begin\r
+\r
+        LSC_mover_cte ( t.lista, m, error );\r
+\r
+        {insertar al final no es mas que insertar despues de el ultimo:}\r
+        m:= LSC_siguiente\r
+\r
+        end;\r
+\r
+     LSC_insertar ( t.lista, m, r);\r
+\r
+     t.ordenada:= false\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Insertar_O ( var T: T_TABLA ; var R: T_REGISTRO);\r
+\r
+VAR error: boolean;\r
+    e: t_registro;\r
+\r
+BEGIN\r
+\r
+     IF t.ordenada = true then begin\r
+\r
+        T_TABLA_Buscar_Clave(t, r.dni, error); {no importa si lo encuentra o no}\r
+\r
+        T_TABLA_Elem_Cte( t, e);\r
+\r
+        IF e.dni > r.dni then\r
+           T_TABLA_INSERTAR(t, r, lsc_anterior)\r
+        ELSE\r
+           T_TABLA_INSERTAR(t, r, lsc_siguiente);\r
+{*1*}\r
+\r
+        t.ordenada:= true {insertar lo deja en false}\r
+     END;\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Limpiar ( var T: T_TABLA );\r
+{         PRE   : T creada.\r
+          POST:  T vac¡a.\r
+}\r
+\r
+\r
+BEGIN\r
+\r
+     LSC_vaciar (t.lista);\r
+     t.ordenada:= true;\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Borrar_Cte ( var T: T_TABLA );\r
+{\r
+          PRE   : T no vac¡a.\r
+          POST:  Se elimin¢ el registro corriente.\r
+          El nuevo registro corriente es el siguiente del borrado, si el borrado\r
+          era el £ltimo, entonces el nuevo corriente es el primero.\r
+}\r
+\r
+BEGIN\r
+\r
+     LSC_borrar_cte ( t.lista );\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Modif_Cte ( var T: T_TABLA ; var R: T_REGISTRO );\r
+{\r
+          PRE   : T no vac¡a.\r
+          POST:  El contenido del actual corriente fue actualizado con R.\r
+          Si T estaba ordenada y no se modificaron los datos de la clave del\r
+          corriente, entonces T sigue ordenada. Si T estaba ordenada y se\r
+          modificaron los datos de la clave del corriente, entonces si la\r
+          nueva clave rompe el orden de T, T no est  m s ordenada.\r
+}\r
+VAR e: T_REGISTRO;\r
+\r
+BEGIN\r
+\r
+     T_TABLA_Elem_Cte (t, e);\r
+\r
+     if Devolver_Clave_Elem( e ) <> Devolver_Clave_Elem( r ) then\r
+        t.ordenada:= false;\r
+\r
+     LSC_modif_cte (t.lista, r);\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Ordenar ( var T: T_TABLA );\r
+{\r
+          PRE   : T no vac¡a.\r
+          POST:  T se encuentra ordenada por la clave de sus registros.\r
+}\r
+VAR t_aux: T_TABLA;\r
+\r
+    e: T_REGISTRO;\r
+\r
+    error: boolean;\r
+\r
+BEGIN\r
+\r
+      error:= false;\r
+\r
+      T_TABLA_Crear( t_aux);\r
+\r
+      LSC_COPIAR(t.lista, t_aux.lista);\r
+\r
+      T_TABLA_Limpiar(t);\r
+\r
+(*      {tengo que mover en corriente al primero porque esta en nulo (0)}\r
+      T_TABLA_Mover_Cte ( t, lsc_primero, error );\r
+Era un bolazo\r
+*)\r
+\r
+      T_TABLA_Elem_cte(t_aux, e);\r
+\r
+      T_TABLA_Insertar (t, e, lsc_primero);\r
+\r
+      T_TABLA_Mover_Cte ( t_aux, lsc_siguiente, error );\r
+\r
+      t.ordenada:= true; {si tiene un solo elemento no veo porque no}\r
+\r
+      while error <> true do begin\r
+\r
+          T_TABLA_Elem_cte(t_aux, e);\r
+\r
+          T_TABLA_Insertar_O (t, e);\r
+\r
+          T_TABLA_Mover_Cte ( t_aux, lsc_siguiente, error );\r
+\r
+      end;\r
+\r
+      t.ordenada:= true;\r
+\r
+END;\r
+\r
+Procedure T_TABLA_Buscar_Clave ( var T: T_TABLA ; C: T_CLAVE; var error :boolean);\r
+{\r
+          PRE   : T no vac¡a.\r
+          POST: Si C es una clave que existe en T, entonces el nuevo corriente es el\r
+          registro con clave C y error es falso, sino error es verdadero y\r
+          el corriente es el registro donde termino la busqueda (modificacion\r
+          hecha para facilitar la operacion insertar ordenado).\r
+}\r
+VAR e: T_REGISTRO;\r
+\r
+BEGIN\r
+\r
+  error:= false;\r
+\r
+{  IF not T_TABLA_Vacia(t) then begin\r
+}\r
+     T_TABLA_Mover_Cte ( t, lsc_primero, error );\r
+\r
+     T_TABLA_Elem_cte(t, e);\r
+\r
+     While (e.DNI < c ) AND not error do begin\r
+\r
+          T_TABLA_Mover_Cte ( t, lsc_siguiente, error );\r
+\r
+          T_TABLA_Elem_cte(t, e);\r
+\r
+     END;\r
+\r
+     IF e.dni <> c then error := true;\r
+\r
+{  END\r
+     ELSE error:= true;\r
+}\r
+END;\r
+\r
+PROCEDURE Buscar_por_Rango(var T: T_TABLA; D, H: T_CLAVE; var L: PILAC_Pila);\r
+{\r
+        BUSCA LOS REGISTROS COMPRENDIDOS ENTRE LAS CLAVES D y H\r
+        Y LOS ALMACENA EN LA PILA L.\r
+}\r
+VAR\r
+   error: boolean;\r
+   e: T_REGISTRO;\r
+\r
+BEGIN\r
+    error:= false;\r
+\r
+    T_TABLA_Buscar_Clave(t,d,error);\r
+\r
+{    if error = false then begin}\r
+\r
+          T_TABLA_Elem_cte(t, e);\r
+\r
+          PILAC_poner ( l,e );\r
+\r
+          T_TABLA_Mover_Cte ( t, lsc_siguiente, error );\r
+\r
+          T_TABLA_Elem_cte(t, e);\r
+\r
+\r
+          While (e.DNI <= h ) AND (error = false) do begin\r
+\r
+                PILAC_poner ( l,e );\r
+\r
+                T_TABLA_Mover_Cte ( t, lsc_siguiente, error );\r
+\r
+                T_TABLA_Elem_cte(t, e);\r
+\r
+          END; {WHILE}\r
+\r
+{    END; {IF}\r
+\r
+END;\r
+\r
+END.
\ No newline at end of file
diff --git a/tp_ejemplo/tda_gral.pas b/tp_ejemplo/tda_gral.pas
new file mode 100644 (file)
index 0000000..06f4886
--- /dev/null
@@ -0,0 +1,115 @@
+unit tda_gral;\r
+\r
+{ funciones y datos y tipo generales de los TDA de almacenamiento\r
+  Basado en el codigo de la catedra, modificado para que compile.\r
+  Los tipos de datos de los elementos de Persona fueron reemplazados\r
+  por los que se usan en el TP.\r
+}\r
+\r
+\r
+\r
+interface\r
+\r
+\r
+\r
+{ aca se define el famoso tipo_elem }\r
+\r
+type\r
+\r
+    TipoDNI = string[8];\r
+\r
+    Persona = record\r
+\r
+            DNI : TipoDNI;\r
+\r
+            Nombre : string[40];\r
+\r
+{Apellido no es necesario para el TP}\r
+{            Apellido : ShortString; }\r
+\r
+            end;\r
+\r
+\r
+\r
+    Tipo_Clave = TipoDNI;\r
+\r
+    Tipo_Elem = Persona;\r
+\r
+\r
+\r
+{ esta funcion devuelve la clave de un elemento almacenado }\r
+\r
+{ PRE : ninguna }\r
+\r
+{ POST: devuelve la clave de un elemento E }\r
+\r
+function Devolver_Clave_Elem( E: Tipo_Elem): Tipo_Clave;\r
+\r
+\r
+\r
+{ este procedimiento se usa en recorridos e imprime los datos del elemento }\r
+\r
+{ PRE : ninguna }\r
+\r
+{ POST: se imprimieron los datos  }\r
+\r
+procedure Procesar_Elem_Recorrido ( var e: Tipo_Elem);\r
+\r
+\r
+\r
+{ compara dos elementos completos para ver si cumplen con el criterio o no }\r
+\r
+FUNCTION       Comparar_Elementos( a: Tipo_Elem; b: Tipo_Elem ): boolean;\r
+\r
+\r
+\r
+implementation\r
+\r
+\r
+\r
+{ esta funcion devuelve la clave de un elemento almacenado }\r
+\r
+function Devolver_Clave_Elem( E: Tipo_Elem): Tipo_Clave;\r
+\r
+begin\r
+\r
+     Devolver_Clave_Elem := E.DNI;\r
+\r
+end;\r
+\r
+\r
+\r
+{ este procedimiento se usa en recorridos e imprime los datos del elemento }\r
+\r
+procedure Procesar_Elem_Recorrido ( var e: Tipo_Elem);\r
+\r
+BEGIN\r
+\r
+\r
+\r
+END;\r
+\r
+\r
+\r
+{ compara dos elementos completos para ver si cumplen con el criterio o no }\r
+\r
+FUNCTION       Comparar_elementos( a: Tipo_Elem; b: Tipo_Elem ): boolean;\r
+\r
+BEGIN\r
+\r
+       IF a.DNI = b.DNI\r
+\r
+       THEN\r
+\r
+               Comparar_Elementos := true\r
+\r
+       ELSE \r
+\r
+               Comparar_Elementos := false;\r
+\r
+END;\r
+\r
+\r
+\r
+end.\r
+\r
diff --git a/tp_ejemplo/tp1.pas b/tp_ejemplo/tp1.pas
new file mode 100644 (file)
index 0000000..eaa9697
--- /dev/null
@@ -0,0 +1,195 @@
+program tp1;\r
+{\r
+        TRABAJO PRACTICO NUMERO 1\r
+        1er Cuatrimestre 2000\r
+\r
+}\r
+\r
+uses TDA_GRAL, ldoblec, tabla, pila_C, crt;\r
+\r
+Type\r
+    T_registro_entrada = record\r
+                         Comando: string[2];\r
+                         DNI: string[8];\r
+                         Nombre: string[40];\r
+                         Movimiento: string[1];\r
+                         DNI_hasta: string[8];\r
+                        End;\r
+    comando = ( OTRO, INS, IO, ORD, BC, BR, LS, LC, BO, MO, LI);\r
+\r
+\r
+Var mitabla: T_TABLA;\r
+    pila: PILAC_Pila;\r
+    infile: file of T_registro_entrada;\r
+    cmd: comando;\r
+    mov: t_movim;\r
+    o: text;\r
+    r: T_registro_entrada;\r
+    e: t_registro;\r
+    error: boolean;\r
+    aux: string;\r
+\r
+\r
+{------- Aca empieza el programa -------}\r
+\r
+begin\r
+\r
+     WriteLn;\r
+     Writeln('Archivo de Entrada:', ParamStr(1));\r
+     Writeln('Archivo de Salida :', ParamStr(2));\r
+\r
+     Assign(infile, ParamStr(1));\r
+     Reset (infile);\r
+\r
+     Assign(o, ParamStr(2));\r
+     rewrite (o);\r
+\r
+     Writeln(o,'Archivo de Entrada:', ParamStr(1));\r
+     Writeln(o,'Archivo de Salida :', ParamStr(2));\r
+     Writeln(o);\r
+\r
+     T_TABLA_Crear(mitabla);\r
+     PILAC_Inicializar (pila);\r
+\r
+  while not eof(infile) do begin\r
+\r
+     read(infile, r);\r
+\r
+{     r.comando:= UpCase (r.comando);}\r
+\r
+     writeln(o);\r
+     write(o,'>',r.comando);\r
+     write(o,' ',r.dni);\r
+     write(o,' ',r.nombre);\r
+     write(o,' ',r.movimiento);\r
+     write(o,' ',r.dni_hasta);\r
+     writeln(o);\r
+\r
+     e.dni:= r.dni;\r
+     e.nombre:= r.nombre;\r
+\r
+{Estos bloques son para interpretar los strings y ponerlos en un enumerado}\r
+\r
+     IF r.comando = 'IN' then cmd:= INS\r
+     ELSE IF r.comando = 'IO' then cmd:= IO\r
+     ELSE IF r.comando = 'OR' then cmd:= ORD\r
+     ELSE IF r.comando = 'BC' then cmd:= BC\r
+     ELSE IF r.comando = 'BR' then cmd:= BR\r
+     ELSE IF r.comando = 'LS' then cmd:= LS\r
+     ELSE IF r.comando = 'LC' then cmd:= LC\r
+     ELSE IF r.comando = 'BO' then cmd:= BO\r
+     ELSE IF r.comando = 'MO' then cmd:= MO\r
+     ELSE IF r.comando = 'LI' then cmd:= LI;\r
+\r
+     IF r.movimiento= 'P' then mov:=lsc_primero\r
+     ELSE IF r.movimiento= 'A' then mov:=lsc_anterior\r
+     ELSE IF r.movimiento= 'S' then mov:=lsc_siguiente\r
+     ELSE IF r.movimiento= 'U' then mov:=lsc_ultimo;\r
+\r
+     CASE cmd of\r
+\r
+          INS: begin\r
+\r
+                T_TABLA_Insertar(mitabla, e, mov)\r
+\r
+                end;\r
+\r
+          IO: begin\r
+\r
+                T_TABLA_Insertar_O(mitabla, e)\r
+\r
+                end;\r
+\r
+          ORD: begin\r
+\r
+                T_TABLA_Ordenar(mitabla)\r
+\r
+                end;\r
+\r
+          BC:  begin\r
+\r
+                 T_TABLA_Buscar_Clave (mitabla, r.dni, error );\r
+\r
+                 IF Error then\r
+                    writeln(o,'Error buscando la clave: ',r.dni)\r
+                 Else\r
+                    begin\r
+\r
+                    T_TABLA_Elem_Cte (mitabla, e);\r
+\r
+                    writeln('Encontrado: ', e.nombre);\r
+\r
+                    end;\r
+\r
+                 end;\r
+\r
+          BR: begin\r
+\r
+                Buscar_por_Rango(mitabla, r.dni, r.dni_hasta, pila);\r
+\r
+                Writeln(o,'RESULTADOS DE LA BUSQUEDA:');\r
+\r
+                Writeln(o,'--------------------------');\r
+\r
+                while not PILAC_vacio(pila) do begin\r
+\r
+                    PILAC_sacar(pila, e);\r
+\r
+                    writeln(o,' ',e.dni,' - ', e.nombre);\r
+\r
+                    end;\r
+\r
+                Writeln(o,'----- FIN BUSQUEDA ------');\r
+\r
+                end;\r
+\r
+          LS: begin\r
+\r
+                If NOT T_TABLA_Vacia (mitabla) then begin\r
+\r
+                      T_TABLA_Mover_Cte (mitabla, lsc_primero, error);\r
+\r
+                      error:= false;\r
+\r
+                       while NOT error do begin\r
+\r
+                             T_TABLA_Elem_Cte (mitabla, e);\r
+\r
+                             writeln(o,' ',e.dni,' - ', e.nombre);\r
+\r
+                             T_TABLA_Mover_Cte (mitabla, lsc_siguiente, error);\r
+\r
+                       end;\r
+                end\r
+\r
+                Else\r
+\r
+                    Writeln(o, 'TABLA VACIA');\r
+\r
+                end;\r
+\r
+          LC: begin\r
+\r
+                    T_TABLA_Elem_Cte (mitabla, e);\r
+\r
+                    writeln(o,' ',e.dni,' - ', e.nombre);\r
+\r
+                end;\r
+\r
+          BO: T_TABLA_Borrar_Cte ( mitabla );\r
+\r
+          MO: T_TABLA_Modif_Cte (mitabla, e);\r
+\r
+          LI: T_TABLA_Limpiar (mitabla);\r
+\r
+          ELSE\r
+               writeln(o,' ERROR. Comando desconocido :', r.comando );\r
+\r
+     end; {case}\r
+\r
+  end; {while}\r
+\r
+  close(o);\r
+\r
+end.\r
+\r