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.
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


0