Pascal/Turbo Pascal - TAD Listas

 
Vista:

TAD Listas

Publicado por Zugen (3 intervenciones) el 30/11/2006 11:59:12
Estoy realizando una unidad en PASCAL que implementa las operaciones normales de una lista, una de ellas es que dada una lista nos devuelva el resto, es decir, la misma lista menos el primer elemento y me he quedado atascado, no se como seguir, copio lo que llevo de código por si alguien puede ayudar:

UNIT ListaEst;

INTERFACE
CONST
MAX = 10;
TYPE
TipoElemento = integer;
TipoLista = RECORD
almacen: ARRAY [1..MAX] OF TipoElemento;
primer: TipoElemento;
END;

PROCEDURE CrearVacia(VAR lista:TipoLista);
PROCEDURE Construir(elem:TipoElemento; VAR lista:TipoLista);
FUNCTION Primero(lista:TipoLista):TipoElemento;
PROCEDURE Resto(lista:TipoLista;VAR restoLista:TipoLista);
FUNCTION EsVacia(lista:TipoLista):boolean;
FUNCTION Longitud(lista:TipoLista):integer;

IMPLEMENTATION
PROCEDURE CrearVacia(VAR lista:TipoLista);
BEGIN
Lista.primer:=0;
END;

PROCEDURE Construir(elem:TipoElemento; VAR lista:TipoLista);
BEGIN
lista.primer:=elem;
END;

FUNCTION Primero(lista:TipoLista):TipoElemento;
BEGIN
Primero:=lista.primer;
END;

PROCEDURE Resto(VAR lista:TipoLista);
BEGIN
{AQUI SE ENCUENTRA MI PROBLEMA}
END;

FUNCTION EsVacia(lista:TipoLista):boolean;
BEGIN
IF (Primero(lista)=0) THEN
EsVacia:=TRUE
ELSE
EsVacia:=FALSE;
END;

FUNCTION Longitud(lista:TipoLista):integer;
BEGIN
IF EsVacia(lista) THEN
Longitud:=0
ELSE
Longitud:=1 + Longitud(Resto(lista));
END;

Muchas gracias por adelantado. Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:TAD Listas

Publicado por Carlos Guimaraenz (265 intervenciones) el 30/11/2006 12:49:16
Hola Zugen! Para ser sincero, no comprendo la manera que tienes de implementar la lista, sin punteros. En una lista con punteros como la conozco, lo que haría sería lo siguiente:

Debes avanzar el puntero una posición, y liberar la posición del que hasta el momento era el primer elemento. Al pasarlo por referencia, una vez que avances, el comienzo de la lista será el que era el segundo elemento:

PROCEDURE Resto(VAR lista:TipoLista);
VAR
aux : TipoLista; {declaro una auxiliar para liberar la primer posición}
BEGIN
aux:=lista;
lista:=lista^.sig;
Dispose(aux);
END;

Y debes tener en cuenta que en la sección INTERFACE declaraste el procedure de una manera, con dos parámetros, y en la IMPLEMENTATION lo hiciste con uno solo. Además faltarían operaciones tales como AGREGAR, ELIMINAR, INSERTAR, etc.

Si puedes explicar cómo manejas la lista de ésta manera, quizá podamos ayudarte más. Un abrazo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TAD Listas

Publicado por Zugen (3 intervenciones) el 30/11/2006 12:57:02
Hola! Se que la manera normal de implementar una lista es con punteros pero es que nos han pedido una implementacion mediante arrays (lista estatica), se que faltan mas operaciones, pero aún no las he implementado porque necesito de otras como la de RESTO; y sobre lo de la declaracion del procedure con 2 parametros en interface y 1 parametro en implementation, se me olvido cambiar lo de interface, porque creo que lo correcto seria hacerlo con un solo parametro: dada una lista que te devuelta el RESTO de esa lista, es decir, otra lista.

Espero haberme explicado mejor ahora. Gracias. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TAD Listas

Publicado por Carlos Guimaraenz (265 intervenciones) el 30/11/2006 13:16:14
Hola nuevamente, tienes razón, lo más razonable sería devolver la lista en un único parámetro.
Ahora pasamos a la resolución de RESTO:
Deberías indicar si PRIMER tiene el mismo elemento que ALMACEN[1], y además, cual es el valor indicando VACIO (¿es cero?).

Suponiendo esas dos cosas, deberías hacer:

PROCEDURE Resto(VAR lista:TipoLista);
VAR
i : word;
BEGIN
{ pongo el valor del 2º elemento en PRIMER }
lista.primer:=lista.almacen[2];
{ hago un corrimiento hacia la izquierda de todos los elementos }
for i:=1 to MAX - 1 do
lista.almacen[i]:=lista.almacen[i + 1];
{ y por último establezco el último elemento como vacío }
lista.almacen[MAX]:=0; { o el valor que uses como vacío }
END;

Cualquier modificación que necesites hacerle y no sepas cómo, consulta nuevamente. Un abrazo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TAD Listas

Publicado por Zugen (3 intervenciones) el 30/11/2006 13:24:56
Muchas gracias! Creo que así se quedaría bien, yo he supuesto que PRIMER es igual que ALMACEN[1] aunque no dice nada en el enunciado, pero es lo más lógico y si, el valor VACIO es cero. Muchas gracias por todo. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar