¿Confundidos? Pues agárrense, que vienen curvas.
Estoy leyendo
Algoritmos + Estructuras de datos = Programas, del bueno de Kiklaus Wirth, porque encontré una primera edición en inglés (como curiosidad, fue el libro que provocó que Anders Hejlsberg escribiera Turbo Pascal 1.0).
La cosa es que me he atascado con un concepto en la página 19, porque por más vueltas que le doy no entiendo qué dice. Está hablando de registros (record) y listas, y habla de que se puede crear una lista doblemente enlazada añadiendo un campo más y haciendo una suma o una resta. El texto original:
No incluye código de ejemplo. He probado varias implementaciones a ver si así lograba entender algo, pero no hay manera: no consigo que recorra toda la lista ni para atrás ni para delante. Pongo la primera que hice, que es la más naïf, para que veáis la estructura básica.
Código Delphi
[-]
program RegsistrosEnlazados;
type
TSexo = (Masculino, Femenino);
TPersona = record
Nombre: String;
Sexo: TSexo;
Link: Integer
end;
var
Personas: array [1..10] of TPersona = (
(Nombre: 'Carolyn'; Sexo: Femenino; Link: 2),
(Nombre: 'Chris'; Sexo: Masculino; Link: 2),
(Nombre: 'Tina'; Sexo: Femenino; Link: 5),
(Nombre: 'Robert'; Sexo: Masculino; Link: 3),
(Nombre: 'Jonathan'; Sexo: Masculino; Link: 3),
(Nombre: 'Jennifer'; Sexo: Femenino; Link: 5),
(Nombre: 'Raytheon'; Sexo: Masculino; Link: 5),
(Nombre: 'Mary'; Sexo: Femenino; Link: 3),
(Nombre: 'Anne'; Sexo: Femenino; Link: 1),
(Nombre: 'Mathias'; Sexo: Masculino; Link: 3)
);
function SiguienteIndice (x, y: Integer): Integer;
begin
SiguienteIndice := x + Personas[y].Link
end;
function AnteriorIndice (x, y: Integer): Integer;
begin
AnteriorIndice := x - Personas[y].Link
end;
var
Ndx: Integer;
begin
Ndx := 1;
repeat
WriteLn ('Nombre: ', Personas[Ndx].Nombre);
Ndx := SiguienteIndice (Ndx - 1, Ndx)
until (1 > Ndx) or (Ndx > High (Personas))
end.
De ahí he intentado varias cosas bastante más complejas, como intentar llevar la cuenta del elemento anterior (I^k-1) y el actual (i^k), pero no lo pillo.
Tampoco me va la vida en ello, pero si alguien me da una pista, o una implementación que funcione, pues se agradecerá. Yo, de momento, me paso al capítulo siguiente, que la neurona no me da para más.