Programación General > Pascal

 Re: Ordenacion Por Selección

(1/3) > >>

thot_ohm:
Buenas.

Ante todo, como siempre, gracias al que se tome su tiempo en leer y tratar de ayudarme en ésta duda que paso a explicar.

Tengo una lista enlazada creada con punteros cuya estructura es:

--- Código: Text --- type  TipoNombre = String[15];        TipoClave = string[3];  TipoSector = String[2];  TipoHabitantes = integer;  PunteroLista = ^NodoLista;        NodoLista = record    Nombre : TipoNombre;                Clave : TipoClave;                Sector : TipoSector;                Habitantes : TipoHabitantes;                Sig : PunteroLista;        end;        TipoListaEnlazada = PunteroLista; var        Lista : TipoListaEnlazada;  Sé que los campos de datos del puntero los puedo meter en un solo tipo record, pero quise postearlo así, pues para ver si quedaba más claro.

Ok. Creo mi lista y empiezo a meter datos como un degenerado  :comp: . La muestro en pantalla y perfecto, se muestran en orden inverso en el que yo los introduje ya que el procedimiento de inserción lo hace al principio de la lista (deliberadamente).

Seguidamente, se me pide ordenar la lista generada mediante diferentes métodos (inserción, selección, burbuja...). Ahora estoy con el procedimiento de selección y es acá donde tengo el problema. He revisado el código, y hasta donde me llegan mis conocimientos, parece estar bien, pero cuando imprimo la lista después de haber ejecutado el procedure, ésta sigue estando igual de desordenada. Éste es el procedure:


--- Código: Text --- procedure Seleccion (var Lista : TipoListaEnlazada); var  Ref, Next : PunteroLista; begin  if not ListaVacia(Lista) then  begin    Ref := Lista;    repeat      Next := Ref^.Sig;      while Next <> nil do      begin        if Ref^.Nombre > Next^.Nombre then Cambiar(Ref, Next);        Next := Next^.Sig;      end;      Ref := Ref^.Sig;    until Ref = nil;  end  else  begin    writeln ('La lista esta vac¡a. No hay elementos para ordenar');    readln;  end;end;  
El procedure Cambiar es este:


--- Código: Text --- procedure Cambiar (var Mayor, Menor : PunteroLista); var  Aux : PunteroLista;begin  new(Aux);  Aux^.Sig := Mayor^.Sig;  Mayor^.Sig := Menor^.Sig;  Menor^.Sig := Aux^.Sig;  dispose(Aux);end;  
El campo clave para ordenar, como puede verse, es el nombre de la ciudad. Yo estoy haciendo las comparaciones directas ya que leí por ahí que pascal reconoce a>b o luis<diana.

No sé si estoy pasando bien la lista por valor (si es que esto se puede) o es que debo crear una nueva lista con los nuevos valores ordenados (cosa que me parece que carece de valor), o no estoy haciendo correctamente el intercambio de los nodos en el procedimiento Cambiar.

Estoy nuevo en esto de los punteros y estoy bastante enredado. El procedimiento Selección está adaptado de un procedimiento de ordenación por selección creado para arrays unidimensionales y aunque ustedes probablemente lo vean fácil, a mi me costó bastante debido a mi inexperiencia y debido a ella, no me extrañaría que tuviera algo malo  :rolleyes: .

Bueno, creo que eso es. Gracias, de nuevo, a todos por su atención y perdón por el ladrillito.

thot_ohm:
Ya comprobé que Pascal permite comparaciones directas sobre los tipos string (tenía duda en eso. Acá está el código con el que probé esto:


--- Código: Text --- program ordenacadena; var  a, b : string; begin  writeln('primera cadena: ');  readln(a);  writeln('segunda cadena: ');  readln(b);        if a &#60; b then writeln(a, ' est  antes en el abecedario que ', b);        if a &#62; b then writeln(b, ' est  antes en el abecedario que ', a);  readln;end.  

thot_ohm:
Modifiqué el procedimiento de ordenación por selección usando bucles for.


--- Código: Text --- procedure Seleccion (var Lista : TipoListaEnlazada); var  Ref, Next : PunteroLista;  N, J, I : byte; begin  if not ListaVacia(Lista) then  begin    Ref := Lista;    N := Longitud(Lista);    for I := 1 to N-1 do    begin      Next := Ref^.Sig;      for j := I + 1 to N do      begin        if Ref^.Datos.Nombre &#62; Next^.Datos.Nombre then Cambiar(Lista, Ref, Next);        Next := Next^.Sig;      end;      Ref := Ref^.Sig;    end;            end  else  begin    writeln ('La lista est  vac¡a. No hay elementos para ordenar');    readln;  end;        ImprimeLista(Lista);end;  
Longitud es una función que devuelve el número de nodos de la lista enlazada. Acá está el código:


--- Código: Text --- function Longitud (Lista: TipoListaEnlazada): byte;  var    n: PunteroLista;    i: word;  begin    n := Lista;    i := 0;    while n &#60;&#62; nil do      begin        n := n^.sig;        i := i + 1      end;    Longitud := i  end;  
Ok. Sigo teniendo el mismo error: La lista sigue desordenada. Intuyo que el error, proviene del procedimiento cambiar. Probando, lo cambié por éste:


--- Código: Text --- procedure Cambiar (var Lista : TipoListaEnlazada; var Mayor, Menor : PunteroLista); var  Aux : PunteroLista;begin  new(Aux);  Aux := Mayor;  Mayor := Menor;  Menor := Aux;  dispose(Aux);end;  
pero sigue estando la lista desordenada.

Por favor, alguna sugerencia?

thot_ohm:
Nadie me puede sugerir nada?

He estado dándole vueltas a la cosa. Supongamos que mi lista enlazada es esta:

rosa->alberto->luis->nil

Queremos intercambiar rosa con alberto. Debería asignar a rosa la dirección a la que apunta alberto. Esto sería: rosa^.sig := alberto^.sig y a alberto asignarle la dirección que tiene rosa ahora y alberto pasaría a ser la cabecera de la lista. Ok, no estoy seguro de cómo hacer esto.

Sugerencias???

Enko:

--- Citar ---Queremos intercambiar rosa con alberto. Debería asignar a rosa la dirección a la que apunta alberto. Esto sería: rosa^.sig := alberto^.sig y a alberto asignarle la dirección que tiene rosa ahora y alberto pasaría a ser la cabecera de la lista. Ok, no estoy seguro de cómo hacer esto.

--- Fin de la cita ---


--- Citar ---rosa->alberto->luis->nil

--- Fin de la cita ---
Supongo que ser'ia como intercambiar variables>

punteroTemporal := rosa.sig;
rosa.sig := alberto.sig;
alberto.sig := punteroTemporal;
punteroTemporal := nil;

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa