Liste (Datenstruktur)

Eine verkettete Liste ist eine dynamische Datenstruktur, in der Datenelemente geordnet gespeichert sind. Bei ihrer Erstellung braucht die maximale Anzahl der Elemente nicht festgelegt zu werden, und die Anzahl darf während der Laufzeit beliebig variieren.

Einfach verkettete Listen

Der Datentyp der einfach verketteten Listen mit Elementen vom Typ ist rekursiv definiert als . Die technische Realisierung erfolgt meistens durch einzelne Knoten, die aus den Nettodaten selbst und einem Verweis auf den Nachfolgeknoten bestehen. Im letzten Knoten ist als Nachfolgeknoten der sogenannte Null-Zeiger angegeben, der auch heißt.[1]

Elementare Listenoperationen sind das Erweitern der Liste um einen Knoten am Anfang und das Entfernen des ersten Knotens, die in der Zeit erfolgen können.

Einfach verkettete Liste mit 3 Werten

Vorteile

  • Wenn das Suchen erledigt und der Einfügepunkt gefunden ist, ist der Aufwand für das Einfügen an jeder Stelle . In einem Array müssten hingegen Datensätze umkopiert werden.
  • Geringer zusätzlicher Speicherbedarf (1 Zeiger).

Nachteile

  • Die Kosten fürs Suchen sind , da ungünstigstenfalls über jeden Knoten iteriert werden muss.

Anwendungen

Einfach verkettete Listen werden in hochdynamischen Umgebungen verwendet, in denen mit Arrays nicht mehr sinnvoll gearbeitet werden kann, da diese den Umgang mit syntaktischen Operationen enorm erschweren. So ist die einfach verkettete Liste mit Datentyp mit wobei weitere elementare LISP-Datentypen bezeichnet, der zentrale Datentyp der Programmiersprache LISP. Sogar LISP-Programme sind selbst solche Listen.

Doppelt verkettete Liste

Doppelt verkettete Liste mit 3 Werten

Im Gegensatz zur einfach-verketteten Liste hat jedes Element sowohl einen Zeiger auf das nachfolgende als auch auf das vorhergehende Element.

Der Vorgänger-Zeiger des ersten und der Nachfolger-Zeiger des letzten Elementes zeigen auf den Wert NULL. Dieses besondere Element dient zum Feststellen des Anfangs und des Endes einer doppelt verketteten Liste.[1]

Vorteile

  • Das Entfernen eines Elements aus der Liste kann in geschehen, auch wenn die Ankunft beim Element über keine der zwei Verkettungen geschah. In diesem Fall müsste bei der einfach verketteten Liste der Vorgänger gesucht werden.
  • Über die Liste kann von hinten nach vorne iteriert werden.

Nachteile

  • Höherer Speicherbedarf für die zusätzlichen Zeiger.
  • Beim Löschen und Einfügen müssen auch die Vorgänger-Zeiger der nachfolgenden Listenelemente angepasst werden.

Weitere Formen

Listenkopf

Der Listenkopf (oder Listenanker) ist ein Datenfeld, welches zusätzliche Informationen, wie beispielsweise die Anzahl der Knoten in der Liste, enthalten kann. Er zeigt auf das erste Element.

Skip-Liste

Wie bei verketteten Listen werden auch bei der Skipliste die Daten in Containern abgelegt. Diese enthalten einen Schlüssel und einen Zeiger auf den nächsten Container. Allerdings können Container in Skiplisten auch Zeiger auf andere Container enthalten, welche nicht direkt nachfolgen. Es können also Schlüssel übersprungen werden. Jeder Container hat eine bestimmte Höhe , welche um kleiner ist als die Anzahl der Zeiger, die ein Container enthält. Die Zeiger werden von bis nummeriert. Grundsätzlich imitiert eine Skipliste also die Binäre Suche auf einem Feld.

Skip-Liste mit mehreren Sprüngen

Bei den Skip-Listen unterscheidet man drei Arten von Typen:

  1. ausgeglichene SkipList
  2. unausgeglichene SkipList (siehe Bild)
  3. randomisierte SkipList

Bei allen Typen ist das mehrfache Auftreten des Inhaltes erlaubt. Allerdings sind die aus- und die unausgeglichene SkipList geordnet, wohingegen die randomisierte SkipList nicht notwendigerweise geordnet sein muss. Durch das Einfügen von Zwischenstationen, welches den Aufwand der Implementierung erhöht, kann die mittlere Zugriffszeit und damit verbunden die Komplexität gesenkt werden. Eine Erweiterung des SkipList-Prinzip ist die Verknüpfung mit dem Prinzip der doppelt verknüpften Liste, wodurch „Rücksprünge“ ermöglicht werden. Bei einer ausgeglichenen SkipList senkt dies allerdings nicht die Komplexität, wohingegen bei einer unausgeglichenen SkipList auf Zwischenstationen verzichtet werden kann, welches dann wiederum den Zugriff auf Elemente in der Nähe der nächsten Zwischenstation erhöht.

Die Operationen Einfügen, Suchen und Löschen haben jeweils eine erwartete Laufzeit von .

Berechnung der Containerhöhe

Bei der randomisierten Skipliste erfolgt die Berechnung der Höhe nach dem Zufallsprinzip. Die Wahrscheinlichkeit, dass eine bestimmte Höhe erreicht wird, kann folgendermaßen ermittelt werden:

Bei nicht randomisierten Skiplisten wird die Höhe so bestimmt, dass jeder Zeiger mit Zeigerhöhe auf einen Container Positionen weiter hinten in der Liste zeigen kann – also alle Container dazwischen eine geringere Höhe haben als der Zeiger.

Adaptive Listen

Da der Aufwand des Zugriffes auf ein Element einer einfach verknüpften Liste mit der Entfernung vom Start pro Einzelschritt zunimmt, kam man auf das Prinzip der adaptiven Listen. Im Versuch, diesen Aufwand im Mittel möglichst niedrig zu halten, werden die Listenelemente nach ihrer Zugriffshäufigkeit sortiert. Dabei gibt es drei grundsätzliche Strategien:

  • MoveToFront: Bei jedem Zugriff auf ein Element wird dieses entfernt und am Anfang der Liste eingefügt.
  • Transpose: Bei jedem Zugriff auf ein Element wird es mit seinem Vorgänger vertauscht (Sonderfall: erstes Element)
  • Gratification: Zu jedem Element wird dessen Zugriffshäufigkeit gespeichert. In einem bestimmten Intervall wird anhand der Zugriffshäufigkeit die Liste neu sortiert.

Abstrakter Datentyp

Die Daten werden in einer Sequenz von Schlüsseln in einer Liste gespeichert, in der eine Struktur besteht, die aus Zähler, Zeiger und der Adresse zu einer Vergleichsfunktion besteht. Der Datenknoten enthält den Zeiger auf eine Datenstruktur und einen selbstreferenzierenden Zeiger, der auf den nächsten Knoten in der Liste zeigt.

In C++ kann eine Liste wie folgt als abstrakter Datentyp definiert werden: [2]

struct Node {
    void *dataPointer;
    Node *link;
};

struct List {
    int count;
    Node *head;
    virtual int compare(List &other) = 0;
};

Listen in der objektorientierten Programmierung

In der objektorientierten Programmierung zeichnen sich Listen gemäß dem Prinzip der Datenkapselung durch eine Menge von Listenoperationen aus. Intern können dabei unterschiedliche und durchaus auch kompliziertere Datenstrukturen, wie binäre Bäume zum Einsatz kommen. Aufgrund der internen Datenstruktur können dabei oft auch weitere Funktionen, wie beispielsweise Sortierung, sortiertes Einfügen, Entfernen des größten Elementes etc. angeboten werden.

Je nach Einsatzzweck kann es sinnvoll sein, zwischen konkreten Implementierungen der Schnittstelle Liste zu wählen. Wird beispielsweise hauptsächlich wahlfrei über Index auf die Liste zugegriffen, wäre eine verkettete Liste eine schlechte Wahl, da dort n Operationen nötig sind, um das n-te Element zu adressieren.

Daher werden in objektorientierten Bibliotheken oft neben der Schnittstelle verschiedene konkrete Implementierungen angeboten. Beispielsweise gibt es in der Programmiersprache Java als Schnittstelle java.util.List,[3] und es werden unter anderem java.util.LinkedList[4] und java.util.ArrayList[5] als konkrete Implementierungen angeboten. In C++ werden Listen und Vektoren in der Standardbibliothek implementiert.

Beispiele

Nachfolgende Beispiele sind in C# verfasst. Dafür wird ein Knoten definiert, welcher eine Zahl und einen Nachfolgeknoten speichern kann.

class Knoten {
    public int element = 0;
    public Knoten folgeknoten = null;
}

Neues Element in Liste einfügen

static void elementEinfuegen(Knoten knoten, int neuesElement) {
    while (knoten.folgeknoten != null)
        knoten = knoten.folgeknoten;

    knoten.folgeknoten = new Knoten();
    knoten.folgeknoten.element = neuesElement;
}

Element suchen

static bool elementSuchen(Knoten knoten, int altesElement) {
    while (knoten != null) {
        if (altesElement == knoten.element)
            return true;
          
        knoten = knoten.folgeknoten;
    }
        
    return false;
}

Element aus Liste löschen

static void elementLoeschen(ref Knoten knoten, int altesElement) {
    while (knoten != null && altesElement != knoten.element)
        knoten = knoten.folgeknoten;

    Knoten aktuell = knoten; 

    while (aktuell != null) {
        if (aktuell.folgeknoten != null && altesElement == aktuell.folgeknoten.element)
            aktuell.folgeknoten = aktuell.folgeknoten.folgeknoten;
        else
            aktuell = aktuell.folgeknoten;
    }
}

Verwendung von Liste in objektorientierter Sprache

Dieses Beispiel zeigt die Verwendungen einer Liste in C++.

#include <algorithm>
#include <iostream>
#include <list>

using namespace std;

int main() {
    // Initialisierung
    auto liste = list<int>();

    // am Anfang einfügen
    liste.push_front(4);
    liste.push_front(3);

    // am Ende anfügen
    liste.push_back(5);
    liste.push_back(6);

    // die Liste enthält 3 4 5 6
    // Durchlaufen der Liste
    for (int element: liste)
        cout << element << " ";

    // Entfernen aller Zahlen größer als 4
    liste.erase(remove_if(liste.begin(), liste.end(), [](int x) { return x > 4; }), liste.end());

    cout << endl;
    for (int element: liste)
        cout << element << " ";

    // Sortieren
    liste.sort();

    // Löschen
    liste.clear();
}

Siehe auch

Einzelnachweise und Anmerkungen

  1. a b Der Einsatz eines Wächterzeigers oder Sentinels anstelle des Null-Zeigers kann einen Vergleich in der Suchschleife sparen.
  2. GeeksforGeeks: Abstract Data Types
  3. java.util.List Java API Specification
  4. java.util.LinkedList Java API Specification
  5. java.util.ArrayList Java API Specification

Read other articles:

I comuni metropolitani (in turco büyükşehir belediyeleri) costituiscono degli enti locali territoriali della Turchia che rispondono alle esigenze di coordinamento e azione comune delle amministrazioni locali delle aree maggiormente popolate del Paese. Corrispondono a 30 delle 81 province della Turchia a seguito della riforma degli enti locali del 2012[1], secondo la quale tutte le province con più di 750.000 abitanti assumono lo status di comune metropolitano e la loro popolazione...

 

Laveno-Mombello commune di Italia Tempat categoria:Articles mancats de coordenades Negara berdaulatItaliaRegion di ItaliaLombardyProvinsi di ItaliaProvinsi Varese NegaraItalia PendudukTotal8.353  (2023 )GeografiLuas wilayah23,53 km² [convert: unit tak dikenal]Ketinggian205 m Berbatasan denganCaravate Cittiglio Sangiano Castelveccana Leggiuno Verbania Ghiffa (en) Stresa (en) SejarahPembuatan1927 Informasi tambahanKode pos21014 Zona waktuUTC+1 Waktu Eropa Tengah UTC+2 Kode telepon033...

 

.gy

.gy البلد غيانا  الموقع الموقع الرسمي  تعديل مصدري - تعديل   gy. هو نطاق إنترنت من صِنف مستوى النطاقات العُليا في ترميز الدول والمناطق، للمواقع التي تنتمي إلى غيانا.[1][2] مراجع ^ النطاق الأعلى في ترميز الدولة (بالإنجليزية). ORSN [الإنجليزية]. Archived from the original on 2019-05-07. Re...

العلاقات البوتانية السريلانكية بوتان سريلانكا   بوتان   سريلانكا تعديل مصدري - تعديل   العلاقات البوتانية السريلانكية هي العلاقات الثنائية التي تجمع بين بوتان وسريلانكا.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدولتين: وجه ا...

 

Political party in Poland RACJA Polskiej Lewicy LeaderJan CedzyńskiFounded8 August 2002Dissolved23 November 2013Merged intoYour MovementHeadquartersul. Emilii Plater 55/81, 00-113 WarsawIdeologySocial democracyAnti-clericalismPolitical positionCentre-leftWebsitewww.racja.euPolitics of PolandPolitical partiesElections Reason of the Polish Left, or Reason Party (Polish: RACJA Polskiej Lewicy; RACJA; RACJA PL), was an anti-clerical[1] minor political party in Poland. It wa...

 

Neural network library KerasOriginal author(s)François CholletDeveloper(s)ONEIROSInitial release27 March 2015; 9 years ago (2015-03-27)Stable release3.3.2[1] / 22 April 2024; 1 day ago (22 April 2024) Repositorygithub.com/keras-team/keras Written inPythonPlatformCross-platformTypeFrontend for TensorFlowLicenseApache 2.0Websitekeras.io  Keras is an open-source library that provides a Python interface for artificial neural networks. Keras acts as an ...

27th season of the UEFA club football tournament 1981–82 European CupDe Kuip in Rotterdam hosted the final.Tournament detailsDates26 August 1981 – 26 May 1982Teams33Final positionsChampions Aston Villa (1st title)Runners-up Bayern MunichTournament statisticsMatches played63Goals scored170 (2.7 per match)Attendance1,675,358 (26,593 per match)Top scorer(s)Dieter Hoeneß (Bayern Munich)7 goals← 1980–81 1982–83 → International football competition The 1981–82 ...

 

Yemenite Jewish flatbread For the Somali sweet pancake, see Malawah. For the Yemeni flatbread, see Khubz mulawah. MalawachMalawach, as traditionally served by Yemenite Jews, with zhoug and resek.TypeBreadPlace of originYemenCreated byYemenite Jews[1][2]Main ingredientsLaminated dough, clarified butter, or butter, or cooking oil, occasionally Nigella sativa  Media: Malawach Malawach or Melawwaḥ or מלאוואך, (Arabic: ملوح; literally means board-like bread), ...

 

Friedhof St. Magdalena Der Friedhof St. Magdalena zählt zur Gruppe der Friedhöfe in Linz und liegt im Stadtteil St. Magdalena. Der Friedhof wird von der Pfarre St. Magdalena betrieben. Inhaltsverzeichnis 1 Geschichte 2 Gräber 3 Galerie 4 Weblinks Geschichte Der Friedhof ist seit dem 17. Jahrhundert erwähnt und befand sich wie in allen Dörfern Oberösterreichs um die Pfarrkirche. 1835 wurde der Friedhof an den heutigen Standort an der Oberbairinger Straße verlegt und wurde im Lauf der Z...

American college basketball season 1996–97 USC Trojans men's basketballNCAA tournamentConferencePacific-10 ConferenceRecord17–11 (12–6 Pac-10)Head coachHenry Bibby (1st season)Home arenaL. A. Sports ArenaSeasons← 1995–961997–98 → 1996–97 Pacific-10 Conferencemen's basketball standings Conf Overall Team W   L   PCT W   L   PCT No. 7 UCLA 15 – 3   .833 24 – 8   .750 No. 21 Stanford 12 – 6   .667 22 ...

 

Divine preaching hall of the Tirthankara in Jainism Samavasarana of Tirthankara Part of a series onJainism Jains History Timeline Index Philosophy Anekantavada Cosmology Ahimsa Karma Dharma Mokṣa Kevala Jnana Dravya Tattva Brahmacarya Aparigraha Gunasthana Saṃsāra EthicsEthics of Jainism Mahavratas (major vows) Ahiṃsā (non-violence) Satya (truth) Asteya (non-stealing) Brahmacarya (chastity) Aparigraha (non-possession) Anuvratas (further vows) Sāmāyika Sallekhana Jain prayers Bhaktam...

 

Voce principale: Windows 10#Accoglienza. Le critiche a Windows 10, sistema operativo commercializzato da Microsoft nel luglio 2015, sono arrivate da revisori e utenti. A causa di problemi relativi alla privacy, è stato oggetto di numerose valutazioni negative da parte di vari gruppi. Indice 1 Critiche generali 1.1 Sistema di aggiornamento 1.2 Pratiche di distribuzione 1.3 Privacy e raccolta dati 2 Questioni antitrust 3 Note 4 Voci correlate 5 Collegamenti esterni Critiche generali I critici...

Swiss multi-day road cycling race For the men's race, see Tour de Romandie. Tour de Romandie FémininRace detailsDateOctoberRegionRomandie, SwitzerlandDisciplineRoadCompetitionUCI Women's World TourTypeStage raceWeb sitetourderomandiefeminin.ch HistoryFirst edition2022Editions2 (as of 2023)First winner  Ashleigh Moolman-Pasio (RSA)Most recent Demi Vollering (NED) The Tour de Romandie Féminin is a women's cycle stage race in Switzerland, part of th...

 

Norra Portugal (Região do Norte) Region NUTS II Flagga Land  Portugal Yta 21 284 km² Folkmängd 3 588 701 (2021) Norra Portugals läge i Portugal. Norra Portugals läge i Portugal. Norra Portugal (portugisiska Região do Norte, den norra regionen) är en NUTS 2-region (territoriell enhet för statistiska ändamål - nivå II) i Portugal, som omfattar distrikten Viana do Castelo, Braga, Porto, Vila Real och Bragança, och delar av distrikten Aveiro, Viseu och G...

 

1967 single by The Grass RootsLet's Live for TodaySingle by The Grass Rootsfrom the album Let's Live for Today B-sideDepressed FeelingReleasedMay 13, 1967 (1967-05-13)Recorded1967Genre Psychedelic pop folk rock Length2:35LabelDunhillSongwriter(s) Michael Julien Mogol David Shapiro Producer(s) P. F. Sloan Steve Barri The Grass Roots singles chronology Tip of My Tongue (1967) Let's Live for Today (1967) Things I Should Have Said (1967) Let's Live for Today is a song written by Da...

German actor Max GülstorffBorn(1882-03-23)23 March 1882Tilsit, East Prussia, German EmpireDied6 February 1947(1947-02-06) (aged 64)Berlin, GermanyOccupationActorYears active1916–1949 Max Walter Gülstorff (23 March 1882 – 6 February 1947) was a German actor and stage director. Biography Gülstorff was born in Tilsit, East Prussia. He first appeared in 1900 at the Rudolstadt municipal Theater and moved to Cottbus in 1908. In 1911 Gülstorff went to the Schillertheater Berlin and...

 

Constituency of the National Assembly of France 5th constituency of VarinlineConstituency of the National Assembly of FranceVar's 5th Constituency shown within the VarDeputyJulie LechanteuxRNDepartmentVarCantonsFréjus, Le Muy, Saint-RaphaëlRegistered voters96,236[1] Politics of France Political parties Elections Previous Next The 5th constituency of the Var (French: Cinquième circonscription du Var) is a French legislative constituency in the Var département. Like the other 576 Fr...

 

Former railway station in England Luton HooThe station in the 1980sGeneral informationLocationLuton HooEnglandPlatforms1Other informationStatusDisusedHistoryOriginal companyHertford, Luton & Dunstable RailwayPre-groupingGreat Northern RailwayPost-groupingLondon and North Eastern RailwayKey dates1 September 1860Opened as New Mill End1 December 1891Renamed Luton Hoo26 April 1965Station closed vteRailways around Luton Legend Midland Main Line Leagrave branch to Dunstable Luton Luton Bute Str...

コンラート・ツァハリアス・ローレンツKonrad Zacharias Lorenz 生誕 1903年11月7日 オーストリア=ハンガリー帝国 ウィーン死没 1989年2月27日 オーストリア ウィーン居住 オーストリア=ハンガリー帝国、 ドイツ国、 アメリカ合衆国国籍 オーストリア=ハンガリー帝国 → ドイツ国 →  オーストリア研究分野 動物行動学研究機関 ケーニヒスベルク大学、マックス・プラ...

 

東海チャレンジャーは2011年のワールド・ソーラー・チャレンジで二連覇を達成した 「ファラデーマジック2」は2004年~2008年にかけてワールド・エコノ・ムーブの鉛電池部門で5連覇を達成後、2010年と2011年には燃料電池部門で2連覇を達成した 2003年にミラクルでんちくんとして鉛蓄電池部門で優勝し、燃料電池に換装後、マジカル燃料電池くんとして2008、2009年のWEM燃料�...