/** * Beispiel aus * * - Algorithmen und Datenstrukturen für Dummies * - von Andreas Gogol-Döring und Thomas Letschert * - Verlag Wiley-VCH; Oktober 2019 * - Kapitel 3, Daten und ihre Struktur * * @author A. Gogol-Döring, Th. Letschert */ import Foundation struct AuD_03_03_FListPTR { /* * Swift ist keine Sprache für die Systemprogrammierung. Zeiger sind darum kein Sprachelement. * Um den Algorithmus zu implementieren nutzen wir unser Wissen über die Referenz-Semantik von Swift aus, * nach der Instanzen einer Klasse über Zeiger (Referenzen) eingebunden werden. * Der null-Zeiger wird als nil - Abwesenhaeit eines Wertes - dargestellt. */ typealias Ptr = Cell? // optional zur emulation des null-Zeigers class Cell { let v: Int var n: Ptr init(v: Int, n: Ptr) { self.v = v self.n = n } } static func FList(n: Int) -> Ptr { var l: Ptr = nil var f: Int = 1 for i in 1 ... n { l = Cell(v: f, n: l) f = f * i } return l } static func FListAE(n: Int) -> Ptr { var a: Ptr = nil var e: Ptr = nil for i in 0 ... n { if (i == 0) { a = Cell(v: 1, n: nil) e = a } else { let t = Cell( v: (e?.v ?? -1) * i, n: nil) e?.n = t e = t } } return a } static func run() { var ptr = FList(n: 10) while (ptr != nil) { print(ptr?.v ?? -1) ptr = ptr?.n } print() ptr = FListAE(n: 10) while (ptr != nil) { print(ptr?.v ?? -1) ptr = ptr?.n } } }