1 / 56

Kap 04 Lister

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.

lukas
Télécharger la présentation

Kap 04 Lister

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Kap 04 Lister

  2. Listestrukturer Listestrukturer hensiktsmessige ved såkalte flyktige tabeller (tabeller med relativt mye innsetting/sletting)

  3. Innsetting vha orden-tabell * * Knutsen Før innsetting Etter innsetting

  4. 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.

  5. Liste-tabellLogisk liste-struktur Fysisk Omforming fra fysisk til logisk liste-struktur. Logisk

  6. Innsetting i en liste (logisk struktur) ny := 5 navn[ny] := ’Knutsen’ forrige := 2 lenke[ny] := lenke[forrige] lenke[forrige] := ny forrige ny

  7. Innsetting i en liste (fysisk struktur) ny := 5 navn[ny] := ’Knutsen’ forrige := 2 lenke[ny] := lenke[forrige] lenke[forrige] := ny forrige ny

  8. Bruk av struct / class ny := 5 tab[ny].navn := ’Knutsen’ forrige := 2 tab[ny].lenke := tab[forrige].lenke tab[forrige].lenke := ny forrige ny

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. Dummy-element head dummy x

  20. Sirkulær liste med dummy-element head dummy x

  21. Dobbelt sirkulær liste med dummy-element head x

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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

  32. head next tab SList - SimpleTest_SList_01 3 0 2 Nilsen 1 0 Hansen 2 -1 Persen 3 1 Alfsen

  33. Element Element SList - SimpleElement (1/2) x next x next

  34. Element Element SList - SimpleElement (2/2) x next x next

  35. objA objB objC SList - SimpleTest_SList_02 5 7 2 .

  36. Zt SList - SimpleZt (1/2) x next

  37. Zt SList - SimpleZt (2/2) x next

  38. Zt SList SList - SimpleSList_03constructor / getHead x next head

  39. Zt Zt SList - SimpleSList_03getFirst / getLast SList x next x next head

  40. Zt Zt SList - SimpleSList_03addFirst / addLast SList x next x next head Zt x next

  41. Zt Zt SList - SimpleSList_03addSort SList x next x next head Zt x next

  42. Zt Zt SList - SimpleSList_03returnFirst / removeFirst / removeLast SList x next x next head

  43. Zt Zt SList - SimpleSList_03makeEmpty / isEmpty SList x next x next head

  44. 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

  45. 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

  46. DList - attributter DList x n n n E E E

  47. head DList - Tom liste 1 2 3 DList x 4 5 currentNode 1 2 3 4 5

  48. 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

  49. 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

  50. 3 1 DListremoveFirst 6 DList x n n n 5 4 E E E 2 Obj 1 2 3 4 5 6

More Related