Pascal/Turbo Pascal - Urgente, metodos de Ordenamiento con PUNTEROS

 
Vista:

Urgente, metodos de Ordenamiento con PUNTEROS

Publicado por Dj luvex (15 intervenciones) el 05/07/2001 21:15:37
Quisiera saber si alguien tiene algun codigo hecho para poder ordenar en forma ascendente listas enlazadas. Ojala que sea antes del Viernes 6 de Julio. Porque tengo el ultimo Certamen de un Ramo.
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:Urgente, metodos de Ordenamiento con PUNTEROS

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:34:12
Aqui te va una funcion para insertar elementos ordenadamente en una lista doblemente enlazada, no creo que entre el codigo y los comentarios se entiene bien, sino comenta aqui las dudas.....
te pongo tb un par de funciones mas que utiliza la de insertar, una es pos_inser(), que busca la posicion en la que se debe intertar el nodo y otra crear_nodo(), que crea un nuevo nodo a partir de los datos y un puntero.... (si estas familiarizado con implementaciones de listas enlazadas te parecera todo familiar, espero)
te lo pongo por capitulos en varios mesajes, por que uno solo no me cabe... ;)
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:Urgente, metodos de... Continuacion I

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:36:00
FUNCTION haymemoria:boolean;
{OBJETIVO: Determinar si hay suficiente memoria para crear un nodo
SALIDAS: true -> si hay suficiente memoria
false -> en caso contrario }
BEGIN
haymemoria:=maxavail>=sizeof(tnodo);
END; {haymemoria}

FUNCTION crear_nodo(datos:tinfo;var nuevo:tpos):boolean;
{OBJETIVO: crear un nuevo nodo de contenido 'datos'
ENTRADAS: datos -> contenido del nuevo nodo
nuevo -> variable para crear el nodo
SALIDAS: true -> si se pudo crear el nodo
false -> en caso contario (no hubo memoria suficiente para crearlo) }
BEGIN
if haymemoria
then begin
new(nuevo);
with nuevo^ do begin
info:=datos;
sig:=nulo;
ant:=nulo;
end; {with}
crear_nodo:=true;
end {then}
else crear_nodo:=false;
END; {crear_nodo}
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:Urgente, metodos de... Continuacion II

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:36:58
FUNCTION pos_inser(datos:tinfo;lista:tlista):tpos;
{OBJETIVO: Buscar la posicion de insercion de un nodo, en relacion a a su contenido
ENTRADAS: datos -> contenido del nodo
lista -> puntero a inicio de lista
SALIDAS: posicion en la que se debe insertar el nodo
en si se debe insertar al final de la lista }

VAR aux:tlista;

BEGIN
aux:=nulo;
while (datos.pri < lista^.info.pri) and (lista^.sig<>nulo) do
begin
aux:=lista;
lista:=lista^.sig;
end;
if datos.pri < lista^.info.pri
then aux:=lista;
pos_inser:=aux;

END; {pos_inser}
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:Urgente, metodos de... Continuacion III

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:48:49
FUNCTION insertar_ordenado(datos:tinfo;var lista:tlista):boolean;
{OBJETIVO: insertar un nuevo nodo el una lista, de forma ordenada con respecto a un criterio dado
ENTRADAS: datos -> contenido del nuevo nodo, que se usa como criterio para la ordenacion
lista -> lista en la que se insertara el nodo
SALIDAS: lista con nuevo elemento
true -> si se pudo realizar la insercion
false -> en caso contario
PosCD: lista contiene un nuevo elemento }
VAR
aux,nuevo:tpos;
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:Urgente, metodos de... Continuacion IV

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:50:42
BEGIN
if crear_nodo(datos,nuevo)
then begin
if es_vacia(lista)
then lista:=nuevo
else begin
aux:=pos_inser(datos,lista);
if aux=nulo
then begin
nuevo^.sig:=lista;
lista^.ant:=nuevo;
lista:=nuevo;
end {then}
else begin
nuevo^.sig:=aux^.sig;
nuevo^.ant:=aux;
if aux^.sig<>nulo
then aux^.sig^.ant:=nuevo;
aux^.sig:=nuevo;
end; {else}
end; {else}
insertar_ordenado:=true;
end {then}
else begin
writeln('ERROR - Memoria insuficiente');
insertar_ordenado:=false;
end; {else}
END; {insertar_ordenado}

perdona, el desorden pero no cabe una put... funciona en un solo post
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:Urgente, metodos de... Continuacion IV

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:50:47
BEGIN
if crear_nodo(datos,nuevo)
then begin
if es_vacia(lista)
then lista:=nuevo
else begin
aux:=pos_inser(datos,lista);
if aux=nulo
then begin
nuevo^.sig:=lista;
lista^.ant:=nuevo;
lista:=nuevo;
end {then}
else begin
nuevo^.sig:=aux^.sig;
nuevo^.ant:=aux;
if aux^.sig<>nulo
then aux^.sig^.ant:=nuevo;
aux^.sig:=nuevo;
end; {else}
end; {else}
insertar_ordenado:=true;
end {then}
else begin
writeln('ERROR - Memoria insuficiente');
insertar_ordenado:=false;
end; {else}
END; {insertar_ordenado}

perdona, el desorden pero no cabe una put... funcion en un solo post
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:Urgente, metodos de... Continuacion V

Publicado por Kaiser (33 intervenciones) el 05/07/2001 22:53:45
Y por ultimo ya, que se me olvido decirlo al principio, en las listas, la ordenacion se hace insertando los elementos ordenadamente en sus posiciones correspondientes; no como en los array que se puede insertar como nos de la gana y luego reordenar todo; esto se hace, no por que no se pueda hacer como en los arrays, sino para ganar tiempo de ejecucion, ya que reordenar toda un lista continuamente seria un grandisima perdida de tiempo, y si se usan punteros es precisamente para obtener un mejor rendimiento en los programas.....
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