Está en la página 1de 54

T02 Vienkryptis sraas

2/3

Temos klausimai
Rekursins duomen struktros
Dinaminio srao samprata
Tiesinis vienkryptis sraas:

formavimas,
perira,
informacijos sukeitimas vietomis, alinimas, terpimas,
paieka,
rikiavimas,
sraas su fiktyviais elementais

Konteinerin klas
Dklas, eil
P175B502 T02

Tiesinis sraas

Informacijos sukeitimas vietomis

P175B502 T02

Dviej element informacini dali sukeitimas vietomis

Galimi variantai:
sukeisti informacines dalis;
perkabinti rodykles (tik B123 modulio stud.).

5
s1

s2

P175B502 T02

Informacini dali sukeitimas 1/3


int k = s1->duom;
// 1
s1->duom = s2->duom; // 2
s2->duom = k;
// 3

k 5
p

5
s1

9
s2

P175B502 T02

3
struct Mazgas {
int duom;
Mazgas *sek;
};
5

Informacini dali sukeitimas 2/3


int k = s1->duom;
// 1
s1->duom = s2->duom; // 2
s2->duom = k;
// 3

k 5
p

9
s1

9
s2

P175B502 T02

3
struct Mazgas {
int duom;
Mazgas *sek;
};
6

Informacini dali sukeitimas 3/3


int k = s1->duom;
// 1
s1->duom = s2->duom; // 2
s2->duom = k;
// 3

k 5
p

9
s1

5
s2

P175B502 T02

3
struct Mazgas {
int duom;
Mazgas *sek;
};
7

Tiesinis sraas
Element alinimas
Srao naikinimas

P175B502 T02

1-o elemento alinimas

p
d

...

1
1
2
3

Mazgas *d = p;
p = p->sek;
delete d;

Ar is bdas tinka sraui i


vieno elemento?
P175B502 T02

Vidinio elemento alinimas

...
v

-3

...

Randamas alinamo elemento adresas d ir


prie j esanio elemento adresas v; po to:
v->sek = d->sek;
delete d;

Ar is bdas tinka srao gale?


P175B502 T02

10

Elemento alinimas (kitas bdas) 1/3


d surandamas alinamas elementas
s sekantis u d elementas

Mazgas *s = d->sek;
p

8
d

// sekantis elementas

P175B502 T02

11

Elemento alinimas (kitas bdas) 2/3

alinam element d perrayti s element

*d = *s;

P175B502 T02

12

Elemento alinimas (kitas bdas) 3/3


delete s;

is bdas netinka srao gale!


P175B502 T02

13

Elemento paalinimas i srao

Inf. n

Inf. 2

Inf. 1

Inf. 0

(nuorod korekcija)

...

NULL

Srao pradios elementas


d
imetamas perskaiiuojant
nuorod p
Reikia rasti prie tai esanio elemento adres
Imesti i srao = perrayti adres
Dabar galima atsisakyti elemento
P175B502 T02

14

Elemento paalinimas i srao

Inf. n
...

s
d

Inf. 2

1
Inf. 2

Inf. 0

(reikmi persiuntimas)

NULL

Netinka srao paskutiniam


elementui
sidmkime sekanio elemento adres
Imesti i srao = perrayti reikm
Dabar galima atsisakyti elemento (sekanio)
P175B502 T02

15

Srao naikinimas

1/4

Kartoti 1-o elemento alinim, kol sraas taps tuias:


while (p != NULL) {
Mazgas *d = p;
p = p->sek;
delete d;
}

// p srao pradia

3
struct Mazgas {
int duom;
Mazgas *sek;
};

d
P175B502 T02

16

Srao naikinimas

2/4

Kartoti 1-o elemento alinim kol sraas taps tuias:


while (p != NULL) {
Mazgas *d = p;
p = p->sek;
delete d;
}

// p srao pradia

3
struct Mazgas {
int duom;
Mazgas *sek;
};

d
P175B502 T02

17

Srao naikinimas

3/4

Kartoti 1-o elemento alinim kol sraas taps tuias:


while (p != NULL) {
Mazgas *d = p;
p = p->sek;
delete d;
}

// p srao pradia

3
struct Mazgas {
int duom;
Mazgas *sek;
};

d
P175B502 T02

18

Srao naikinimas

4/4

Kartoti 1-o elemento alinim kol sraas taps tuias:


while (p != NULL) {
Mazgas *d = p;
p = p->sek;
delete d;
}

// p srao pradia

3
struct Mazgas {
int duom;
Mazgas *sek;
};

d
P175B502 T02

19

p
NULL

P175B502 T02

Informacija n

Informacija 2

Informacija 1

Informacija 0

Srao naikinimas

...

NULL

20

Tiesinis sraas
Naujo elemento terpimas

P175B502 T02

21

Naujo elemento terpimo situacijos 1/2


Reikia inoti naujo elemento terpimo viet:
srao pradioje;
srao viduje;
srao gale.
Pavyzdiui:
prie didiausi reikm (savyb) turint element;
u didiausi reikm (savyb) turinio elemento;
nepaeidiant rikiavimo tvarkos;
...
P175B502 T02
T01

22

Naujo elemento terpimo situacijos 2/2

Dirbant su vienkrypiu srau reikia surasti, kur terpti.


terpim prie, reikia keisti terpimu po.
P

terpimas:
srao pradioje atitinka srao formavimo atvirktine seka
atvej, kai naujas elementas jungiamas srao pradioje.
srao gale atitinka srao formavimo tiesiogine seka atvej, kai
naujas elementas jungiamas srao gale.
P175B502 T02
T01

23

Informacijos terpimas srao viduje 1/2

...

...

-3

s
d

int k; k = 1;
// k reikm vedama arba skaiiuojama
Mazgas *d = new Mazgas;
d->duom = k;
struct Mazgas

int duom;
Mazgas *sek;
};
P175B502 T02

24

Informacijos terpimas srao viduje 2/2

...

...

-3

s
d

Turi bti inomas s adresas elemento, u kurio terpiama

d->sek = s->sek;
s->sek = d;

Ar is bdas tinka srao gale?


P175B502 T02

25

Inf. n

Inf. 1

Inf. 0

Elemento terpimas u nurodyto

Inf. 1a

...

NULL

s u kurio terpti
d terpiamas elementas
Perraome nuorod
raome nuorod

P175B502 T02

26

Inf. 1

Inf. 0

Inf. n

Elemento terpimas prie pirmj

...

d terpiamas elementas

Inf. 1a

NULL

Perraome nuorod
raome nuorod
P175B502 T02

27

Tiesinis sraas
Paieka

P175B502 T02

28

Paieka
Maiausios (didiausios) reikms paieka.
Iekoma konkreios reikms srae (grinamas
atsakymas yra arba nra; arba grainamas surastos
reikms adresas, neradus NULL).
Iekoma, kiek yra element, turini nurodyt poym.
...

Tinka visi nuoseklios srao periros algoritmai, naudoti


darbui su masyvais.
P175B502 T02

29

Maiausios (didiausios) reikms paieka 1/2


Rezultatas:
Reikm
Elemento, turinio t reikm, adresas
int MaxReiksme(Mazgas *p)
p srao pradios rodykl
{
int r = -10000;
for (Mazgas *d = p; d !=NULL; d = d->sek)
if ( d->duom > r) r = d->duom;
return r;
}
Pradin paiekos reikm gali bti r = p->duom;
jeigu sraas netuias (p != NULL)
P175B502 T02

30

Maiausios (didiausios) reikms paieka 2/2


Rezultatas:
Reikm
Elemento, turinio t reikm, adresas
Mazgas *MaxVieta(Mazgas *p)
{
Mazgas *did = p;
for (Mazgas *d = p; d !=NULL; d = d->sek)
if ( d->duom > did->duom) did = d;
return did;
}

did = NULL reikia, kad sraas tuias

P175B502 T02

31

Reikms paieka
Mazgas *Vieta(Mazgas *p, int r)
{
for (Mazgas *d = p; d !=NULL; d = d->sek)
if (d->duom == r)
return d;
return NULL;
}
bool Yra(Mazgas *p, int r)
{
for (Mazgas *d = p; d !=NULL; d = d->sek)
if (d->duom == r)
return true;
return false;
}
P175B502 T02

32

Kiek yra reikmi?


int KiekYra(Mazgas *p, int r)
{
int k = 0;
for (Mazgas *d = p; d !=NULL; d = d->sek)
if (d->duom == r)
k++;
return k;
}

Rezultatas 0 reikia, kad srae element su reikme r nra

P175B502 T02

33

Elemento prie inom element radimas

-3
r

Mazgas *VietaPries(Mazgas *p, Mazgas *v){


// p srao pradia,
// v inomas elementas (v != p),
// r elementas, esantis tiesiogiai prie v
Mazgas *r;
for (r = p; r->sek != v; r = r->sek);
return r;
}
Koks bus rezultatas, jeigu v == p ?
P175B502 T02

34

Tiesinis sraas
Rikiavimas minmax bdu

P175B502 T02

35

Srao rikiavimas: minmax 1/3


for (Mazgas *d1 = p; d1 != NULL; d1 = d1->sek)
{

/* Rodykl d1 rodo didiausios reikms


paiekos intervalo pradi.
Rasta didiausia reikm bus sukeiiama su
d1 elemento reikme:
informacini dali sukeitimas vietomis.
*/
}

P175B502 T02

36

Srao rikiavimas: minmax 2/3


for (Mazgas *d1 = p; d1 != NULL; d1 = d1->sek)
{
// Didiausios reikms paieka intervale
Mazgas *maxv = d1;
for (Mazgas *d2 = d1; d2 != NULL; d2 = d2->sek)
if (d2->duom > maxv->duom)
maxv = d2;

P175B502 T02

37

Srao rikiavimas: minmax 3/3


for (Mazgas *d1 = p; d1 != NULL; d1 = d1->sek) {
Mazgas *maxv = d1;
for (Mazgas *d2 = d1; d2 != NULL; d2 = d2->sek)
if (d2->duom > maxv->duom)
maxv = d2;
// Informacini dali sukeitimas vietomis
int k = d1->duom;
d1->duom = maxv->duom;
maxv->duom = k;
}

P175B502 T02

38

Pastabos

Dirbant su dinaminiais sraais btina patikrinti funkcij


(metod) veikim, kai:
sraas tuias
srae yra tik vienas elementas
apdorojamas pirmas srao elementas
apdorojamas paskutinis srao elementas
apdorojamas vidinis srao elementas

P175B502 T02

39

Tiesinis sraas
Rikiavimas porini sukeitimo bdu

P175B502 T02

40

Nagrinjami du gretimi elementai (pora)


Jie sukeiiami vietomis arba ne
Sraas peririmas pakartotinai daug kart
Rikiavimas baigiamas, kai eilins periros metu
nebuvo sukeistas n vienas elementas
Sraas rikiuojamas, jeigu jame yra bent vienas
elementas

P175B502 T02

41

Rikiavimas: gretima pora 1/5


Mazgas *d, *d1;
d = d1 = p;

d1

while (d1 != NULL) {


d = d1;
d1 = d1->sek;

d1

d1

}
P175B502 T02

42

Rikiavimas: gretima pora 2/5


p

d1

while (d1 != NULL) {


d = d1;
d1 = d1->sek;

d1

d1

P175B502 T02

43

Rikiavimas: gretima pora 3/5


p

d1

p
while (d1 != NULL) {
d = d1;
d1 = d1->sek;

d1

d P175B502 T02

d1

44

Rikiavimas: gretima pora 4/5


p

d1

d1

d P175B502 T02

d1

p
while (d1 != NULL) {
d = d1;
d1 = d1->sek;

45

Rikiavimas: gretima pora 5/5


p

d1

while (d1 != NULL) {


d = d1;
d1 = d1->sek;

d1

d1

P175B502 T02

46

Rikiavimas: keiiamos reikms


void Klas::Burbulas1()
{ bool yra = true; Mazgas *d, *d1;
while (yra) {
yra = false; d = d1 = p;
while (d1 != NULL) {
if (d1->duom > d->duom) {
int
c = d->duom;
d->duom = d1->duom;
d1->duom = c;
yra = true;
}

d = d1;

d1 = d1->sek;

}
}
}

P175B502 T02

47

Sraas su fiktyviais elementais

Sraas su fiktyviais elementais


p

1/3

-3

Pirmas ir paskutinis elementai nenaudojami


informacijai saugoti.
Sraas niekada nebus tuias.
Element terpimas bei alinimas vyksta tik srao
viduje (maiau tikrinim).
P175B502 T02

49

Sraas su fiktyviais elementais


p

2/3

-3

g
Galimi sraai tik su vienu fiktyviu elementu.
Patogu turti rodykl srao paskutin element.

P175B502 T02

50

Sraas su fiktyviais elementais

3/3

p
d

Nupiekite naujo elemento d terpimo veiksmus:

d->sek = p->sek;
p->sek = d;

P175B502 T02

51

Santrauka

Tiesinis dinaminis sraas


Formavimas

Perira
Element alinimas

Element terpimas
Duomen paieka

Dklas

Rikiavimas

Eil
P

P175B502 T02

53