kap 04 lister

56
Kap 04 Lister Kap 04 Lister

Upload: lukas

Post on 14-Jan-2016

74 views

Category:

Documents


1 download

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

Page 1: Kap 04 Lister

Kap 04 ListerKap 04 ListerKap 04 ListerKap 04 Lister

Page 2: Kap 04 Lister

Listestrukturer

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

Page 3: Kap 04 Lister

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

Page 4: Kap 04 Lister

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

Page 5: Kap 04 Lister

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

Page 6: Kap 04 Lister

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

Page 7: Kap 04 Lister

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

Page 8: Kap 04 Lister

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

Page 9: Kap 04 Lister

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

Page 10: Kap 04 Lister

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

Page 11: Kap 04 Lister

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

Page 12: Kap 04 Lister

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

Page 13: Kap 04 Lister

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

Page 14: Kap 04 Lister

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

Page 15: Kap 04 Lister

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

Page 16: Kap 04 Lister

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

Page 17: Kap 04 Lister

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

Page 18: Kap 04 Lister

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

Page 19: Kap 04 Lister

Dummy-element

x

head

dummy

NesteData

x

Page 20: Kap 04 Lister

Sirkulær liste med dummy-element

x

head

dummy

NesteData

x

Page 21: Kap 04 Lister

Dobbelt sirkulær liste med dummy-element

head

x

Page 22: Kap 04 Lister

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

Page 23: Kap 04 Lister

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

Page 24: Kap 04 Lister

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

Page 25: Kap 04 Lister

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

Page 26: Kap 04 Lister

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

Page 27: Kap 04 Lister

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

Page 28: Kap 04 Lister

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

Page 29: Kap 04 Lister

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

Page 30: Kap 04 Lister

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

Page 31: Kap 04 Lister

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

Page 32: Kap 04 Lister

SList - SimpleTest_SList_01

NilsenNilsen22

HansenHansen

PersenPersen

AlfsenAlfsen

00

-1-1

11

33

head next tab

0

1

2

3

Page 33: Kap 04 Lister

SList - SimpleElement (1/2)

xx nextnext xx nextnext

Element Element

Page 34: Kap 04 Lister

SList - SimpleElement (2/2)

xx nextnext xx nextnext

Element Element

Page 35: Kap 04 Lister

SList - SimpleTest_SList_02

55 77

objA objB

22 ..

objC

Page 36: Kap 04 Lister

SList - SimpleZt (1/2)

xx nextnext

Zt

Page 37: Kap 04 Lister

SList - SimpleZt (2/2)

xx nextnext

Zt

Page 38: Kap 04 Lister

SList - SimpleSList_03constructor / getHead

xx nextnext

ZtSList

head

Page 39: Kap 04 Lister

SList - SimpleSList_03getFirst / getLast

xx nextnext

ZtSList

head xx nextnext

Zt

Page 40: Kap 04 Lister

SList - SimpleSList_03addFirst / addLast

xx nextnext

ZtSList

head xx nextnext

Zt

xx nextnextZt

Page 41: Kap 04 Lister

SList - SimpleSList_03addSort

xx nextnext

ZtSList

head xx nextnext

Zt

xx nextnextZt

Page 42: Kap 04 Lister

SList - SimpleSList_03returnFirst / removeFirst / removeLast

xx nextnext

ZtSList

head xx nextnext

Zt

Page 43: Kap 04 Lister

SList - SimpleSList_03makeEmpty / isEmpty

xx nextnext

ZtSList

head xx nextnext

Zt

Page 44: Kap 04 Lister

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

Page 45: Kap 04 Lister

DList - Implementering

xx nn nn nn

DListDList

EEEE EE

DList Dobbelt lenket liste med dummy-nodex Dummy-noden Node (DLNode)E Element

DListDList

DLNodeDLNode

Page 46: Kap 04 Lister

DList - attributter

xx nn nn nn

DListDList

EEEE EE

Page 47: Kap 04 Lister

DList - Tom listexx

DListDList

head

currentNode

1

2

3

4

5

12 3

4

5

Page 48: Kap 04 Lister

DList - addFirst

xx nn nn nn

DListDList

EEEE EEnn

EE

1

2

3

45

12

3 45

0

0

Obj

Page 49: Kap 04 Lister

DList - addLast

xx nn nn nn

DListDList

EEEE EE nn

EE

1

2

3

4

5

0

0

12

3

4 5

Obj

Page 50: Kap 04 Lister

DListremoveFirst

xx nn nn nn

DListDList

EEEE EE

1

2

3

4

5

6

1

2

3

4

5

6

Obj

Page 51: Kap 04 Lister

DListremoveLast

xx nn nn nn

DListDList

EEEE EE

1

2

3

4

5

6

1

2

3

4 5

6

Obj

Page 52: Kap 04 Lister

DList - DLNode (1/3)constructor

nn

EE

element

prev next

Page 53: Kap 04 Lister

DList - DLNode (2/3)set… / get…

nn

EE

element

prev next

Page 54: Kap 04 Lister

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

Page 55: Kap 04 Lister

DlistTest_DList

xx BB CC AA

DListDList

7979

2424

55

Page 56: Kap 04 Lister

ENDENDENDEND