Eine verknüpfte Liste kann verwendet werden, wenn Sie Elemente billig einfügen und löschen möchten und es keine Rolle spielt, dass die Elemente im Speicher nicht nebeneinander liegen.
Dies ist sehr abstrakt und ich möchte eine konkrete Erklärung dafür, warum eine verknüpfte Liste anstelle eines Arrays verwendet werden sollte. Ich bin nicht sehr erfahren im Programmieren, daher habe ich nicht viel (wenn überhaupt) Praxiserfahrung.
data-structures
linked-list
richtig falten
quelle
quelle
Antworten:
Hier liegt etwas zwischen einem Beispiel und einer Analogie. Sie müssen noch ein paar Besorgungen erledigen, schnappen sich also ein Stück Papier und schreiben:
Dann erinnerst du dich, dass du auch Briefmarken kaufen musst. Aufgrund der geografischen Lage Ihrer Stadt müssen Sie dies nach der Bank tun. Sie können Ihre gesamte Liste auf ein neues Blatt Papier kopieren:
oder du könntest auf den kritzeln, den du hattest:
Wenn Sie an andere Besorgungen denken, können Sie sie am Ende der Liste schreiben, aber mit Pfeilen, die Sie daran erinnern, in welcher Reihenfolge Sie sie ausführen sollen. Dies ist eine verknüpfte Liste. Es ist schneller und einfacher als jedes Mal, wenn Sie etwas hinzufügen, die gesamte Liste zu kopieren.
Dann klingelt dein Handy, während du bei der Bank bist. "Hey, ich habe die Briefmarken, nimm nicht mehr ab." Sie streichen STAMPS einfach von der Liste, Sie schreiben kein ganz neues ohne STAMPS.
Jetzt können Sie tatsächlich eine Besorgungsliste im Code implementieren (möglicherweise eine App, mit der Ihre Besorgungen anhand Ihrer geografischen Lage in eine geordnete Reihenfolge gebracht werden), und es besteht eine vernünftige Chance, dass Sie tatsächlich eine verknüpfte Liste für diese Liste im Code verwenden. Sie möchten viele Elemente hinzufügen und entfernen sowie wichtige Informationen bestellen, möchten jedoch nicht nach jedem Einfügen oder Löschen die gesamte Liste neu kopieren.
quelle
quelle
Der "Aufruf-Stapel" der C-Sprache ist als verknüpfte Liste in den x86-Binär-APIs (und den meisten anderen APIs) implementiert .
Das heißt, der Aufruf von Prozeduren in der C-Sprache folgt einer First-In-Last-Out-Disziplin. Das Ergebnis der Ausführung (möglicherweise rekursiver) Funktionsaufrufe wird als "Aufrufstapel" oder manchmal auch nur als "Stapel" bezeichnet.
Die
CALL
x86-Anweisung implementiert schließlich eine verknüpfte Liste mithilfe des "Aufrufstapels". EinCALL
Befehl überträgt den Inhalt des% EIP-Registers, die Adresse des Befehls nach demCALL
in den Stapelspeicher. Der Aufruf-Funktions-Prolog überträgt den Inhalt des% EBP-Registers, der niedrigsten Adresse der lokalen Variablen in der aufrufenden Funktion, in den Stapelspeicher. Dann setzt der aufgerufene Funktionsprolog% EBP auf die Stapelbasis der aktuellen Funktion.Das bedeutet, dass% EBP ein Zeiger auf einen Speicherort ist, der die Adresse des% EBP-Werts der aufrufenden Funktion enthält. Das ist nichts weiter als eine verknüpfte Liste, die teilweise in Hardware über implementiert ist
CALL
.Soweit dies sinnvoll ist, implementieren x86-CPUs Funktionsaufrufe, insbesondere Funktionsaufrufe, bei denen die Funktion über eine eigene Kopie von Argumenten und funktionslokalen Variablen verfügt. Bei jedem Funktionsaufruf werden Informationen auf dem "Aufrufstapel" abgelegt, mit denen die CPU dort weitermachen kann, wo sie in der aufrufenden Funktion aufgehört hat, ohne die aufgerufene Funktion oder die aufrufende Funktion zu beeinträchtigen.
quelle
Eine verknüpfte Liste kann zum Implementieren einer Nachrichtenwarteschlange verwendet werden.
Eine Nachrichtenwarteschlange ist eine Struktur, in der Informationen zu Ereignissen für die spätere Verarbeitung gespeichert werden. Wenn der Benutzer beispielsweise eine Taste drückt oder die Maus bewegt, ist dies ein Ereignis. Eine Anwendung ist möglicherweise zum Zeitpunkt des Auftretens des Ereignisses ausgelastet, sodass nicht erwartet werden kann, dass sie das Ereignis zum genauen Zeitpunkt des Auftretens verarbeitet. Das Ereignis wird in eine Nachrichtenwarteschlange gestellt (Informationen darüber, welche Taste gedrückt wurde oder wo sich die Maus bewegt hat). Wenn die Anwendung etwas Zeit hat, überprüft sie die Nachrichtenwarteschlange, ruft Ereignisse ab und verarbeitet sie Sie. (Dies geschieht innerhalb eines Zeitrahmens von Millisekunden, sodass es nicht auffällt.)
Aus dem Nutzungsszenario, das ich gerade beschrieben habe, sollte ersichtlich sein, dass es uns egal ist, zufälligen Zugriff auf Ereignisse zu haben, die in der Nachrichtenwarteschlange gespeichert sind. Es ist uns nur ein Anliegen, Nachrichten darin zu speichern und abzurufen. Daher ist es sinnvoll, eine verknüpfte Liste zu verwenden, die eine optimale Einfüge- / Entfernungszeit bietet.
(Bitte melden Sie sich nicht an, um darauf hinzuweisen, dass eine Nachrichtenwarteschlange wahrscheinlich oder eher oder fast genauso wahrscheinlich mithilfe einer zirkulären Array-Liste implementiert wird. Dies ist ein technisches Detail und hat eine Einschränkung: Sie können nur speichern eine begrenzte Anzahl von Nachrichten.)
quelle