Programación General > Pascal
Re: Ordenacion Por Selección
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 < b then writeln(a, ' est antes en el abecedario que ', b); if a > 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 > 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 <> 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
[#] Página Siguiente
Ir a la versión completa