560 likes | 707 Views
Kap 04 Lister. Listestrukturer. Listestrukturer hensiktsmessige ved såkalte flyktige tabeller (tabeller med relativt mye innsetting/sletting). Innsetting vha orden-tabell. *. *. Knutsen. Før innsetting. Etter innsetting. Lenke-tabell (åpen forelengs liste) Fysisk liste-struktur.
E N D
Listestrukturer Listestrukturer hensiktsmessige ved såkalte flyktige tabeller (tabeller med relativt mye innsetting/sletting)
Innsetting vha orden-tabell * * Knutsen Før innsetting Etter innsetting
Lenke-tabell (åpen forelengs liste)Fysisk liste-struktur Lesing i sortert rekkefølge vha en såkalt Lenke-tabell. Ved lesing av data i sortert rekkefølge (her navn alfabetisk) leses først post nr 4 (fra Head), deretter post nr 2, post nr 1 og til slutt post nr 3.
Liste-tabellLogisk liste-struktur Fysisk Omforming fra fysisk til logisk liste-struktur. Logisk
Innsetting i en liste (logisk struktur) ny := 5 navn[ny] := ’Knutsen’ forrige := 2 lenke[ny] := lenke[forrige] lenke[forrige] := ny forrige ny
Innsetting i en liste (fysisk struktur) ny := 5 navn[ny] := ’Knutsen’ forrige := 2 lenke[ny] := lenke[forrige] lenke[forrige] := ny forrige ny
Bruk av struct / class ny := 5 tab[ny].navn := ’Knutsen’ forrige := 2 tab[ny].lenke := tab[forrige].lenke tab[forrige].lenke := ny forrige ny
Innsetting sortert i en åpen forlengs liste (1)Tabell-elementer Innsett (head,tab,lenke,obj,ny) /* Rutinen setter inn et nytt element */ /* i en sortert åpen forlengs liste */ /* implementert vha tabeller. */ /* head : Peker til første liste-element */ /* tab : Tabellen hvor post skal innsettes */ /* lenke : lenke-tabell */ /* obj: nytt data-element som skal innsettes */ /* ny : Neste ledige plass i tabellen tab */ head tab lenke head 3 1 M 4 tab lenke tab lenke tab lenke tab lenke 2 U 0 B M S U 3 B 1 4 2 S ny 5 ny P obj = P P
Innsetting sortert i en åpen forlengs liste (2)Tabell-elementer Før innsetting head tab lenke head 3 1 M 4 tab lenke tab lenke tab lenke tab lenke 2 U 0 B M S U 3 B 1 4 2 S ny 5 P obj = P P Etter innsetting head tab lenke head 3 1 M 5 * tab lenke tab lenke tab lenke tab lenke 2 U 0 B M S U 3 B 1 4 2 S ny 5 P * 4 * P
Innsetting sortert i en åpen forlengs liste (3)Tabell-elementer tab lenke Innsett (head,tab,lenke,obj,ny) tab[ny] := obj IF head = null THEN lenke[ny] := null head := ny ELSEIF tab[ny] < tab[head] THEN lenke[ny] := head head := ny ELSE forrige := head neste := lenke[forrige] WHILE (neste != null) AND (tab[ny] >= tab[neste]) DO forrige := neste neste := lenke[forrige] ENDWHILE lenke[ny] := neste lenke[forrige] := ny ENDIF head B M S U ny P head B M S U ny P
Innsetting sortert i en åpen forlengs liste (4)Dynamiske elementer Innsett (head,obj) /* Rutinen setter inn et nytt element */ /* i en sortert åpen forlengs liste */ /* implementert vha dynamiske elementer. */ /* head : Peker til første liste-element */ /* obj: nytt data-element som skal innsettes */ head node node node node data next data next data next data next B M S U node data next P obj = P ny
Innsetting sortert i en åpen forlengs liste (5)Dynamiske elementer Før innsetting head B M S U ny P obj = P Etter innsetting head B M S U ny P
Innsetting sortert i en åpen forlengs liste (6)Dynamiske elementer Innsett (head,obj) ny = new Node() ny.data = obj IF head = null THEN ny.next := null head := ny ELSEIF ny.data < head.data THEN ny.next := head head := ny ELSE forrige := head neste := forrige.next WHILE (neste != null) AND (ny.data >= neste.data) DO forrige := neste neste := forrige.next ENDWHILE ny.next := neste forrige.next := ny ENDIF node data next head B M S U ny P obj = P head B M S U ny P
Innsetting først i en åpen forlengs listeTabell-elementer tab lenke InnsettFirst (head,tab,lenke,obj,ny) /* Rutinen setter inn et nytt element */ /* først i en åpen forlengs liste */ /* implementert vha tabeller. */ /* head : Peker til første liste-element */ /* tab : Tabellen hvor post skal innsettes */ /* lenke : lenke-tabell */ /* obj : nytt data-element som skal innsettes */ /* ny : Neste ledige plass i tabellen tab */ tab[ny] := obj lenke[ny] := head head := ny head B M S U ny A obj = A
Innsetting i gitt posisjon i en åpen forlengs listeTabell-elementer tab lenke InnsettPos (head,tab,lenke,obj,ny,pos) /* Rutinen setter inn et nytt element */ /* i en gitt posisjon i en åpen forlengs liste */ /* implementert vha tabeller. */ /* head : Peker til første liste-element */ /* tab : Tabellen hvor post skal innsettes */ /* lenke : lenke-tabell */ /* obj: nytt data-element som skal innsettes */ /* ny : Neste ledige plass i tabellen tab */ /* pos : Nytt element innsettes etter pos */ tab[ny] := obj IF pos = null THEN lenke[ny] := head head := ny ELSE lenke[ny] := lenke[pos] lenke[pos] := ny ENDIF head pos B M S U ny P
Fjerning fra en åpen forlengs liste (1)Tabell-elementer Fjern (head,tab,lenke,obj,flag) /* Rutinen fjerner et element */ /* fra en åpen forlengs liste */ /* implementert vha tabeller. */ /* head : Peker til første liste-element */ /* tab : Tabellen hvor post skal fjernes */ /* lenke : lenke-tabell */ /* obj: nytt data-element som skal innsettes */ /* flag : Returnerer true hvis fjerning ok */ head tab lenke B M S U obj = S
Fjerning fra en åpen forlengs liste (2)Tabell-elementer tab lenke Fjern (head,tab,lenke,obj,flag) flag := false IF head = null THEN listen er tom ELSEIF obj = tab[head] THEN head := lenke[head] flag := true ELSE forrige := head neste := lenke[forrige] WHILE (neste != null) AND (flag = false) DO IF obj = tab[neste] THEN lenke[forrige] := lenke[neste] flag := true ELSE forrige := neste neste := lenke[forrige] ENDIF ENDWHILE ENDIF head B M S U obj = S head B M S U
Dummy-element head dummy x
Sirkulær liste med dummy-element head dummy x
Maksimalt to linjer inn til hvert punkt xKoord yKoord x Punkt x1 y1 x x2 y2 x3 x3 x x x4 x4 x5 x5 x Ledig
Mer enn to linjer inn til punkter Linje Punkt EndP1 EndP2 xKoord yKoord x Linje 4 5 x1 y1 3 6 x 1 4 x2 y2 5 2 3 x3 y3 x x 1 3 4 x4 y4 4 LedL x5 y5 2 x 1 2 LedP 1 3 x5 y5
Punkter/Linjer i 3-dim - Frynsete arrays xKoord yKoord zKoord Neste Type EndP1 EndP2 Punkt 2 TPkt 60 70 240 4 TPkt 90 200 500 Linje 5 TLin 2 1 6 TPkt 100 210 400 8 TLin 4 2 Led TPkt 380 500 320 10 TLed 10 TLin 6 4 TLed
Punkter/Linjer i 3-dim - Ringer Nettverk LinList NesteLin NesteLin Type Type EndPkt1 EndPkt1 EndPkt2 EndPkt2 PktList NestePkt NestePkt Type Type xKoord xKoord yKoord yKoord zKoord zKoord
Punkter/Linjer i 3-dim - Fortran Free Array PktList NestePkt Type xKoord yKoord zKoord NestePkt Type xKoord yKoord zKoord NesteLin LinList Type EndPkt1 EndPkt2 NestePkt Type xKoord yKoord zKoord
init init (tab,dim) /* Rutinen oppretter en Fortran array med str dim */ /* tab[1] : Antall elementer, dvs dim */ /* tab[2] : Peker til første ledige plass */ /* tab[3] : Peker til første ledige i liste */ /* over returnerte poster */ tab[1] := dim tab[2] := 4 tab[3] := 0
retur retur (tab,lengde,pek) /* Rutinen sletter (returnerer) en post med lengde */ /* lengde fra tabellen tab. */ /* Pek peker til første element i returnert post. */ /* Rutinen stiller den ledige plassen som oppstår */ /* til disposisjon ved å knytte adressen til */ /* pekerlisten som starter i tab[3]. */ tab[pek] := tab[3] tab[3] := pek tab[pek+1] := lengde
alloc (2/2) alloc (tab,lengde,pek) /* Plasserer ny linje eller nytt punkt */ /* i Fortran array */ IF tilstrekkelig plass i ledig område plasser post i ledig område ELSEIF returnerte poster finnes søk etter plass i listen over returnerte poster ENDIF
alloc (1/2) IF tilstrekkelig plass i ledig område plasser post i ledig område ELSEIF returnerte poster finnes funnet_kor := false funnet stor := false hent første returnerte post WHILE (NOT funnet_kor) AND (flere returnerte poster) IF plass stor nok IF plass har korrekt størrelse plasser post funnet_kor := true funnet_stor := false ELSE funnet_stor := true ENDIF hent neste post ENDWHILE IF funnet_stor plasser post ENDIF ENDIF
Enkle Java-rutinerfor operasjoner på listestrukturer På de neste sidene følger noen enkle Java-rutiner for operasjoner på listestrukturer. DList benyttes videre i kurset. - Test_SList_01 Testprogram for enkel navneliste - Element Klasse bestående av en int og en next-peker - Test_SList_02 Testprogram av liste bestående av element-objekter - Zt Klasse bestående av en int og en next-peker, inkl print - SList Klasse for håndtering av enkel åpen forlengs liste - Test_SList_03 Testprogram som benytter SList for Zt-liste - DList Klasse for håndtering av generell dobbelt-lenket liste - Test_DList Testprogram som benytter DList
head next tab SList - SimpleTest_SList_01 3 0 2 Nilsen 1 0 Hansen 2 -1 Persen 3 1 Alfsen
Element Element SList - SimpleElement (1/2) x next x next
Element Element SList - SimpleElement (2/2) x next x next
objA objB objC SList - SimpleTest_SList_02 5 7 2 .
Zt SList - SimpleZt (1/2) x next
Zt SList - SimpleZt (2/2) x next
Zt SList SList - SimpleSList_03constructor / getHead x next head
Zt Zt SList - SimpleSList_03getFirst / getLast SList x next x next head
Zt Zt SList - SimpleSList_03addFirst / addLast SList x next x next head Zt x next
Zt Zt SList - SimpleSList_03addSort SList x next x next head Zt x next
Zt Zt SList - SimpleSList_03returnFirst / removeFirst / removeLast SList x next x next head
Zt Zt SList - SimpleSList_03makeEmpty / isEmpty SList x next x next head
Zt Zt SList - SimpleSList_03Test_SList_03 SList x next x next head objB objA objC iList 7 5 2 head objC objA objB iList 2 5 7 head
DList - Implementering DList x n n n DList E E E DLNode DList Dobbelt lenket liste med dummy-node x Dummy-node n Node (DLNode) E Element
DList - attributter DList x n n n E E E
head DList - Tom liste 1 2 3 DList x 4 5 currentNode 1 2 3 4 5
DList - addFirst DList x n n n 5 3 1 4 E E E 2 n 0 E Obj 0 1 2 3 4 5
DList - addLast DList x n n n 2 4 1 5 E E E n 3 0 E Obj 0 1 2 3 4 5
3 1 DListremoveFirst 6 DList x n n n 5 4 E E E 2 Obj 1 2 3 4 5 6