Einsteiger-Kapitel - Einige Tipps & Tricks

"Verwendung einer Map zur Indexierung einer verketteten Liste"

Verkettete Listen (englisch "Linked list") bieten eine leistungsfähige Möglichkeit, ein strukturiertes Ablagesystem zu bauen - aber sie haben einen Nachteil. Wenn Sie nicht sicher sind, wo genau in der Liste ein bestimmtes Element ist, müssen Sie jeden Eintrag in der Liste prüfen, um den richtigen zu finden.

Maps bieten auch eine ähnliche Funktion, werden aber stattdessen durch einen Schlüssel-Wert (englisch "Key value") indiziert. Aber auch sie haben einen Nachteil: sie verwalten nicht die Reihenfolge, in der Elemente in die Liste eingefügt werden.

Doch durch Verwendung einer Kombination von beiden können Sie geschickt beide dieser Probleme vermeiden...

Dieses Beispiel lädt eine strukturierte verkettete Liste von Buch-Daten und erstellt einen Index von ISBN-Nummern mittels einer Map. Dann demonstriert es, wie auf die verkettete Liste mittels des Index in der Map zugegriffen wird.
  EnableExplicit
  
  ; Eine Buch-Katalog Struktur.
  Structure BOOK
    Title.s
    Author.s
    ISBN13.s
    Price.d
  EndStructure
  
  ; Erstellen einer Liste zum Speichern der Katalogeinträge.
  NewList Catalog.BOOK()
  ; Erstellen einer Map zum Speichern des ISBN Index.
  NewMap ISBN13.l()
  ; Weitere Variablen.
  Define.l Count, Index
  Define.s ISBN
  
  ; Fügt ein leeres Element am Anfang der Liste hinzu.
  ; Das erste Element in einer verketteten Liste wird mit Null nummeriert, und die Map wird
  ; Null zurückgeben, wenn ein angeforderter Eintrag nicht vorhanden ist.
  ; Dieses leere Element vermeidet ein potentielles Problem mit der Rückgabe eines falschen
  ; Verweises auf den ersten Katalogeintrag.
  AddElement(Catalog())
  
  For Count = 1 To 5
    
    ; Lesen der Daten aus der Tabelle in die Liste.
    AddElement(Catalog())
    Read.s Catalog()\Title
    Read.s Catalog()\Author
    Read.s Catalog()\ISBN13
    Read.d Catalog()\Price
    
    ; Indexieren der ISBN in der Map.
    ISBN13(Catalog()\ISBN13) = ListIndex(Catalog())
    
  Next Count
  
  ; Finden eines Eintrags.
  ISBN = "978-0340896983"
  Index = ISBN13(ISBN)
  
  If Index > 0
    Debug "Book with ISBN13 " + ISBN + " is at list index " + StrU(Index) + "."
    Debug ""
    
    ; Wir können nun direkt das richtige Listenelement auswählen, ohne eine Suche durchführen zu müssen.
    SelectElement(Catalog(), Index)
    Debug "'" + Catalog()\Title + "' by " + Catalog()\Author
    Debug "ISBN: " + Catalog()\ISBN13
    Debug "Price: " + StrD(Catalog()\Price, 2)
    
  Else
    Debug "No book with that ISBN in the catalog."
    
  EndIf
  
  End
  
  ; Einige Test-Daten.
  DataSection
    
    BookData:
    
    Data.s "Carte Blanche", "Jeffery Deaver", "978-1444716474"
    Data.d 19.99
    
    Data.s "One Day", "David Nicholls", "978-0340896983"
    Data.d 7.99
    
    Data.s "Madeleine", "Kate McCann", "978-0593067918"
    Data.d 20.00
    
    Data.s "The Dukan Diet", "Dr Pierre Dukan", "978-1444710335"
    Data.d 8.99
    
    Data.s "A Game of Thrones", "George R. R. Martin", "978-0006479888"
    Data.d 9.99
    
    Data.s "The Help", "Kathryn Stockett", "978-0141039282"
    Data.d 8.99
    
  EndDataSection

Einsteiger-Kapitel Navigation

< Vorheriges: Fortgeschrittene Funktionen | Überblick