Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up Como hacer una lista enlazada dinamica en delphi

Hola queridos amigos foristas necesito sugerencias y opiniones de como poder implementar una lista dinamica en delphi que sea dinamica y generica, de acuerdo a lo siguiente:
Mi estructura Nodo seria:

*Que tenga un variable Elemento, este elemento debe ser generico, es decir puede tomar cualquier tipo de dato,objeto,variable;(perece ser que en C++ esto se logra con template).
*Bueno(es logico) el otro elemento es un link o enlace de tipo Nodo.
De esa forma lograria tener un lista dinamica generica.
Cualquier ayudita o sugerencia es bien recibida.
Muchas gracias de antemano.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #2  
Antiguo 02-10-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
*Que tenga un variable Elemento, este elemento debe ser generico, es decir puede tomar cualquier tipo de dato,objeto,variable;(perece ser que en C++ esto se logra con template).

*Bueno(es logico) el otro elemento es un link o enlace de tipo Nodo.
No acabo de entender que quieres decir con dinámica y genérica. ¿Algo así como un ObjectList?
Supongo que para lo primero puedes crear un Pointer, similar a como tienen los ObjectList; Con ese apuntador podrás almacenar/apuntar a lo que quieras. Y tal vez otro apuntador para el siguiente nodo.

Insisto, antes de seguir revisa TList, TObjectList,...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 02-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, seria algo asi como

Código:
 
typedef struct Nodo {
            variant (?) elemento;
            Nodo *conexion; };
no recuerdo bien bien la sintaxis de C, algo de este estilo seria...Todo y eso, las listas dinamicas para que sean correctas tienen conexión con el anterior y con el siguiente...

Código:
 
typedef struct Nodo { 
             Nodo *anterior,*siguiente;
             variant (?) elemento };
igualmente, como te dice Neftali, en C++ y ya en OOP en general, este tipo de estructuras ya estan implementadas (el mismo TObjectList...) saludos.

Última edición por coso fecha: 03-10-2008 a las 21:32:14.
Responder Con Cita
  #4  
Antiguo 02-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Wink

Gracias por sus respuestas amigos.
La idea de implementar una lista enlazada dinamica generica es que a veces necesito esta estructura de datos para utilizar en cualquier aplicacion que necesite, estoy tratando de entender Las clases ya implementadas TList,TObjectList; la primera es generica pero guardas solo punteros de objetos;la segunda guarda Objeto,pero cuando le mando que adicione por decir un Record creado por mi, me sale que es incompatiple los datos; que yo sepa, en programcion solo se puede hacer casting de una clase padre hacia una clase hija, o de hija a hija,y nunca de hija a padre,(Bueno eso es en java) por tanto: ¿Cómo hago un casting de un record a un TObject?.
En cuanto a lo que dice coso, yo he implementado algo parecido en c++Builder y en Java,pero pense que en delphi seria mas facil; lo que tenia duda es como se hace en Delphi.
Tengo una duda;lei por ahi que delphi en pura referencia,entonces me pregunte si es pura referencia es identico a hacerlo en java, pero queria comprobar si esto era verdad.
No se si alguien me puede aclarar el asunto...¡¡¡¡¡¡¡¡
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #5  
Antiguo 02-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
ah en delphi seria algo como

Código Delphi [-]
type
     nodo = class
     valor : variant;
     anterior, posterior : nodo;
end;

ya te digo q este tipo de estructura esta muy manido. Seguro q si miras bien los objetos TList o TObjectList, encuentras una solución ya hecha. Saludos.
Responder Con Cita
  #6  
Antiguo 02-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Cita:
¿Cómo hago un casting de un record a un TObject?.
en vez de usar un record, puedes crear una clase descendiente de TObject.
Responder Con Cita
  #7  
Antiguo 02-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
hablando en plata:
Código Delphi [-]
type MiObjeto = class(TObject)  // ya está, ya tienes un objeto con esta linea
  public
     valor : variant;
     anterior, posterior : TObject;
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 02-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
bueno, corrigiendo a Lepe...
Código Delphi [-]
type MiObjeto = class(TObject)  // ya está, ya tienes un objeto con esta linea  
  public     
      valor : variant;     
      anterior, posterior : MiObjeto;
end;

saludos.
Responder Con Cita
  #9  
Antiguo 03-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y ¿para qué quiere hacer un casting de un record a un TObject, si con un Pointer puede hacer referencia a uno y otro? Yo creo que un TList es más que suficiente para casi todo.

Por otro lado, usar un Variant puede ser útil para tipos simples, pero para tipos estructurados no es posible usarlos directamente, y hay que hacer demasiado moldeo:

Código Delphi [-]
V := Integer(UnObjeto);

...

TUnbjeto(Integer(V)).UnMetodo();

// Saludos
Responder Con Cita
  #10  
Antiguo 03-10-2008
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Román tiene razón, Además un Tlist o un TObjectList fueron diseñados con el propòsito de simplificar el manejo de listas enlzadas...

además, amigo "rgstuamigo", si te empeñas en hacer una lista enlazada "a la antigua" tendrás que implementar toda su funcionalidad a mano,... ya sabes: Insertar, eliminar, ir hacia adelante, ir hacia a atras... etc, etc... ¿Por que no intentar con los objetos que te proponen? tienen muchas ventajas y muy probablemente sean menos dolores de cabeza...

Por otro lado si de todas formas utilizas un objeto del tipo:
Código Delphi [-]
type MiObjeto = class(TObject)  
  public     
      valor : variant;     
      anterior, posterior : MiObjeto;
end;


pues mejor haces:

Código Delphi [-]
type MiObjeto = class(TObject)  
  public     
      valor : variant;     
end;

y dejas el trabajo de anterior y posterior al TObjectList....


Como comentario adicional... no se que peinsen uds. pero creo que con la POO, el uso de Records es menos eficiente... es decir, si saca de apuros y para proyectos rápidos es funcional, pero por principio, si un grupo de variables se puede agrupar es muy probable que sea candidato a objeto...



Saludos,
Responder Con Cita
  #11  
Antiguo 03-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Opino igual que ustedes: si las clases están usemoslas. Pero, he aquí que tal vez no conocemos en profundidad que es lo que se busca.
Quizás rgstuamigo es un estudiante y recién está viendo sobre los tipos abstractos de datos y a modo de tarea le pidieron que implementace una lista doble encadenada.
Es un ejercicio bastante común, al menos cuando fuí estudiante se nos los pedía. En caso de que se trate de esto... tal vez sería más productivo para él que nuestra ayuda se focalize en asistirlo en como llevar a cabo la implementación de los procedimientos y funciones necesarios.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #12  
Antiguo 03-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Al principio pensé lo mismo, Delphius, pero entonces, ¿para qué la genericidad? Para aprender y realizar el típico ejercicio de listas, no hace falta irse por las ramas, se hace una lista de enteros y ya estuvo.

Por cierto, me parece que Tiburón ya traerá los famosos templates estilo C++ ¿no? Y, de hecho, creo que FreePascal ya los tiene.

// Saludos
Responder Con Cita
  #13  
Antiguo 03-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por coso Ver Mensaje
bueno, corrigiendo a Lepe...
No es una corrección, es una mejora

Sí, tenéis razón, fué un tecleado rápido (sin pensar mucho...)
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 03-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
no no, es una correcion ...el nodo anterior y el siguiente (al menos, tengo entendido) tienen q ser del mismo tipo, para crear la 'cadena', aunque seguro q hay variedades con la clase inicial. Saludos

Última edición por coso fecha: 03-10-2008 a las 18:07:44.
Responder Con Cita
  #15  
Antiguo 03-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Cita:
pero entonces, ¿para qué la genericidad? Para aprender y realizar el típico ejercicio de listas, no hace falta irse por las ramas, se hace una lista de enteros y ya estuvo.
antes de usar OOP, estas listas con struct eran muy comunes (y tambien un nido de bugs). Claro esta, que el struct (el record) no tenia unicamente un solo tipo de dato. Este tipo de cadenas se hacian cuando se necesitaban arrays dinamicos de estructuras (si bien tambien se podia hacer con un unico puntero a una variable de ese tipo, aunque no hubiese 'contacto' entre los nodos), pero ahora en delphi se puede dejar un array sin determinar la longitud y cambiarlo con setlenght directamente en el momento que te plazca. Por lo tanto, la lista dinamica quedaria anterior te quedaria como...

Código Delphi [-]
var
v : array of variant;
begin
   setlength(v,19);
end;

o bien de un record...

Código Delphi [-]
type 
  Estruct = record
  v1 : variant;
  dato1 : integer;
  ...
end;
 
var
  v : array of Estruct
begin
  setlength(v,19);
  ...
end;

que creo que es lo q comenta roman. Lo que vengo a decir es que si bien las listas dinamicas genericas se creaban de esa manera, indicando el puntero al nodo siguiente y al anterior, ahora es una tipo de estructura mas que desfasada (o ya implementada en el propio lenguaje). Saludos y a ver si te sirve la información
Responder Con Cita
  #16  
Antiguo 03-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Lightbulb

Gracias por los comentarios amigos, quisiera aclarar unos puntos:

Cita:
además, amigo "rgstuamigo", si te empeñas en hacer una lista enlazada "a la antigua" tendrás que implementar toda su funcionalidad a mano,... ya sabes: Insertar, eliminar, ir hacia adelante, ir hacia a atras... etc, etc... ¿Por que no intentar con los objetos que te proponen? tienen muchas ventajas y muy probablemente sean menos dolores de cabeza...
No es que quiera reinventar la rueda, sino queria ver verdaderamente las potencialidades de delphi en estas areas, como les dije yo he implementado listas simples,lista doblemente enlasadas, arboles (binarios,AVL,Rojo y Negro,B,B+)en otros lenguajes de Programacion (Java concretamente a pesar que ya algunos entas implementados en el propio lenguaje)y no he tenido muchos inconvenientes(solo inconvenientes logicos), pero de lenguaje no.
Yo creo que estas estructuras de datos son parte escencial en la vida de un programador, y quien no las conosca estaria omitiendo un gran conocimiento de la Programacion.
A veces me topado con Docentes en la Universidad (U) que te piden hacer algo pero sin utilizar lo que ya esta echo.¿Entonces que te queda?
pues hacerlo y pienso que es bueno en cierta manera por que aprendes muchos a pesar de que a veces tu trabajo se vuelve tedioso.

Cita:
Quizás rgstuamigo es un estudiante y recién está viendo sobre los tipos abstractos de datos y a modo de tarea le pidieron que implementace una lista doble encadenada.
Delphius no es que no los conosca, les repito que yo ya he implentado algo parecido, lo que deseaba saber como implementarlo en Delphi ya que nunca habia implementado listas en delphi pero me reté a poder hacerlo generico para poder utilizarla en cualquier ocasion.

Cita:
Por cierto, me parece que Tiburón ya traerá los famosos templates estilo C++ ¿no? Y, de hecho, creo que FreePascal ya los tiene.
Es exactamente lo quiero que me aclaren sobre los templates en delphi y si pueden con un ejemplito; ademas la otra duda es que si ¿Delphi en pura referencia?
Lo que dices tu Roman para que hacerlo generica , pues te puedo decir si tuvieras un lista generica la podrias usar en cualquier circunstancias que la necesites y con cualquier tipo de objeto es decir Una sola implementacion y te sirve de mucho, por eso quiero saber sobre los templates en Delphi.
Buenos esas mis aclaraciones y dudas que tenia, agradesco sus opiniones queridos amigos
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #17  
Antiguo 03-10-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

A que te refieres con que Delphi es pura referencia?

Ahora, como ya te han mencionado, Delphi cuenta con algunas clases que resuelven lo que necesitas. Checa la unidad Contnrs, ahí vienen implementadas las estructuras de pilas, colas, listas ordenadas, etc...

Ya con esas clases básicas puedes heredar para hacer lo que desees...

Ahora te pongo un ejemplo de como hacer una lista con estructuras record:

Código Delphi [-]
type
  PRegistro = ^TRegistro;

  TRegistro = record
    Data: Variant;
  end;

// Ejemplo de uso con un objeto TList:
var
  RegistroList: TList;
  Registro: PRegistro;

begin
  RegistroList := TList.Create;
  New(Registro);
  Registro^.Data := 'Hola mundo';
  RegistroList.Add(Registro);
  New(Registro);
  Registro^.Data := 23;
  RegistroList.Add(Registro);
  // Vamos a recorrer la lista:
  for I := 0 to RegistroList.Count - 1 do
    ShowMessage(PRegistro(RegistroList[i])^.Data);
  // Liberamos la memoria:
  for I := 0 to RegistroList.Count - 1 do
    Dispose(PRegistro(RegistroList[i]));
  RegistroList.Clear;
  RegistroList.Free
end;

Saludos...
Responder Con Cita
  #18  
Antiguo 03-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Cita:
A que te refieres con que Delphi es pura referencia?
creo q se refiere a que la definicion de un objeto es directamente un puntero a ese objeto...
Responder Con Cita
  #19  
Antiguo 03-10-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Cita:
Empezado por coso Ver Mensaje
creo q se refiere a que la definicion de un objeto es directamente un puntero a ese objeto...
La definición de un objeto en Delphi es una clase... y esta no es un puntero a un objeto...

¿O será que te entendí mal?



Saludos...
Responder Con Cita
  #20  
Antiguo 03-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
Lo que dices tu Roman para que hacerlo generica , pues te puedo decir si tuvieras un lista generica la podrias usar en cualquier circunstancias que la necesites y con cualquier tipo de objeto es decir Una sola implementacion y te sirve de mucho, por eso quiero saber sobre los templates en Delphi.
Buenos esas mis aclaraciones y dudas que tenia, agradesco sus opiniones queridos amigos
Pues precisamente, un TList o un TObjectList los tienes casi para cualquier circunstancia sin necesidad de entrar en los templates. Tú que has trabajado en Java, sabrás que ahí, quizá más que en Delphi, todo son objetos. Entonces, un TObjectList es más que suficiente. Pero como en Delphi tenemos más tipos de datos estructurados, como los records, no hay problema porque tenemos al TList, y mira que el TList te sirve igual para objetos (de hecho, le he visto pocas ventajas a un TObjectList sobre un TList).

Ahora, ¿que quieres hacer listas de datos simples como enteros, caracteres o strings (1)? Pues basta que los "envuelvas" en un registro o una clase

Código Delphi [-]
TString = class
  Valor: String;
end;

y ya puedes hacer tu lista de Strings.

// Saludos

(1) Estrictamente hablando, String no es un tipo simple, y si lo "envuelves en un record habrá que tener cuidado con la liberación de la memoria que usa.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lista Dinamica en Java Alejo JAVA 1 17-01-2005 12:48:41
Como hacer una lista de temas.... Delphius Varios 16 16-11-2004 20:37:56
lista dinamica Telemaco PHP 6 19-08-2004 23:20:33
lo que necesito es ayuda en el TDA de una lista doblemente enlazada circular program_tda Varios 12 17-02-2004 08:45:35


La franja horaria es GMT +2. Ahora son las 20:23:13.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi