kap 04 lister
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
Kap 04 ListerKap 04 ListerKap 04 ListerKap 04 Lister
Listestrukturer
Listestrukturer hensiktsmessige ved såkalte flyktige tabeller(tabeller med relativt mye innsetting/sletting)
Innsetting vha orden-tabell
Før innsetting Etter innsetting
*
*
Knutsen
NavnOrden
Alfsen
Persen
Hansen
Nilsen
3
1
2
4
Knutsen3
NavnOrden
Alfsen
Persen
Hansen
Nilsen
1
5
2
4
Lenke-tabell (åpen forelengs liste)Fysisk liste-struktur
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.
Lesing i sortert rekkefølge vha en såkalt Lenke-tabell.
Head
4
NavnLenke
Alfsen
Persen
Hansen
Nilsen
2
0
1
3
Liste-tabellLogisk liste-struktur
Omforming fra fysisk til logisk liste-struktur.
Fysisk
Logisk
Head
4
NavnLenke
Alfsen
Persen
Hansen
Nilsen
2
0
1
3
4321
Head
4
AlfsenPersenHansenNilsen 2013
3124
Head
4
Alfsen PersenHansen Nilsen 0312
Innsetting i en liste (logisk struktur)
ny := 5navn[ny] := ’Knutsen’forrige := 2lenke[ny] := lenke[forrige]lenke[forrige] := ny
forrige ny
5
1Knutsen
3124
Head
4
Alfsen PersenHansen Nilsen 0352
Innsetting i en liste (fysisk struktur)
forrige ny
ny := 5navn[ny] := ’Knutsen’forrige := 2lenke[ny] := lenke[forrige]lenke[forrige] := ny
Knutsen1
Head
4
NavnLenke
Alfsen
Persen
Hansen
Nilsen
2
0
5
3
Bruk av struct / class
ny := 5tab[ny].navn := ’Knutsen’forrige := 2tab[ny].lenke := tab[forrige].lenketab[forrige].lenke := ny
forrige ny
5
1Knutsen
3124
Head
4
Alfsen PersenHansen Nilsen 0352
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 */
B M S U
P
head
ny
obj = P
tab lenke tab lenke tab lenke tab lenkeM
tab lenke
U
B
S
head
3 1
2
3
5
4
1
4
2
0
P
ny
Innsetting sortert i en åpen forlengs liste (2)Tabell-elementer
B M S U
P
head
ny
obj = P
tab lenke tab lenke tab lenke tab lenkeM
tab lenke
U
B
S
head
3 1
2
3
5
4
1
4
2
0
P
B M S U
P
head
ny
tab lenke tab lenke tab lenke tab lenkeM
tab lenke
U
B
S
head
3 1
2
3
5
4
1
5
2
0
P
*
*4 *
Før innsetting
Etter innsetting
Innsetting sortert i en åpen forlengs liste (3)Tabell-elementer
Innsett (head,tab,lenke,obj,ny)
tab[ny] := objIF head = null THENlenke[ny] := nullhead := ny
ELSEIF tab[ny] < tab[head] THENlenke[ny] := headhead := ny
ELSEforrige := headneste := lenke[forrige]WHILE (neste != null) AND (tab[ny] >= tab[neste]) DOforrige := nesteneste := lenke[forrige]
ENDWHILElenke[ny] := nestelenke[forrige] := ny
ENDIF
B M S U
P
head
ny
B M S U
P
head
ny
tab lenke
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 */
B M S U
P
head
ny
obj = P
data next data next data next data next
node node node node
nodedata next
Innsetting sortert i en åpen forlengs liste (5)Dynamiske elementer
B M S U
P
head
ny
obj = P
B M S U
P
head
ny
Før innsetting
Etter innsetting
Innsetting sortert i en åpen forlengs liste (6)Dynamiske elementer
Innsett (head,obj)
ny = new Node()ny.data = objIF head = null THENny.next := nullhead := ny
ELSEIF ny.data < head.data THENny.next := headhead := ny
ELSEforrige := headneste := forrige.nextWHILE (neste != null) AND (ny.data >= neste.data) DOforrige := nesteneste := forrige.next
ENDWHILEny.next := nesteforrige.next := ny
ENDIF
B M S U
P
head
ny
B M S U
P
head
ny
data next
node
obj = P
Innsetting først i en åpen forlengs listeTabell-elementer
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] := objlenke[ny] := headhead := ny
B M S U
A
head
ny
obj = A
tab lenke
Innsetting i gitt posisjon i en åpen forlengs listeTabell-elementer
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] := objIF pos = null THENlenke[ny] := headhead := ny
ELSElenke[ny] := lenke[pos]lenke[pos] := ny
ENDIF
B M S U
P
head
ny
pos
tab lenke
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 */
B M S U
head
tab lenke
obj = S
Fjerning fra en åpen forlengs liste (2)Tabell-elementer
Fjern (head,tab,lenke,obj,flag)
flag := falseIF head = null THENlisten er tom
ELSEIF obj = tab[head] THENhead := lenke[head]flag := true
ELSEforrige := headneste := lenke[forrige]WHILE (neste != null) AND (flag = false) DOIF obj = tab[neste] THENlenke[forrige] := lenke[neste]flag := true
ELSEforrige := nesteneste := lenke[forrige]
ENDIFENDWHILE
ENDIF
B M S U
head
B M S U
head
tab lenke
obj = S
Dummy-element
x
head
dummy
NesteData
x
Sirkulær liste med dummy-element
x
head
dummy
NesteData
x
Dobbelt sirkulær liste med dummy-element
head
x
Maksimalt to linjer inn til hvert punkt
11, yx
22 , yx
33 , yx
55 , yx
44 , yx
x
x
x
x
xPunktPunkt x1
x1
x2x2
x3x3
x4x4
x5x5
y1y1
y2y2
x3x3
x4x4
x5x5
LedigLedig
xKoord yKoord
Mer enn to linjer inn til punkter
11, yx
22 , yx
33 , yx
55 , yx
44 , yx
x
x
x
x
xLinjeLinje x1
x1
x2x2
x3x3
x4x4
x5x5
x5x5
y1y1
y2y2
y3y3
y4y4
y5y5
LedLLedL
xKoord yKoord
Punkt
44
11
22
33
11
11
55
44
33
44
22
33
EndP1 EndP2
Linje
LedPLedP
6 3
4 1
5
2
y5y5
Punkter/Linjer i 3-dim - Frynsete arrays
PunktPunkt 6060
9090
22
100100
44
380380
66
7070
200200
11
210210
22
500500
xKoord yKoord
EndP1 EndP2
44
zKoord
240240
500500
400400
320320
1010
Neste Type
22
44
55
66
88
TPktTPkt
TPktTPkt
TLinTLin
TPktTPkt
TLinTLin
TPktTPkt
1010 TLedTLed
TLinTLin
TLedTLed
LinjeLinje
LedLed
Punkter/Linjer i 3-dim - Ringer
NettverkNettverk
NesteLinNesteLinLinListLinList
PktListPktList
TypeType
EndPkt1EndPkt1
EndPkt2EndPkt2
NestePktNestePkt
TypeType
xKoordxKoord
yKoordyKoord
zKoordzKoord
NestePktNestePkt
TypeType
xKoordxKoord
yKoordyKoord
zKoordzKoord
NesteLinNesteLin
TypeType
EndPkt1EndPkt1
EndPkt2EndPkt2
Punkter/Linjer i 3-dim - Fortran Free Array
NesteLinNesteLinLinListLinList
PktListPktList
TypeType
EndPkt1EndPkt1
EndPkt2EndPkt2
NestePktNestePkt
TypeType
xKoordxKoord
yKoordyKoord
zKoordzKoord
NestePktNestePkt
TypeType
xKoordxKoord
yKoordyKoord
zKoordzKoord
NestePktNestePkt
TypeType
xKoordxKoord
yKoordyKoord
zKoordzKoord
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] := dimtab[2] := 4tab[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] := pektab[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 finnessø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 := falsefunnet stor:= falsehent første returnerte postWHILE (NOT funnet_kor) AND (flere returnerte poster)IF plass stor nokIF plass har korrekt størrelseplasser postfunnet_kor := truefunnet_stor:= false
ELSEfunnet_stor:= true
ENDIFhent neste post
ENDWHILEIF funnet_storplasser post
ENDIFENDIF
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
SList - SimpleTest_SList_01
NilsenNilsen22
HansenHansen
PersenPersen
AlfsenAlfsen
00
-1-1
11
33
head next tab
0
1
2
3
SList - SimpleElement (1/2)
xx nextnext xx nextnext
Element Element
SList - SimpleElement (2/2)
xx nextnext xx nextnext
Element Element
SList - SimpleTest_SList_02
55 77
objA objB
22 ..
objC
SList - SimpleZt (1/2)
xx nextnext
Zt
SList - SimpleZt (2/2)
xx nextnext
Zt
SList - SimpleSList_03constructor / getHead
xx nextnext
ZtSList
head
SList - SimpleSList_03getFirst / getLast
xx nextnext
ZtSList
head xx nextnext
Zt
SList - SimpleSList_03addFirst / addLast
xx nextnext
ZtSList
head xx nextnext
Zt
xx nextnextZt
SList - SimpleSList_03addSort
xx nextnext
ZtSList
head xx nextnext
Zt
xx nextnextZt
SList - SimpleSList_03returnFirst / removeFirst / removeLast
xx nextnext
ZtSList
head xx nextnext
Zt
SList - SimpleSList_03makeEmpty / isEmpty
xx nextnext
ZtSList
head xx nextnext
Zt
SList - SimpleSList_03Test_SList_03
77
objBiList
head 55
objA
22
objC
xx nextnext
ZtSList
head xx nextnext
Zt
22
objCiList
head 55
objA
77
objB
DList - Implementering
xx nn nn nn
DListDList
EEEE EE
DList Dobbelt lenket liste med dummy-nodex Dummy-noden Node (DLNode)E Element
DListDList
DLNodeDLNode
DList - attributter
xx nn nn nn
DListDList
EEEE EE
DList - Tom listexx
DListDList
head
currentNode
1
2
3
4
5
12 3
4
5
DList - addFirst
xx nn nn nn
DListDList
EEEE EEnn
EE
1
2
3
45
12
3 45
0
0
Obj
DList - addLast
xx nn nn nn
DListDList
EEEE EE nn
EE
1
2
3
4
5
0
0
12
3
4 5
Obj
DListremoveFirst
xx nn nn nn
DListDList
EEEE EE
1
2
3
4
5
6
1
2
3
4
5
6
Obj
DListremoveLast
xx nn nn nn
DListDList
EEEE EE
1
2
3
4
5
6
1
2
3
4 5
6
Obj
DList - DLNode (1/3)constructor
nn
EE
element
prev next
DList - DLNode (2/3)set… / get…
nn
EE
element
prev next
DList - DLNode (3/3)insertBefore / insertAfter
nn
EEEE
nnnn
EE
this
1
2
3
4
5
1 2 34
5
nn
EEEE
nnnn
EE
this
1
2
3
5
4
1 2 34
5
insertBefore insertAfterObj Obj
DlistTest_DList
xx BB CC AA
DListDList
7979
2424
55
ENDENDENDEND