Pascal/Turbo Pascal - Ordenamiento en lista encadenada simple

 
Vista:

Ordenamiento en lista encadenada simple

Publicado por Nicolás (1 intervención) el 15/11/2015 16:01:44
Hola a todos, Alguien sabe si existe alguna forma sencilla de volver al inicio de una lista encadenada simple? Tengo que ordenar una por el método de burbujas pero mi código solo ordena un ciclo, es decir llega hasta el final, ordena lo que puede ahi y termina, no repite ciclos para volver a ordenar. Por ejemplo, Si en la lista hay 1 3 2 0 me devuelve 1 2 0 3 y no 0 1 2 3 que sería lo normal.
Yo tengo tres punteros: Inicio, actual y siguiente
Inicio está siempre apuntando al comienzo de la lista y no se modifica, actual y siguiente se encargan de ir comparando los nodos dos a dos e intercambiarse si se cumple la condición.
Tengo armado un while que se encarga de recorrer la lista y cada vez que debe intercambiar un nodo, suma uno a una variable contador, cuando termina el ciclo ese contador se guarda en un auxiliar, el contador vuelve a 0 para verificar cambios en el proximo ciclo y se repite (en teoría) el proceso, el ciclo while se rompe cuando el auxiliar es 0 (porque el contador de intercambios es 0 y al final del ciclo se pasa al auxilar)
yo lo que hago es, cuando llega al final de la lista, apuntar Actual y siguiente a Inicio así:
Actual := Inicio;
Siguiente : Inicio;
pero no hace nada, como dije llega al final ordenando lo que puede y no hace mas nada. Alguna ayuda para volver al inicio de la lista para volver a ordenar?

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

Ordenamiento en lista encadenada simple

Publicado por ramon (2158 intervenciones) el 21/11/2015 11:03:08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
{Mira esto}
 
uses
    crt;
  type
     punteroejemp = ^ejemplo;
     ejemplo = record
           datos : integer;
           sig : punteroejemp;
         end;
    var
     temp, prime, anter, actu : punteroejemp;
     j, g, i : integer;
     sal : boolean;
     nume :  array[1..15] of integer;
 
   procedure entramosdatos(d : integer);
   begin
       with actu^ do
       begin
          datos := d;
       end;
   end;
 
   procedure otroregistroentra(h : integer);
   begin
   if prime = nil then
   begin
       new(actu);
       entramosdatos(h);
       prime := actu;
       actu^.sig := nil;
      end
   else
      begin
          anter := actu;
          new(actu);
          entramosdatos(h);
          anter^.sig := actu;
          actu^.sig := nil;
      end;
    end;
 
    procedure listardatos;
    var
      ver : punteroejemp;
      bb : integer;
    begin
       bb := 0;
       ver := prime;
       while ver <> nil do
       begin
          bb := bb + 1;
          with ver^ do
          writeln('    ',bb,'   ',datos);
          ver := ver^.sig;
        end;
        writeln;
        writeln('    Pulse [Enter]');
        readln;
     end;
 
  procedure ordena_punteros;
  var
    orde, tem : punteroejemp;
    can : integer;
   begin
      tem := prime;
     while tem <> nil do
     begin
        orde := tem^.sig;
        while orde <> nil do
        begin
           if tem^.datos > orde^.datos then
           begin
              can := tem^.datos;
              tem^.datos := orde^.datos;
              orde^.datos := can;
           end;
           orde := orde^.sig;
        end;
        tem := tem^.sig;
     end;
   end;
 
 
 begin
       prime := nil;
       randomize;
       for i := 1 to 15 do
       begin
     repeat
       sal := true;
       g := random(20);
       for j := 1 to 15 do
       begin
         if nume[j] = g then
         sal := false;
       end;
    until sal = true;
    nume[i] := g;
   end;
       for g := 1 to 15 do
       otroregistroentra(nume[g]);
       clrscr;
       writeln;
       writeln('     Sin Ordenar');
       writeln;
       listardatos;
       writeln('     Ordenados Ordenar');
       writeln;
       ordena_punteros;
       writeln;
       listardatos;
   end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar