502 2015 pv t02 2 vienkryptis veiksmai

54
T02 Vienkryptis sąrašas 2/3

Upload: mantas-smaidrys

Post on 30-Sep-2015

224 views

Category:

Documents


5 download

DESCRIPTION

Informatika

TRANSCRIPT

  • T02 Vienkryptis sraas

    2/3

  • P175B502 T02 2

    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 3

    Tiesinis sraas

    Informacijos sukeitimas vietomis

  • P175B502 T02 4

    Dviej element informacini dali sukeitimas vietomis

    Galimi variantai:

    sukeisti informacines dalis;

    perkabinti rodykles (tik B123 modulio stud.).

    p 5 8 9 3

    s1 s2

  • P175B502 T02 5

    Informacini dali sukeitimas 1/3

    int k = s1->duom; // 1

    s1->duom = s2->duom; // 2

    s2->duom = k; // 3

    p 5 8 9 3

    s1 s2

    5 k

    struct Mazgas {

    int duom;

    Mazgas *sek;

    };

  • P175B502 T02 6

    Informacini dali sukeitimas 2/3

    int k = s1->duom; // 1

    s1->duom = s2->duom; // 2

    s2->duom = k; // 3

    p 9 8 9 3

    s1 s2

    5 k

    struct Mazgas {

    int duom;

    Mazgas *sek;

    };

  • P175B502 T02 7

    Informacini dali sukeitimas 3/3

    int k = s1->duom; // 1

    s1->duom = s2->duom; // 2

    s2->duom = k; // 3

    p 9 8 5 3

    s1 s2

    5 k

    struct Mazgas {

    int duom;

    Mazgas *sek;

    };

  • P175B502 T02 8

    Tiesinis sraas

    Element alinimas Srao naikinimas

  • P175B502 T02 9

    1-o elemento alinimas

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

    5 1 p ... p

    d

    Ar is bdas tinka sraui i vieno elemento?

    1 2 3

  • P175B502 T02 10

    Vidinio elemento alinimas

    v->sek = d->sek; delete d;

    1 -3 ...

    d v

    5 ...

    Ar is bdas tinka srao gale?

    Randamas alinamo elemento adresas d ir prie j esanio elemento adresas v; po to:

  • P175B502 T02 11

    Elemento alinimas (kitas bdas) 1/3

    d surandamas alinamas elementas

    s sekantis u d elementas

    Mazgas *s = d->sek; // sekantis elementas

    p 5 8 9 3

    d s

  • P175B502 T02 12

    Elemento alinimas (kitas bdas) 2/3

    alinam element d perrayti s element

    *d = *s;

    p 5 9 9 3

    d s

  • P175B502 T02 13

    Elemento alinimas (kitas bdas) 3/3

    p 5 9 9 3

    d s

    is bdas netinka srao gale!

    delete s;

  • P175B502 T02 14

    Elemento paalinimas i srao

    (nuorod korekcija)

    ... NULL

    Inf.

    0

    Inf.

    1

    Inf.

    2

    Inf.

    n

    p

    d

    Reikia rasti prie tai esanio elemento adres Imesti i srao = perrayti adres

    Dabar galima atsisakyti elemento

    Srao pradios elementas imetamas perskaiiuojant nuorod p

    v

  • P175B502 T02 15

    Elemento paalinimas i srao

    (reikmi persiuntimas)

    ... NULL

    Inf.

    0

    Inf.

    1

    Inf.

    2

    Inf.

    n

    p

    d

    Imesti i srao = perrayti reikm Dabar galima atsisakyti elemento (sekanio)

    Netinka srao paskutiniam elementui

    s

    sidmkime sekanio elemento adres

    Inf.

    2

  • P175B502 T02 16

    Srao naikinimas

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

    while (p != NULL) { // p srao pradia

    Mazgas *d = p;

    p = p->sek;

    delete d;

    }

    struct Mazgas {

    int duom; Mazgas *sek; };

    p 5 8 9 3

    d

    1 / 4

  • P175B502 T02 17

    Srao naikinimas

    struct Mazgas {

    int duom; Mazgas *sek; };

    p 8 9 3

    d

    2 / 4

    Kartoti 1-o elemento alinim kol sraas taps tuias:

    while (p != NULL) { // p srao pradia

    Mazgas *d = p;

    p = p->sek;

    delete d;

    }

  • P175B502 T02 18

    Srao naikinimas

    struct Mazgas {

    int duom; Mazgas *sek; };

    p 9 3

    d

    3 / 4

    Kartoti 1-o elemento alinim kol sraas taps tuias:

    while (p != NULL) { // p srao pradia

    Mazgas *d = p;

    p = p->sek;

    delete d;

    }

  • P175B502 T02 19

    Srao naikinimas

    struct Mazgas {

    int duom; Mazgas *sek; };

    p 3

    d

    4 / 4

    Kartoti 1-o elemento alinim kol sraas taps tuias:

    while (p != NULL) { // p srao pradia

    Mazgas *d = p;

    p = p->sek;

    delete d;

    }

  • P175B502 T02 20

    Srao naikinimas

    ... NULL

    Info

    rmac

    ija 0

    Info

    rmac

    ija 1

    Info

    rmac

    ija 2

    Info

    rmac

    ija n

    p

    d

    NULL

  • P175B502 T02 21

    Tiesinis sraas

    Naujo elemento terpimas

  • P175B502 T01 22

    Reikia inoti naujo elemento terpimo viet: srao pradioje; srao viduje; srao gale.

    Naujo elemento terpimo situacijos 1/2

    Pavyzdiui: prie didiausi reikm (savyb) turint element; u didiausi reikm (savyb) turinio elemento; nepaeidiant rikiavimo tvarkos; . . .

    P175B502 T02 22

  • P175B502 T01 23

    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.

    Naujo elemento terpimo situacijos 2/2

    Dirbant su vienkrypiu srau reikia surasti, kur terpti. terpim prie, reikia keisti terpimu po.

    P

    P175B502 T02 23

  • P175B502 T02 24

    Informacijos terpimas srao viduje 1/2

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

    1

    -3 ...

    s

    d 1 k

    5 ...

    struct Mazgas {

    int duom;

    Mazgas *sek;

    };

  • P175B502 T02 25

    Informacijos terpimas srao viduje 2/2

    Turi bti inomas s adresas elemento, u kurio terpiama

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

    1

    -3 ...

    s

    d 1 k

    5 ...

    Ar is bdas tinka srao gale?

  • P175B502 T02 26

    Elemento terpimas u nurodyto

    ... NULL

    Inf.

    0

    Inf.

    1a

    Inf.

    1

    Inf.

    n

    p

    d

    s s u kurio terpti

    d terpiamas elementas Perraome nuorod

    raome nuorod

  • P175B502 T02 27

    Elemento terpimas prie pirmj

    ... NULL In

    f. 0

    Inf.

    1a

    Inf.

    1

    Inf.

    n

    p

    d

    d terpiamas elementas

    Perraome nuorod

    raome nuorod

  • P175B502 T02 28

    Tiesinis sraas Paieka

  • P175B502 T02 29

    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 30

    Maiausios (didiausios) reikms paieka 1/2

    Rezultatas: Reikm Elemento, turinio t reikm, adresas

    int MaxReiksme(Mazgas *p) { 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)

    p srao pradios rodykl

  • P175B502 T02 31

    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 32

    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 33

    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 34

    Elemento prie inom element radimas

    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; }

    5 -3 p 7

    v

    r

    Koks bus rezultatas, jeigu v == p ?

  • P175B502 T02 35

    Tiesinis sraas Rikiavimas minmax bdu

  • P175B502 T02 36

    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 37

    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 38

    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 39

    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

    Pastabos

  • P175B502 T02 40

    Tiesinis sraas Rikiavimas porini sukeitimo bdu

  • P175B502 T02 41

    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 42

    Rikiavimas: gretima pora 1/5

    p

    d d1

    Mazgas *d, *d1;

    d = d1 = p;

    p

    d d1

    p

    d d1

    while (d1 != NULL) {

    d = d1;

    d1 = d1->sek;

    }

  • P175B502 T02 43

    Rikiavimas: gretima pora 2/5

    p

    d d1

    p

    d d1

    p

    d d1

    while (d1 != NULL) {

    d = d1;

    d1 = d1->sek;

    }

  • P175B502 T02 44

    Rikiavimas: gretima pora 3/5

    while (d1 != NULL) {

    d = d1;

    d1 = d1->sek;

    }

    p

    d d1

    p

    d d1

    p

    d d1

  • P175B502 T02 45

    Rikiavimas: gretima pora 4/5

    while (d1 != NULL) {

    d = d1;

    d1 = d1->sek;

    }

    p

    d d1

    p

    d d1

    p

    d d1

  • P175B502 T02 46

    Rikiavimas: gretima pora 5/5

    while (d1 != NULL) {

    d = d1;

    d1 = d1->sek;

    }

    p

    d d1

    p

    d d1

    p

    d d1

  • P175B502 T02 47

    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; }

    }

    }

  • Sraas su fiktyviais elementais

  • P175B502 T02 49

    Sraas su fiktyviais elementais

    Pirmas ir paskutinis elementai nenaudojami informacijai saugoti.

    Sraas niekada nebus tuias.

    Element terpimas bei alinimas vyksta tik srao viduje (maiau tikrinim).

    1 -3 p

    1/3

  • P175B502 T02 50

    Sraas su fiktyviais elementais

    Galimi sraai tik su vienu fiktyviu elementu.

    Patogu turti rodykl srao paskutin element.

    2/3

    1 -3 p 5

    g

  • P175B502 T02 51

    Sraas su fiktyviais elementais

    Nupiekite naujo elemento d terpimo veiksmus:

    p

    d 5

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

    3/3

  • Santrauka

  • P175B502 T02 53

    Tiesinis dinaminis sraas

    Formavimas

    Perira

    Element alinimas

    Element terpimas

    Duomen paieka

    Rikiavimas

    P

    Dklas

    Eil