Listas vinculadas
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | Uses Crt; Type PRec = ^Rec; Rec = Record Num: Integer; Next: PRec; End; Procedure Insertar(Var Prim: PRec; Elem: Integer); Var L: PRec; BeginIf Prim = Nil Then {¨No tiene elementos?} Begin New(Prim); Prim^.Num:= Elem; Prim^.Next:= Nil; End Else {S¡ los tiene} Begin L:= Prim; {Me voy al primer elemento} While L^.Next <> Nil Do {Me desplazo hasta encontrar un nodo sin "siguiente"} L:= L^.Next; New(L^.Next); {Alojo memoria para el nuevo nodo "siguiente"} L:= L^.Next; {Entro al nodo nuevo} L^.Num:= Elem; {Escribo el valor a insertar en el nodo nuevo} L^.Next:= Nil; {Establezco como "Nil" al siguiente del nodo nuevo} End;End; Procedure Mostrar(L: PRec); Var Cont: Integer; BeginCont:= 0; While L <> Nil Do Begin Inc(Cont); WriteLn('El elemento ',cont,' es: ',L^.Num); L:= L^.Next; End; End; Procedure Eliminar(Var Prim: PRec; Elem: Integer);Var L,Prev: PRec; Seguir: Boolean; Begin Prev:= Nil; If Prim <> Nil Then {La idea es eliminar solo si la lista tiene algun elemento} Begin L:= Prim; Seguir:= True; While Seguir Do Begin If L^.Num = Elem Then {¨Encontr‚ el elemento?} Begin {Elimina un nodo liberando su memoria y corrigiendo la lista. No es la pr ctica m s recomendable ya que hace que quede fragmentada la memoria de trabajo (Heap), pero servir para entender la idea, aunque mejor ser¡a que en el momento de eliminar los datos el programa corra los datos que le siguen al nodo a eliminar "uno para adelante" y finalmente eliminar el ultimo nodo} If L = Prim Then {Es el primero?} Begin {Si, libero la memoria del primer nodo y establezco como primero al que sigue.} Prim:= L^.Next; Dispose(L); Seguir:= False; End Else {No es el primero} Begin Prev^.Next:= L^.Next; {El siguiente del anterior ser el siguiente del nodo a eliminar} Dispose(L); {Libero la memoria del nodo a eliminar} Seguir:= False; End; End; Prev:= L; L:= L^.Next; If L = Nil Then Seguir:= False; End; End;End; {Igual que "Eliminar" pero a la hora de borrar mueve los datos de los nodos y libera la memoria del £ltimo nodo *Recomendado para evitar la fragmentacion de la memoria*}Procedure Eliminar_2(Var Prim: PRec; Elem: Integer); Var L,Prev: PRec; Seguir: Boolean; Begin Prev:= Nil;If Prim <> Nil Then {La idea es eliminar solo si la lista tiene algun elemento} Begin L:= Prim; Seguir:= True; While Seguir Do Begin If L^.Num = Elem Then {¨Encontr‚ el elemento?} Begin While L^.Next <> Nil Do Begin L^.Num:= L^.Next^.Num; Prev:= L; L:= L^.Next; End; If L = Prim Then Begin Dispose(Prim); Prim:= Nil; End Else Begin Dispose(L); Prev^.Next:= Nil; End; Seguir:= False; End Else Begin Prev:= L; L:= L^.Next; If L = Nil Then Seguir:= False; End; End; End; End; {Ordena los elementos de la lista simple, utilizando m‚todo de selecci¢n (Por ser el m s facil para ordenar). Para ordenar los elementos solo muevo los datos sin tocar los nodos.} Procedure Ordenar(Var Prim: PRec); Var L,L2: PRec; Inter: Integer;Begin L:= Prim; While L <> Nil Do Begin L2:= L^.Next; While L2 <> Nil Do Begin If L^.Num > L2^.Num Then Begin Inter:= L^.Num; L^.Num:= L2^.Num; L2^.Num:= Inter; End; L2:= L2^.Next; End; L:= L^.Next; End; End; Var Prim: PRec;C: Char; Num: Integer; Begin Prim:= Nil; C:= '1';While C <> '4' Do Begin ClrScr; Mostrar(Prim); WriteLn; WriteLn('1- Insertar elemento'); WriteLn('2- Eliminar'); WriteLn('3- Ordenar'); WriteLn('4- Salir'); WriteLn; C:= ReadKey; If C = '1' Then Begin Write('Ingrese el valor a insertar: '); ReadLn(Num); Insertar(Prim,Num); End; If C = '2' Then Begin Write('Ingrese el valor que desea eliminar: '); ReadLn(Num); Eliminar(Prim,Num); End; If C = '3' Then Ordenar(Prim); End;End. |
¿Has encontrado algún error? ¿Tienes la solución? Dejame tu correción ;-)
Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.
Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:
- Si es lenguaje C <code lang="c">Código en C</code>
- Si es lenguaje Pascal <code lang="pascal">Aquí dentro el código de Pascal</code>.
De esta manera el código coloreas el código.
Otro punto importante para muchos que crees que te he ignorado: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:Me reservo el derecho de alterar, publicar o no los comentarios así como también cambiar mis condiciones en el momento que yo lo requiera.
¿Si estas de acuerdo? Adelante! que ya te he quitado bastante tiempo leyendo esta basura :)