Pascal/Turbo Pascal - lista dinamica

 
Vista:

lista dinamica

Publicado por pepe (7 intervenciones) el 26/05/2011 23:16:13
Alguien m podria ayudar con un problema k tengo en la lista dinamica doblemente enlazada.

Mediante punteros tiene k realizar unas operaciones,

pero el buscar m da error y nose el pork.

Esto es lo k tengo:

type puntero = ^nodo;
nodo = record
dato : byte;
sig : puntero;
ant : puntero;
end;
type lista = record
pri : puntero;
ult : puntero;
end;
type fichero = file of byte;

function buscar (l : lista; valor : byte) : boolean;
begin
if vacia (l) then buscar := false
else if l^.dato = valor then buscar := true
else buscar := buscar (l^.sig, valor);
end;

Yo kreo k esta bien, pero m da error en la linea:
else if l^.dato = valor then buscar := true
else buscar := buscar (l^.sig, valor);

GRACIAS de antemano :)
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

lista dinamica

Publicado por ramon (2158 intervenciones) el 27/05/2011 12:50:12
{Me falta información del resto del programa por ejemplo creo que tendrás una función como la que te pongo pues sino no cuadra la es presión con pascal mira lo que te dejo con relación a lo que veo}

function vacia(i : puntero) : boolean;
begin
vacia := i = nil;
end;

function buscar(l : puntero; valor : byte) : boolean;
begin
if vacia(l) then {entiendo que vacia es una función como la de arriba}
buscar := false
else
if l^.dato = valor then
buscar := true
else
buscar := buscar(l^.sig, valor);
end;

{Pues l`.dato no lee nada en tal caso seria l.pri`.dato revisa lo o pasa me todo el programa para poder revisarlo bien y darte una in información mas fiable }
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

lista dinamica

Publicado por pepe (7 intervenciones) el 27/05/2011 16:21:18
Si puedes dejame tu correo y te paso el programa completo si eso

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

lista dinamica

Publicado por ramon (2158 intervenciones) el 27/05/2011 17:40:05
tengo por echo solo corregir los casos que encuentre en la la web del programador y no
en mi correo electrónico para todos los que deseen mi ayuda pasa el programa a la web
y te lo corregiré si hiciera falta o te informare de los errores que tuviera lo siento pero es mejor para todos.
Pues siempre abra otros que puedan ayudar o ser ayudados lo cual es lo que en esta web se intenta
o por lo menos asín lo intento tu mismo decidirás lo que sea de razón para ti suerte
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

lista dinamica

Publicado por pepe (7 intervenciones) el 27/05/2011 17:45:45
OK
pues mira aber esto es lo k tengo:

type puntero = ^nodo;
nodo = record
dato : byte;
sig : puntero;
ant : puntero;
end;
type lista = record
pri : puntero;
ult : puntero;
end;
type fichero = file of byte;

function vacia (var l : lista) : boolean;
begin
vacia := l.pri = nil;
end;

procedure inicializa (var l : lista);
begin
l.pri := nil;
l.ult := nil;
end;

function buscar (l : lista; valor : byte) : boolean;
begin
if vacia (l) then buscar := false
else if l^.dato = valor then buscar := true
else buscar := buscar (l^.sig, valor);
end;

function saca (l : lista) : byte;
var l2 : puntero;
begin
if not vacia(l) then
begin
saca := l.pri^.dato;
l2 := l.pri;
l.pri := l2^.sig;
dispose(l2);
end;
if l.pri = nil then l.ult := nil;
end;

procedure borrar (var l : lista);
begin
while not (vacia(l)) do begin
saca(l);
end;
end;

procedure mete (var l : lista; var valor : byte);
var l2 : puntero;
aux : puntero;
begin
if vacia (l) then begin
new (l2);
l2^.dato := valor;
l.pri := l2;
l.ult := l2;
l2^.dato := valor;
end
else if valor <= l.pri^.dato then begin
new(l2);
l2^.dato:= valor;
l.pri^.ant := l2;
l2^.sig := l.pri;
l.pri := l2;
end
else if valor >= l.pri^.dato then begin
new(l2);
l2^.dato := valor;
l.ult^.ant := l2;
l2^.sig := l.ult;
l.ult := l2;
end
else begin
aux := l.pri;
new(l2);
l2^.dato := valor;
aux^.ant := l2;
l2^.sig := aux;
aux := l2;
end;
end;

Me falta por acer el orden creciente y decreciente, pero eso lo are una vez m vaya esto

aber si m lo pudieras arreglar

GRACIAS POR ANTICIPADO

:)
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

lista dinamica

Publicado por ramon (2158 intervenciones) el 27/05/2011 23:33:59
{revisa los dos códigos para tu mejor interpretación del sistema}

program punteros;
uses
crt;
type
puntero = ^nodo; {puntero de registro}
nodo = record {registro}
dato : byte;
sig : puntero;
ant : puntero;
end;
var
borra, pri, seg, act, ult : puntero; { punteros al puntero de registro}
fichero : file of nodo; {archivo de registros}
i : byte;

function vacia : boolean; {detecta si esta vacio}
begin
vacia := pri = nil;
end;

procedure insertadatos(valor : byte);
begin
if pri = nil then
begin
new(act);
act^.dato := valor; {insertamos el primer valor en el}
act^.sig := nil; {registo}
act^.ant := nil;
pri := act;
ult := act;
end
else
begin
seg := ult;
new(act);
act^.dato := valor;
seg^.sig := act; {insertamos el resto}
act^.sig := nil; {de valores}
act^.ant := seg;
ult := act;
end;
end;

procedure masver;
begin
act := pri;
while act <> nil do
begin
with act^ do {vemos de menos a mas}
writeln(dato);
act := act^.sig;
end;
end;

procedure menosver;
begin
act := ult;
while act <> nil do
begin {vemos de mas a menos}
with act^ do
writeln(dato);
act := act^.ant;
end;
end;

procedure muestra_registros;
var
ch : char;
begin
clrscr;
writeln('Pulse tecas de flecha arriva o avajo para ver o esc salir');
repeat
ch := readkey;
if ch = #72 then
begin
masver;
end; {mostramos los registros}
if ch = #80 then
begin
menosver;
end;
until ch = #27;
end;

procedure buscavalor(valor : byte);
var
sal : boolean;
begin
act := pri;
sal := false;
repeat
with act^ do
if valor = dato then
begin {buscamos un valor dado}
sal := true;
end
else
act := act^.sig;
until (act = nil) or (sal = true);
clrscr;
if sal = true then
writeln('El Valor de la Lista es = ',act^.dato)
else
writeln('El valor no esta en la Lista');
end;

procedure anula_reg(nodocu : puntero; cual : byte);
var
sal : boolean;
begin
act := pri;
sal := false;
repeat
with act^ do
if cual = dato then
begin
sal := true; {anulamos registro dado}
end
else
act := act^.sig;
until (act = nil) or (sal = true);
if sal = true then
begin
nodocu := act;
nodocu^.ant^.sig := nodocu^.sig;
nodocu^.sig^.ant := nodocu^.ant;
dispose(nodocu);
end;
end;

procedure salvadatos(nombre : string);
begin
assign(fichero,nombre); {abrimos el fichero}
{$i-} reset(fichero); {$i+} {y comprovamos si esiste}
if ioresult <> 0 then
begin
rewrite(fichero);
{guardamos los datos} {si no esiste lo creamos}
close(fichero); {y cerramos}
end
else
begin
seek(fichero,filesize(fichero));
{guardamos los datos} {si esiste lo a¤adimos a el}
close(fichero); {y cerramos}
end;
end;

begin
for i := 1 to 20 do
insertadatos(i); {insertamos valores en 1 al 20 registros}
clrscr;
muestra_registros; {mostramos los registros entrados}
clrscr; {de (mas a menos) o de (menos a mas)}
buscavalor(15); {buscamos un numero dado en la lista este es el 15}
anula_reg(borra,15); {anulamos un numero dado o sea un registro el 15}
buscavalor(15); {miramos si lo borro el 15}
muestra_registros; {lo vemos borrado para ver el borrado}
writeln('Pulse enter........');
readln;
end.

{function buscar (l : lista; valor : byte) : boolean;
begin
if vacia (l) then buscar := false
else if l^.dato = valor then buscar := true
else buscar := buscar (l^.sig, valor);
end;

function saca (l : lista) : byte;
var l2 : puntero;
begin
if not vacia(l) then
begin
saca := l.pri^.dato;
l2 := l.pri;
l.pri := l2^.sig;
dispose(l2);
end;
if l.pri = nil then l.ult := nil;
end;

procedure borrar (var l : lista);
begin
while not (vacia(l)) do begin
saca(l);
end;
end;

procedure mete (var l : lista; var valor : byte);
var l2 : puntero;
aux : puntero;
begin
if vacia (l) then begin
new (l2);
l2^.dato := valor;
l.pri := l2;
l.ult := l2;
l2^.dato := valor;
end
else if valor <= l.pri^.dato then begin
new(l2);
l2^.dato:= valor;
l.pri^.ant := l2;
l2^.sig := l.pri;
l.pri := l2;
end
else if valor >= l.pri^.dato then begin
new(l2);
l2^.dato := valor;
l.ult^.ant := l2;
l2^.sig := l.ult;
l.ult := l2;
end
else begin
aux := l.pri;
new(l2);
l2^.dato := valor;
aux^.ant := l2;
l2^.sig := aux;
aux := l2;
end;
end; }

{el sistema como podrás comprobar difiere de tu esquema}
{en el procedimiento mete pones unas comprobaciones que no a zen nada}
{pues te explico el if valor <= l.pri^dato then y if valor >= l.pri^dato then seria como no}
{poner nada y dejar entrada libre pues si en una le dices que lo entre si es mayor o igual}
{en la otra le dices que lo entre si es menor o igual por eso siempre lo entrara con el}
{ultimo párrafo del else te valdría
[observaras que el registro de punteros lo cambio por variables pues el registro en este caso}
{sobra, en el file tienes que guardar el registro no bytes}
{te pongo la forma de guardar los registros por si lo necesitas tengas una ayuda}

{suerte}
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

lista dinamica

Publicado por pe (7 intervenciones) el 28/05/2011 12:10:09
Pero en el saca cuando lo paso a punteros usando la lista m da un error cuando ay un valor introducido. Aunke preferirira que fuera una funcion.

Lo k tengo en el extraer un elemento es esto:

procedure saca(var l : lista; valor : byte);
var
sal : boolean;
act : puntero;
nodocu : puntero;
begin
act := l.pri;
sal := false;
repeat
with act^ do
if valor = dato then
begin
sal := true; {anulamos registro dado}
end
else
act := act^.sig;
until (act = nil) or (sal = true);
if sal = true then
begin
nodocu := act;
nodocu^.ant^.sig := nodocu^.sig;
nodocu^.sig^.ant := nodocu^.ant;
dispose(nodocu);
end;
end;

procedure extrae (var l : lista; var valor : byte);
begin
clrscr;
presenta ('LISTA DINAMICA');
gotoxy (10,8); write ('E X T R A E R E L E M E N T O');
gotoxy (10,9); write ('==============================');
gotoxy (10,11); write ('Que valor quieres extraer: ');
readln (valor);
if vacia (l) then begin
gotoxy (10,13); write ('El valor pedido no esta');
gotoxy (10,15); write ('Pulsa una tecla para continuar...');
readkey;
end
else begin
saca (l, valor);
gotoxy (10,13); write ('El valor se ha extraido correctamente');
gotoxy (10,15); write ('Pulsa una tecla para continuar...');
readkey;
end;
end;
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

lista dinamica

Publicado por pepe (7 intervenciones) el 28/05/2011 13:39:15
me podiar explikar como funciona esto:
y esto: #80 k kiere decir¿?


procedure masver;
begin
act := pri;
while act <> nil do
begin
with act^ do {vemos de menos a mas}
writeln(dato);
act := act^.sig;
end;
end;

procedure menosver;
begin
act := ult;
while act <> nil do
begin {vemos de mas a menos}
with act^ do
writeln(dato);
act := act^.ant;
end;
end;

procedure muestra_registros;
var
ch : char;
begin
clrscr;
writeln('Pulse tecas de flecha arriva o avajo para ver o esc salir');
repeat
ch := readkey;
if ch = #72 then
begin
masver;
end; {mostramos los registros}
if ch = #80 then
begin
menosver;
end;
until ch = #27;
end;
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

lista dinamica

Publicado por ramon (2158 intervenciones) el 28/05/2011 14:26:40
{Los números #72/#80/#27 son los códigos que entrega readkey en ch.
todas tas teclas dan un numero tanto las letras como las numéricas si corresponden
a su carácter por eso es #xx xx = numero si miras el código de teclas o juego de caracteres
ascii veras el valor que tienen tanto hex como decimal este es el decimal.
Algunas teclas tienen delante el carácter #0 por ejemplo las flecha /F1...F12 y otras
para que comprendas un poco esto te dejo este programa del teclado.}


program teclado;
uses
crt, dos;
var
tecla : char;
x, y, nume : integer;
begin
clrscr;
sound(100);
delay(129);
nosound;
x := 1;
y := 3;
nume := 9;
repeat
textcolor(14);
gotoxy(x,y);write(nume);
textcolor(15);
gotoxy(x + 4,y);write(tecla);
inc(nume);
tecla := chr(nume);
inc(y,1);
if y > 34 then
begin
y := 3;
x := x + 12;
end;
until nume > 232;
gotoxy(10,44);
write('pulse una tecla o ESC');
repeat
tecla := readkey;
if tecla = #0 then
begin
tecla := readkey;
gotoxy(20,38);
write(' ');
write(ord(tecla),' ',tecla);
end
else
begin
gotoxy(20,38);
write(' ');
write(ord(tecla),' ',tecla);
end;
until tecla = #27;
end.

{espero esto aclare tus dudas}
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

lista dinamica

Publicado por ramon (2158 intervenciones) el 28/05/2011 14:48:13
procedure masver;
begin
act := pri;
while act <> nil do
begin
with act^ do {vemos de menos a mas}
writeln(dato);
act := act^.sig;
end;
end;

procedure menosver;
begin
act := ult;
while act <> nil do
begin {vemos de mas a menos}
with act^ do
writeln(dato);
act := act^.ant;
end;
end;

{Estos dos procedimientos lo que hacen es recorre la lista de derecha a izquierda o
de izquierda a derecha y presenta los datos solamente lo jaca mente teniendo en cuenta
que presenta todos los registros existentes enlazando los punteros de delante a tras o
de a tras delante como esta en anular registro busca el valor dado y lo anula uniendo
el puntero anterior y posterior al anulado}
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

lista dinamica

Publicado por pepe (7 intervenciones) el 28/05/2011 15:29:57
ok
una kosilla
a la ora de ordenar los elementos introducidos en la lista nose muy bien como enfocarlo, si m pudieras exar una mano.
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

lista dinamica

Publicado por pepe (7 intervenciones) el 28/05/2011 16:03:17
Bueno ya esta resuelto
GRACIAS por tu ayuda
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

lista dinamica

Publicado por ramon (2158 intervenciones) el 28/05/2011 16:42:21
{Procedimiento de ordenación de registros }

procedure ordenar;
var
sigiente, legos : puntero;
termino : boolean;
begin
repeat
act := pri;
seg := nil;
termino := true;
while act^.sig <> nil do
begin
sigiente := act^.sig;
if act^.dato > sigiente^.dato then
begin
termino := false;
if sigiente^.sig <> nil then
begin
legos := sigiente^.sig;
legos^.ant := act;
end
else
legos := nil;
if act^.ant = nil then
begin
pri := sigiente;
seg := nil;
end
else
begin
seg := act^.ant;
seg^.sig := sigiente;
end;
act^.sig := legos;
act^.ant := sigiente;
sigiente^.sig := act;
sigiente^.ant := seg;
act := pri;
end
else
act := act^.sig;
end;
until termino;
ult := act;
end;
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