Pascal/Turbo Pascal - Ordenamiento listas doblemente enlazadas

 
Vista:
sin imagen de perfil

Ordenamiento listas doblemente enlazadas

Publicado por Martín (2 intervenciones) el 16/03/2015 02:06:05
Buenas! Ando teniendo un problema para insertar datos ordenados en una lista doblemente enlazada,
para números menores o iguales al primero de todos ingresado, anda perfecto, pero cuando quiero ingresar un número mayor al primero ingresado, me tira exit code = 216
Acá dejo el código, si lo pueden corregir o darme un código para hacerlo más eficiente, genial.
Saludos!

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
procedure insertarOrdenado(var LD: ListaD; e: integer);
        var
                paux, pc, nuevo: ListaD;
begin
 
                new(nuevo);
                nuevo^.dato:= e;
                pc:= LD;
 
                paux:= nil;
                while (pc<>nil) and (pc^.dato<e) do begin
                        paux:= pc;
                        pc:= pc^.psig;
                end;
 
                if (LD=nil) or (pc^.pant=nil) then begin
                                nuevo^.pant:= nil;
                                nuevo^.psig:= LD;
 
                                if (LD<>nil) then LD^.pant:= nuevo;
 
                                LD:= nuevo;
                        end
                else
                        begin
 
                                nuevo^.psig:= pc;
 
                                if (pc<>nil) then pc^.pant:= nuevo;
 
                                paux^.psig:= nuevo;
                                nuevo^.pant:= paux;
                end;
 
end;
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 listas doblemente enlazadas

Publicado por ramon (2158 intervenciones) el 17/03/2015 10:54:04
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
{Mira esto a ver si te sirve}
 
program punteros;
   uses
      crt;
   type
     pnum = ^datonum;
     datonum = record
           numero : integer;
           sig, ant : pnum;
        end;
 
   var
      actual, primero, ultimo, anterior : pnum;
      dnum : integer;
 
   procedure entradadato(var d : integer);
   begin
       write('  Entre Numero : ');
       readln(d);
   end;
 
   procedure asignacion;
   var
      coloc, temp : pnum;
      orde : integer;
   begin
      entradadato(dnum);
      if primero = nil then
      begin
        new(actual);
        actual^.numero := dnum;
        actual^.sig := nil;
        actual^.ant := nil;
        primero := actual;
        ultimo := actual;
      end
   else
       begin
           anterior := ultimo;
           new(actual);
           actual^.numero := dnum;
           anterior^.sig := actual;
           actual^.sig := nil;
           actual^.ant := anterior;
           ultimo := actual;
          end;
          temp := primero;
          while temp <> nil do
          begin
             coloc := temp^.sig;
             while coloc <> nil do
             begin
                if coloc^.numero < temp^.numero then
                begin
                   orde := coloc^.numero;
                   coloc^.numero := temp^.numero;
                   temp^.numero := orde;
                end;
                coloc := coloc^.sig;
             end;
               temp := temp^.sig;
          end;
      end;
 
   procedure lista;
   var
     tempo : pnum;
     begin
       tempo := primero;
       while tempo <> nil do
       begin
         write('  ',tempo^.numero);
         tempo := tempo^.sig;
       end;
       readkey;
     end;
 
   procedure menu;
   var
     sal : boolean;
     tecla : char;
    begin
       sal := false;
       repeat
       clrscr;
       writeln('    ***** Menu Jeneral *****');
       writeln;
       writeln('   [E]=Entrada Numero');
       writeln('   [M]=Mostrar Numeros');
       writeln('   [S]=Salir');
       writeln;
       writeln('   <<<<<< Elija Opcion >>>>>>');
       repeat
          tecla := upcase(readkey);
       until tecla in['E','M','S'];
       clrscr;
    case tecla of
  'E' : asignacion;
  'M' : lista;
  'S' : sal := true;
    end;
       until sal = true;
    end;
 
 
   begin
      primero := nil;
      ultimo := nil;
      menu;
   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
sin imagen de perfil

Ordenamiento listas doblemente enlazadas

Publicado por Martín (2 intervenciones) el 17/03/2015 19:43:45
Muchas gracias por la respuesta, funciona perfecto tu código, pero finalmente acabo de resolverlo cambiando la linea
1
if (LD=nil) or (pc^.pant=nil) then begin

por

1
if (LD=nil) or (paux=nil) then begin

Lo que me estaba causando el error era, que al estar al final de la lista y verificar en la comparación
si el nuevo nodo iba como primer elemento, como pc=nil entonces me daba error al tratar de acceder a un campo del puntero pc que estaba nulo. Saludos!
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

Ordenamiento listas doblemente enlazadas

Publicado por ramon (2158 intervenciones) el 17/03/2015 23:11:08
Me alegro que el problema se a ya resuelto,
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