Pascal/Turbo Pascal - Dudas en pilas y colas.

 
Vista:

Dudas en pilas y colas.

Publicado por Homer (10 intervenciones) el 31/07/2007 10:46:21
Hola de nuevo!

En esta ocasión estoy estudiando punteros (listas, pilas y colas). El caso es que me han surgido algunas dudas similares para pilas y colas.

1ª) En el código de insertar, ¿no debería eliminar con dispose el puntero 'auxiliar' (nuevo)? El caso es que si pongo dispose nuevo, a la hora de imprimir no me imprime los datos reales que he insertado. Será que el dispose va al final del programa?

2ª) La segunda duda es un error que me aparece tanto en el codigo de colas como en pilas. El caso es que: me elimina datos perfectamente pero, cuando me quedo con el ultimo dato y lo elimino, me dice correctamente 'cola o pila vacia' pero inmediatamente: me da un error (Runtime). Sabéis por qué?

Bueno, les paso el código, está hecho por mí, sin sacarlo de ningún lado. Me gustaría arreglar estas dos dudas y si veis algo incorrecto me lo podéis comentar también.

Gracias!

El código:

program Colas;

uses
crt;

const
NUMERO_OPCIONES = 4;

type
TipoCola = ^Nodo;
Nodo = record
info : integer;
siguiente : TipoCola;
end;
var
pri, ult : TipoCola;
dato : integer;

(**********************************)

procedure CrearCola(var pri, ult : TipoCola);
begin
new(pri);
new(ult);
pri := nil;
ult := nil;
end;

(**********************************)

procedure InsertarCola(var pri, ult : TipoCola; dato : integer);
var
nuevo : TipoCola;
begin
new(nuevo);
nuevo^.info := dato;
nuevo^.siguiente := nil;
if (pri = nil) then
pri := nuevo
else
ult^.siguiente := nuevo;
ult := nuevo;
end;

(**********************************)

procedure EliminarCola(var pri, ult : TipoCola);
var
Elim : TipoCola;
begin
if (pri = nil) then
writeln('Cola Vacia')
else
begin
Elim := pri;
pri := pri^.siguiente;
dispose(Elim);
end;
readln();
end;

(**********************************)

procedure ImprimirCola(pri : TipoCola);
var
aux : TipoCola;
begin
if (pri = nil) then
begin
writeln('COLA VACIA!!!');
readln();
end
else
begin
aux := pri;
while (aux <> nil) do
begin
writeln('dato: ', aux^.info);
readln();
aux := aux^.siguiente;
end;
end;
dispose(aux);
end;

(**********************************)

procedure elegir(var seleccion : integer);
begin
case seleccion of
1 : begin
write('Inserte nuevo elemento: ');
readln(dato);
InsertarCola(pri, ult, dato);
end;
2 : EliminarCola(pri, ult);
3 : ImprimirCola(pri);
end;
end;

(**********************************)

procedure menu;
var
opc : integer;
begin
repeat
clrscr;
writeln(' ======== MENU COLAS ========');
writeln();
writeln(' 1. Insertar');
writeln(' 2. Eliminar');
writeln(' 3. Imprimir');
writeln(' 4. Salir');
writeln();
writeln(' ======== ========== ========');
writeln();
write(' Elija la opcion que desee: ');
readln(opc);

elegir(opc);

until (opc = NUMERO_OPCIONES);
end;

(**********************************)

begin
clrscr;
CrearCola(pri, ult);
if (pri = nil) then
writeln('Cola vacia!');
readln();
menu;
end.
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:Dudas en pilas y colas.

Publicado por Diego Romero (996 intervenciones) el 31/07/2007 19:55:08
La primera cosa que veo es que tienes conflicto de identificadores. Tienes dos variables globales que se llaman pri y ult y usas los mismos identificadores como parámetros de los procedimientos. Sugiero que cambies las variables globales a "primero" y "ultimo" para evitar ambigüedades.

1) No. Está bien así. Si eliminas el auxiliar estás eliminando el nodo de la cola que acabas de insertar.

2) Este procedimiento está bien (as far as I see).

Por otro lado en el procedimiento ImprimirCola el último dispose no es correcto puesto que estás tratando de eliminar un puntero que apunta a nil.
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:Dudas en pilas y colas.

Publicado por Homer (10 intervenciones) el 01/08/2007 12:06:47
Muchas gracias Diego Romero!

Es cierto, cambiaré los nombres a las variables pri y ult. Gracias por tu respuesta!
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:Dudas en pilas y colas.

Publicado por Homer (10 intervenciones) el 01/08/2007 18:07:40
Hola de nuevo, me ha surgido una nueva duda a la hora de trabajar con "listas enlazadas ordenadas". El caso es que a la hora de Insertar y Eliminar trabajo con las variables: anterior, actual y primero.

El codigo sería el siguiente:

procedure InsertaOrdenado(var pri : TipoLista; dato : integer);
var
actual, anterior, nuevo : TipoLista;
begin
actual := pri;
anterior := nil? pri?
ETC...

La duda es: ¿Igualo 'anterior' a nil o a 'pri' tal y como hice con 'actual'?

Gracias de nuevo!
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:Dudas en pilas y colas.

Publicado por Marcelo (4 intervenciones) el 02/08/2007 19:37:17
Hola Homer,

Sería bueno que postearas el código completo del procedimiento para verlo mejor.
Pero igualmente, anterior, ¿qué contiene? ; si contiene el registro anterior a actual debería apuntar a nil ya que actual es el primero y no tiene anterior aunque sería en vano inicializarlo en ese momento.

Saludos.
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:Dudas en pilas y colas.

Publicado por Homer (3 intervenciones) el 04/08/2007 17:03:23
Exacto Marcelo!

Esa era mi duda concretamente, el caso es que yo pensaba que al iniciar, el puntero actual va al primer puesto pero no tiene anterior, por tanto, como tu me confirmas, anterior debe ir a "nil". Muchísimas gracias!
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