SoloCodigo
Programación General => Otros Lenguajes de Programación => ADA => Mensaje iniciado por: tronk85 en Miércoles 21 de Enero de 2004, 21:45
-
buenas tengo un problema tengo que hacer una practica en lenguaje ada que consiste en insertar un valor v al final de una lista l pero en seudo lenguaje mas o menos se como hacerlo pero en ada es que no tengo ni pajorera alguien me podria echar una mano o decirme dond puedo encontrar informacion sobre esto apuntes lo que sea se lo agradeceria. :comp:
-
Hola Tronk. Aqui te adjunto unos ficheros donde puedes encontrar tu problema resuelto.
Tienes que escribir esto en otro fichero llamado tipos.ads
package tipos is
type Nodo;
type A_Nodo is access Nodo;
type Nodo is record
Num:Natural;
sig:A_Nodo;
end record;
A continuacion escribe un fichero llamado Operaciones_Lista.ads donde pongas
with Tipos;
use Tipos;
Package Operaciones_lista is
Procedure Insertar_Elemento (L:in out A_Nodo;E:in Natural);
end Operaciones_Lista;
Si haces esto todo irá bien y el código del fichero adjunto se encargará de insertar el elemento al final de la lista.
Si quieres te envio tambien el codigo de un fichero de prueba por si quieres probar el programa (Yo ya lo he probado y funciona, creeme). El codigo es el que sigue.
with Ada.text_Io,Ada.Integer_Text_Io,Tipos,Operaciones_Lista;
use Ada.text_Io,Ada.Integer_Text_Io,Tipos,Operaciones_Lista;
Procedure prueba is
L:A_Nodo:=New Nodo;
Aux:A_Nodo;
Elem:natural:=5;
begin
L.Num:=4;
L.Sig:=NUll;
for i in reverse 1..3 loop
Aux:=New Nodo;
Aux.Num:=i;
Aux.sig:=L;
L:=Aux;
end loop;
Insertar_Elemento(L,Elem);
Put (" La lista resultado es: ");
Aux:=L;
While Aux/=Null loop
Put (Aux.Num,width=>0);
Put (",");
Aux:=Aux.sig;
end loop;
end Prueba;
La salida correcta de este programa es:
La lista resultado es:1,2,3,4,5,
Asi podras comprobar que efectivamente el fichero adjunto ha cumplido con su cometido.
Ha sido un placer ayudarte
Atentamente
-
gracias por tu respuesta me ha servido se gran utilidad y te keria hacer otra pregunta esto es lo mismo para una lista doblemente encadenda que para una simpremente encadenada . :lightsabre:
-
No es por poner pegas a la respuesta de Gandalf el Gris (al final no era blanco?? :blink: ), puesto que supongo que su codigo es del todo correcto.
De todos modos se echa algo de meno la ocultacion de tipos que supongo que te exigen en una practica sobre punteros (yo tuve que hacer una muy similar y la verdad es que a mi me lo exigieron).
Ademas, con esta ocultacion lo que podemos tener es un mismo programa de prueba que nos compruebe ambas implementaciones.
No te adjunto ningun codigo mas que nada por que no se lo que realemnte te piden, y tampoco es plan de ir poniendo funciones a lo bestia. Por que yo añadiria funciones como anterior, siguiente, ultimo, rimero, etc... Vamos, que al ser doblemente enlazada se le buscara una estructura de iterador (supongo).
Otra cosa que añadiria seria genericidad en el parametro. Con el codigo que te han pasado tan solo puedes hacer listas de Integers. Pero si quisieras listas de Floats deberias de tener otro paquete, y lo mismo para listas de Characters, etc...
Lo dicho, si quieres un codigo un poco mas explicito, di exactamente lo que te piden y no me importara nada pasartelo.
-
Hola, el fichero de respuesta anterior es bastante cutre y tiene varios fallos.
te mando una solución correcta y como Dios manda.
type Componente;
type Lista is access Componente;
type Componente is
record
Primero : Tipo_Elemento;
Resto : Lista;
end record;
procedure Insertar
(C : in out Lista;
Elemento : in Tipo_Elemento)
is
Ref_C : Lista;
begin -- Insertar
if C = null then
C := new Componente;
C.all.Primero := Elemento;
C.all.Resto := null;
else
Ref_C := C;
while Ref_C.all.Resto /= null loop
Ref_C := Ref_C.all.Resto;
end loop;
Ref_C.all.Resto := new Componente;
Ref_C.all.Resto.all.Primero := Elemento;
Ref_C.all.Resto.all.Resto := null;
end if;
end Insertar;