Liste (datastruktur)

Fra Wikipedia, den frie encyklopædi
Gå til: navigation, søg
Disambig bordered fade.svg For alternative betydninger, se Liste.
Enkelt-kædet liste
Cirkulær liste
Dobbelt-kædet liste

En liste er en meget generel datastruktur. Dataelementer kan indsættes med eller uden nøglefelt. Hvis der er et nøglefelt, kan listen være sorteret. Man kan referere til et element ved at bruge elementets position i listen, hvis denne er kendt.

Forskellige slags lister[redigér | redigér wikikode]

Der findes forskellige typer lister. Den vigtigste forskel er, hvordan de enkelte elementer henviser til hinanden.

  • Enkelt-kædet[fodnote 1] liste. Alle elementer undtagen det sidste har en reference til det næste element i listen.
  • Cirkulær liste. Denne type ligner den enkelt-kædede, men det sidste element har en reference til det første.
  • Dobbelt-kædet[fodnote 2] liste. Elementerne i listen har både en reference til det foregående og det efterfølgende element.

Det kan være en fordel at vedligeholde en reference til det sidste element i listen. En sådan reference vil gøre det nemmere at implementere en .

Implementering[redigér | redigér wikikode]

Mange programmeringssprog giver mulighed for at arbejde med referencer til dataelementer, og dette gør det muligt, at implementere en dynamisk liste. Som eksempel kan en enkelt-kædet liste laves så dan her:

Selve listen er blot en reference. Hvis referencen ikke peger på noget, er listen tom. Hvert element i listen har en reference, der skal pege på det næste element i listen.

Søgning[redigér | redigér wikikode]

Søgning i en enkelt-kædet liste kan kun foregå i en retning. Da alle elementer i listen har en reference til det næste element i listen, er søgning efter data simpel. Den kan også være langsommelig i en lang liste.

Ved sletning af elementer i listen er det nødvendigt, at have en reference til det foregående element. Da de enkelte elementer ikke indeholder oplysninger om det foregående element må søgningen laves, så det foregående element huskes. Dette kan opnås med følgende algoritme: Der bruges to referencer, aktuel og forrige. Ved søgningens start peger forrige ikke på nogent mens aktuel peger på det første element i listen. Herefter sker søgningen i følgende trin.

  • Forrige sættes til det samme som aktuel.
  • Aktuel sættes til at pege på det næste element.
  • Hvis aktuel ikke peger på noget, er listen ikke længere og forrige peger på det sidste element. Det søgte element blev altså ikke fundet.
  • Hvis aktuel peger på det ønskede element, peger forrige på elementet før.
  • Forløbet gentages indtil aktuel peger på det rette element eller ikke peger på noget mere.

Indsættelse[redigér | redigér wikikode]

Indsættelse af et element sker på forskellig måde alt efter hvor i listen det skal tilføjes. Hvis elemetet skal forrest i listen, sættes det nye element til at pege på det første element i den eksisterende liste. Derefter rettes listen, så den peger på det nye element.

Indsættelse midt i listen kræver en søgning, så man har en reference til elementet, der skal indsættes efter. Dette bliver det nye 'foregående' element. Det nye element sættes til at pege på det samme element, som det foregående peger på. Det foregående element rettes, så det peger på det nye element.

Elementer, der skal indsættes sidst i listen indsættes på samme måde som elementer, der indsættes midt i listen.

Sletning[redigér | redigér wikikode]

Hvis det første element i listen skal slettes, sættes listen blot til at starte med det næste element i den oprindelige liste, og det første element slettes.

Ved sletning findes det element, der skal fjernes med algoritmen beskrevet under søgning. Det forrige element i listen sættes til at pege videre til det element, som det aktuelle element peger på. Dermed er det aktuelle element ude af listen, og det kan slettes.

Implementering i tabel[redigér | redigér wikikode]

Det er muligt, at lave en kædet liste ved hjælp af en tabel. Udover de data, der skal være i listen skal der være en kolonne med referencer til det næste element i listen. Der skal bruges to variabler, der indeholder indeks for første element i listen og første frie element. De frie elementer er også organisede i en liste, så ved indsættelse flyttes et element fra den frie til den brugte liste inden data gemmes. Sletning foregår på tilsvarende vis.

Sortering[redigér | redigér wikikode]

En sorteret liste har den indlysende fordel, at når information fra listen skal vises, kommer den umiddelbart ud i en forståelig orden. Man bør dog overveje om det er tiden værd at holde listen sorteret hele tiden.

Hvis en liste holdes sorteret, kan søgninger i listen laves lidt mere effektivt. Hvis det søgte element findes, er der ingen tidsgevinst. Det er i gennemsnit nødvendigt at gennemløbe halvdelen af listen i begge tilfælde.

Hvis det søgte element ikke er i listen, er der der i mod en fordel. I en usorteret liste er det nødvendigt at kontrollere alle elementer før det er udelukket at de søgte data er i listen. Hvis data er sorterede er det i gennemsnit tilstrækkeligt at undersøge halvdelen af elementerne. På grund af sorteringen er det muligt at konstatere, hvornår man er kommet forbi det sted, hvor de søgte data skulle være.

Tidskompleksitet
Operation Relativ tid
Find O(N)
Indsæt O(N)
Slet O(N)

Kilder[redigér | redigér wikikode]

  • Pascal Plus Datastructures, Algorithms and Advanced Programming af Nell Dale og Susan C. Lilly ISBN 0-669-24830-4

Fodnoter[redigér | redigér wikikode]

  1. Også set som "enkelt-hægtet"
  2. Eller "dobbelt-hægtet"
Commons-logo.svg
Wikimedia Commons har medier relateret til: