Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Arreglo y Listas Enlazadas (https://www.clubdelphi.com/foros/showthread.php?t=21790)

davitcito 27-05-2005 17:13:34

Arreglo y Listas Enlazadas
 
Saludos muchachos, tengo un problemilla, y es que no se como podría implementar un arreglo en el cual cada casilla de este arreglo contenga una lista enlazada. Por ejm, tengo este problema,
"Crear un arreglo de clientes en el cual cada casilla contenga una lista enlazada de acuerdo al servicio que se le presta (Telefono Fijo, Telefono Móvil, Cable). Además, c/u tiene sus atributos cód de servicio, nombre del titular, monto a pagar y descuento"
Bueno, espero me puedan ayudar, saludos.

Lepe 27-05-2005 19:04:21

¿Puedes usar TobjectList??

Código Delphi [-]
var p : array [0..100] of TobjectList
Si puedes hacerlo así, busca por el foro el colega TobjectList ;)

Si no puedes, tendrás que hacerlo todo a mano:
Código Delphi [-]
var p : array [0..100] of Pointer
Y ahora andar creando la lista enlazada a golpe de New(nuevaVariable);

Un saludo

davitcito 27-05-2005 19:13:25

Claro de esto ultimo se trata, hacerlo un arreglo de nodos, y que de cada nodo salga una lista enlazada. Lo q no entiendo muy bien es como enlazar los nodos del arreglo con sus listas enlazadas.

EDIT: Comenzar con este encabezado sería factible?

interface
type
pServicios = ^nodoServicios;

nodoServicios = record
info: string;
pSig: pServicios;
end;

cClientes = Class
pClientes: Array[1..100] of pServicios;
inicio: pServicios;
Constructor Crea;

Crandel 28-05-2005 20:14:36

Hola davitcito,

usa el estilo Delphi, para que tu codigo se entienda mejor.

Te recomendaria usa el TList, para no limitarte al numero de servicios. Puedes hacer algo asi:

Código Delphi [-]
type

  nodoServicios = record
    nombre: string;
    masinfo: string;
  end;
  pServicios = ^nodoServicios;

  Servicios: TList;   // o TThreadList;


luego para crear la lista o ingresar usuarios, haces:

Código Delphi [-]

var
  Servicio: pServicios
begin
  new(Servicio);
  Servicio.info := "algo";
  Servicio.masinfo := "algo mas";
  Servicios.Add(Servicio);

lo mismo puedes hacer con la lista de clientes, en donde uno de los atributos es la lista de servicios.

En realidad, el TThreadList lo podes usar para la lista de clientes y el TList para la lista de servicios

Suerte

davitcito 30-05-2005 22:42:29

Gracias por el dato, el problema es q aun no usamos el TList, por lo q no entiendo muy bien como funciona, mas bien mi pregunta va a como puedo unir el arreglo de nodos (cada elemento) con una lista enlazada. Es decir, cual sería el código a usar. Espero me ayuden. Gracias.

davitcito 30-05-2005 23:11:57

:o Gracias por el dato, el problema es q aun no usamos el TList, por lo q no entiendo muy bien como funciona, mas bien mi pregunta va a como puedo unir el arreglo de nodos (cada elemento) con una lista enlazada. Es decir, cual sería el código a usar. Espero me ayuden. Gracias.

Crandel 30-05-2005 23:32:26

muy parecido:

Los servicios declaralos como vos decias
Código Delphi [-]
Servicios: Array[1..100] of pServicios;

en mi ejemplo reemplazá el Servicios.Add(Servicio); por

Código Delphi [-]
Servicios[1]= Servicio;

suerte

Crandel 30-05-2005 23:39:21

Recuerda que los elementos elementos creados con "new" despues depues deben ser eliminados con "Dispose".

Crandel 30-05-2005 23:44:52

si te da error haciendo

Servicio.info := "algo";

proba con esta línea

Servicio^.info := "algo";

me entro la duda.

Probá

mminorm 31-05-2005 08:37:57

Me imagino ke lo ke necesitas es implementar todo a mano, es algo complicado de explicar todo por aki, pero mas o menos t dare la idea:
Primero declaras la lista, luego le dices al vector ke sera de n cantidad de campos y ke cada campo sera un salto a la lista ke declaraste, por ejemplo:

Tlista = record
.
{declaracion de los datos para el registro de la lista}
.
End;

LMilista= ^Nodo;{declaracion de la lista}
Nodo=record
info:Tlista;
Sig,Ant:LMilista;
End;

Tvectorlista=record{declaracion de un registro ke tendra cada posicion del vector y ke adema tendra el salto a la lista}
salto:LMilista;
End;

Elementos:Array[1..X] of Tvectorlista;{declaración del vector}

End;

asi declaras un vector donde cada campo es un salto a la lista declarada de ahi en adelante lo ke haces es acceder a las diferentes listas ke tienes mediante el subindice del arreglo y luego a la lista. Con esta declaración se facilita todo ya ke para insertar, eliminar, o lo ke sea ke tengas ke hacer, solamente pasas el salto ke tiene cada posición del vector y la tratas como una lista comun y corriente[ejem: insertar(V[n].salto, registro)], eso si acuerdate de inicializar cada salto del vector en nil, porke si no se t arma un problema. Rspero t sirva esta mini explicación de listas salteadas cualkier cosa me escribes

davitcito 31-05-2005 21:31:51

Buenas, ante todo gracias a ambos por atender mi consulta, ahora con respecto a la última, tengo una duda, ¿para qué vuelvo declaro estas sentencias:

Cita:

Tlista = record
.
{declaracion de los datos para el registro de la lista}
.
End;
No sería suficiente solo con esto?
Cita:

LMilista = ^Nodo //vendría a ser el puntero

Nodo = record
info:Tlista; //porque info TLISTA? No lo podría poner como un string?
Sig,Ant:LMilista;
end;
Bueno, y esta última parte si me queda mas o menos claro:

Cita:

Tvectorlista = record
salto:LMilista; //¿Cómo lo usaría??
end;
Finalmente el arreglo lo declaro en una clase (tal cual me han pedido)

Cita:

Elementos:Array[1..X] of Tvectorlista;
End;
Bueno, mminorm espero me puedas ayudar con las dudas que tengo, y no estar ocasionando muchas molestias tambien. Gracias.

mminorm 01-06-2005 03:17:59

Lo unico que hice con eso fue declarar el registro ke tendr[a el nodo, segun tu consulta el nodo no tendra unicamente un dato si no varios, veo mas facil trabajar con un registro y luego declarar una variable del tipo del registro ., esa es la idea principal de eso. de esa declaracion.

{ejemplo del registro}
Tlista = record
nombre: string[30];
direccion: string[100];
{etc....}
end;


LMilista = ^Nodo //exacto seria tu puntero
Nodo = record
info:Tlista; //porque no creo ke vayas a manejar un solo dato sino varios,
Sig,Ant:LMilista;
end;

Al hacer esto haces un paquete de la informacion ke necesitar para cada nodo, ademas es recomendable utilizar siempre un registro para la informcion ke almacenaras en la lista enlazada. aunke sea un solo dato

Con el uso de la lista es muy facil, tenes ke ver cada posicion del vector como un puente a la lista, de esta manera solamente tenes ke hacer un TDA para la lista ke contiene cada posicion del vector, de esta manera podes hacer lo siguiente(asumo ke sabes ke es un TDA):

var
Tvectorlista: V:
.
.
codigo
.
.
evento click de un boton.......
begin
insertar(V[i].salto,reg) {donde reg es un registro de tipo Tlista. Nota tambien ke insertar recibe 2 parametros la lista y un registro}
end;

Recuerda ke cada vez ke vas a insertar un nodo en la lista tenes ke declarar un registro de tipo Tlista.

Asi se usa, ahora bien nota ke la verdadera lista esta en el salto ke contiene el vector no en el vector mismo, de esta manera estas manejando una lista comun y corriente, no t hagas bolas con lo del vector ke eso no es nada es solo un puente. Cualkier cosa estamos en contacto

mminorm 01-06-2005 08:36:19

Davit lei tu correo, mira con el codigo ke t di enlazas cada casilla del arreglo a una lista, asi es como enlazas una lista diferente a cada casilla del arreglo:

Tlista = record //registro para el nodo
nombre: string[30];
direccion: string[100];
{etc....}
end;


LMilista = ^Nodo //tu puntero(lista enlazada)
Nodo = record
info:Tlista;
Sig,Ant:LMilista;
end;

Tvectorlista = record //registro ke se convertira en el tipo de tu vector y ke contiene el salto a tu lista
salto:LMilista;
end;


Elementos:Array[1..N] of Tvectorlista; //declaracion del arreglo de n posicion donde cada posicion es de tipo Tvectorlista, y Tvectorlista tiene un salto a tu lista.

Luego declaras una variable de tipo Elementos y un registro de tipo Tlista para la informacion ke tendras ke guardar en cada nodo:

Var
Elementos: Tuarreglo;
Tlista:Turegistro;

Y eso es todo

Lepe 01-06-2005 10:18:05

Yo reorganizaba las cosas un poquito, No sé si os gustará.

Código Delphi [-]
type
pNodo = ^Nodo // Puntero a un nodo
Nodo = record
 OtraInformacion:String[255];
 
 Sig,Ant:pNodo;
end;

TCliente = record //registro para el nodo
 Lista :pNodo;//aqui tenemos ya el puntero.
 nombre: string[30];
 direccion: string[100];
 {etc....}
end;

TvectorCliente = Array[1..N] of TCliente;

Para acceder:
Código Delphi [-]
var  vector:TvectorCliente;
begin
  vector[1].nombre := 'pepe';
  new(vector[1].Lista); // creamos el primer nodo para este cliente
  vector[1].Lista^.OtraInformacion := ' pues eso';
  new(vector[1].Lista^.Sig); // creamos un nuevo nodo para el cliente 1
end;

Un saludo

davitcito 01-06-2005 16:01:57

Bueno, vaya, ahora si que se han pulido :) gracias mminorm & Lepe por todo, y en general gracias a todos, me ha quedado muy en claro. Da gusto consultar en este foro, pues siempre hay personas dispuestas a ayudar :D

Saludos.


La franja horaria es GMT +2. Ahora son las 09:44:15.

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