kap 04 lister

Post on 14-Jan-2016

66 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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 Presentation

TRANSCRIPT

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

top related