• Viernes 15 de Noviembre de 2024, 10:34

Autor Tema:  Duda Sobre Punteros  (Leído 2599 veces)

tronk85

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Duda Sobre Punteros
« en: Miércoles 21 de Enero de 2004, 21:45 »
0
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:

gandalfelgris

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Duda Sobre Punteros
« Respuesta #1 en: Viernes 23 de Enero de 2004, 12:14 »
0
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
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
gandalfelgris

tronk85

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Duda Sobre Punteros
« Respuesta #2 en: Sábado 24 de Enero de 2004, 13:24 »
0
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:

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Duda Sobre Punteros
« Respuesta #3 en: Domingo 1 de Febrero de 2004, 18:10 »
0
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.
   

kukillo

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Duda Sobre Punteros
« Respuesta #4 en: Martes 10 de Febrero de 2004, 11:29 »
0
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;