Data i prim rminnet som en l nkad lista
Download
1 / 30

Data (i primärminnet) som en länkad lista - PowerPoint PPT Presentation


  • 99 Views
  • Uploaded on

Data (i primärminnet) som en länkad lista. datatypen för varje element i listan är en struktur , post ( struct ). Tänk om arrayen Komplex z[?]; inte räcker ?. Problemet med Komplex z[?] är att storleken måste bestämmas när man skriver programmet inte när det körs.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Data (i primärminnet) som en länkad lista' - kesia


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Data i prim rminnet som en l nkad lista

Data (i primärminnet) som en länkad lista

datatypen för varje element i listan är en struktur, post ( struct )


T nk om arrayen komplex z inte r cker
Tänk om arrayenKomplex z[?];inte räcker ?

  • Problemet med Komplex z[?] är att storleken måste bestämmas när man skriver programmet inte när det körs.

  • De medel som står tillbuds, tills nu, är att allokera upp minne på heapen m h a (malloc()) eller calloc() ( continous ). Funktionen ger konsekutivt minne på heapen som kan behandlas som en array. Dock måste allt minne allokeras på en gång. En lösning blir att succesivt allokera en ny vektor som är större än den föregående. Metoden kräver dock ”dubbelt” minne. Varför det?

  • En länkad lista löser bägge punkterna ovan som vi nu skall se.

z

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

.........


Malloc och calloc
malloc() och calloc()

Bytes

Att indexera fungerar bra, z[3]

Att indexera fungerar inte, z[3]

Att indexera fungerar bra, z[3]

Heap

Heap

z[3]

Heap

Att utöka en ”array” genom succesiva allokeringar går inte så bra, minnet ”hänger” inte ihop.

Stack

Stack

Stack

länkad lista, posterna hänger ihop med pekare

calloc() (malloc()) har använts en gång

calloc() (malloc()) har använts flera gång


T nk om arrayen komplex z inte r cker1
Tänk om arrayenKomplex z[?];inte räcker ?

  • allokera dynamiskt en struct ( komplext tal, tunna ) i taget och håll ihop dem med en länk ( pekare ) till en länkad lista

z

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

Komplex

.........

Detta löser problemet!


L nkad lista

re

re

re

re

im

im

im

im

pekare

pekare

pekare

pekare

Länkad lista

Den nya strukturen, posten

inget

= null

  • allokera dynamiskt en "tunna" i taget efter behov

  • låt föregående "tunna" peka ut nästa för att hålla ihop data


L nkad lista1

re

re

re

re

im

im

im

im

pekare

pekare

pekare

pekare

Länkad lista

inget

= null

  • strukturen

Eftersom strukturen skall referera till sig själv så måste definitionen se ut på detta sätt.

  • typedef struct Komplex {

    • float re; /* realdel */

  • float im; /* Imaginärdel */

  • struct Komplex *nextPek; /* pekare till nästa */

  • } Komplex ;


  • Hur skapas en l nkad lista

    re

    re

    re

    re

    im

    im

    im

    im

    pekare

    pekare

    pekare

    pekare

    Hur skapas en länkad lista?

    inget

    = null

    • main()

    zListPek

    Det behövs en pekare till första posten!

    int main ( void )

    {

    Komplex * zListPek ;

    zListPek = LaesKomplexaTalLista();

    SkrivKomplexTalLista( zListPek );

    /* free() har utelämnats, skriv den rutinen själv */

    return 0 ;

    }

    Denna funktion skapar listan


    Hur skapas en l nkad lista1

    re

    re

    re

    re

    im

    im

    im

    im

    pekare

    pekare

    pekare

    pekare

    Hur skapas en länkad lista?

    inget

    = null

    • när en "tunna" skapas vet man inte adressen till nästa!

    • rekursion löser detta problem elegant genom att skapa ( allokera dynamiskt ) nästa "tunna" innan pekarvärdet fylls i .

    zListPek

    Repetera rekursion?


    Hur skapas en l nkad lista2
    Hur skapas en länkad lista?

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken;

    Komplex *zPek;

    zPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\tGe real och imaginärdel --> ");

    scanf("%f%f%c",&zPek->re, &zPek->im, &avslutandeTecken );

    if ( avslutandeTecken == '*' ) {

    scanf("%c"); /* buffertrensning tangentbord */

    zPek->nextPek = NULL;

    return zPek;

    }

    else

    zPek->nextPek = LaesKomplexaTalLista();

    return zPek ;

    }

    • rekursion ger en elegant lösning!

    förkortas

    L K T L

    LINKLIST:EXE


    Hur skapas en l nkad lista3
    Hur skapas en länkad lista?

    Bytes

    Heap

    Stack

    tid


    Hur skapas en l nkad lista4
    Hur skapas en länkad lista?

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    Heap

    Koden ofull-ständig!

    LaesKomplexaTalLista()anropas första gången och allokerar ”sin post”, utan att fylla i någon adress till nästa post (nextPek).

    Stack

    L K T L

    L K T L

    L K T L

    L K T L

    tid


    Hur skapas en l nkad lista5
    Hur skapas en länkad lista?

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    Heap

    LaesKomplexaTalLista()anropas 2:a gången och pss allokeras dess post.

    Stack

    L K T L

    L K T L

    L K T L

    tid


    Hur skapas en l nkad lista6
    Hur skapas en länkad lista?

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= ?

    LaesKomplexaTalLista()anropas 3:a gången

    Stack

    L K T L

    L K T L

    L K T L

    L K T L

    L K T L

    tid


    Hur skapas en l nkad lista7
    Hur skapas en länkad lista?

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    Nu avslutas inmatningen och next ges värdet NULL

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    Koden ofull-ständig!

    tid


    Hur skapas en l nkad lista8
    Hur skapas en länkad lista?

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    LKTL har ju adressen till ”sin” post som strax skall returneras

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    tid


    Hur skapas en l nkad lista9
    Hur skapas en länkad lista?

    Bytes

    3:e LKTL returnerar adressen till ”sin” post till 2:a LKTL.

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    Koden ofull-ständig!

    tid


    Hur skapas en l nkad lista10
    Hur skapas en länkad lista?

    2:a LKTL får då reda på adressen till nästa post och kan tilldela sin post rätt next-värde.

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next=

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    Koden ofull-ständig!

    tid


    Hur skapas en l nkad lista11
    Hur skapas en länkad lista?

    Bytes

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next=

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    osv ....

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    tid


    Hur skapas en l nkad lista12
    Hur skapas en länkad lista?

    Bytes

    osv ....

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next=

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    Koden ofull-ständig!

    tid


    Hur skapas en l nkad lista13
    Hur skapas en länkad lista?

    Bytes

    osv ....

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next=

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next=

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    Koden ofull-ständig!

    tid


    Hur skapas en l nkad lista14
    Hur skapas en länkad lista?

    Bytes

    Avslutningsvis så returneras adressen till den först allokerade posten till zListPek som blir ”handtaget” till listan.

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next= ?

    re=1

    im=1

    next=

    re=2

    im=2

    next= ?

    re=2

    im=2

    next= ?

    re=2

    im=2

    next=

    Heap

    re=3

    im=3

    next= ?

    re=3

    im=3

    next= NULL

    re=3

    im=3

    next= NULL

    L K T L

    Stack

    L K T L

    L K T L

    L K T L

    zListPek

    tid


    Hur skapas en l nkad lista15

    re

    re

    re

    re

    im

    im

    im

    im

    pekare

    pekare

    pekare

    pekare

    Hur skapas en länkad lista?

    inget

    = null

    • main()

    zListPek

    Det behövs en pekare till första posten!

    int main ( void )

    {

    Komplex * zListPek ;

    zListPek = LaesKomplexaTalLista();

    SkrivKomplexTalLista( zListPek );

    /* free() har utelämnats, skriv den rutinen själv */

    return 0 ;

    }

    Denna funktion skapar listan


    Hur skapas en l nkad lista16
    Hur skapas en länkad lista?

    Det här skulle jag nog behöva höra en gång till.



    Hur skapas en l nkad lista17

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken = ' ';

    Komplex *huvudPek=NULL , *svansPek ;

    /*-- read ahead, forsta posten ---*/

    huvudPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet --> 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&huvudPek->re,&huvudPek->im,&avslutandeTecken );

    svansPek = huvudPek;

    while ( avslutandeTecken != '*' ) {

    svansPek->nextPek = (Komplex *)malloc(sizeof( Komplex ));

    svansPek = svansPek->nextPek;

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&svansPek->re,&svansPek->im,&avslutandeTecken);

    svansPek->nextPek = NULL;

    }

    return huvudPek ;

    }

    Hur skapas en länkad lista?

    • det går att skapa en länkad lista med iteration

    förkortas

    L K T L

    l_list_i.exe


    Hur skapas en l nkad lista18

    re=1

    im=1

    next= NULL

    Heap

    Stack

    huvudPek

    svansPek

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken = ' ';

    Komplex *huvudPek=NULL , *svansPek ;

    /*-- read ahead, forsta posten ---*/

    huvudPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet --> 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&huvudPek->re,&huvudPek->im,&avslutandeTecken );

    svansPek = huvudPek;

    while ( avslutandeTecken != '*' ) {

    svansPek->nextPek = (Komplex *)malloc(sizeof( Komplex ));

    svansPek = svansPek->nextPek;

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&svansPek->re,&svansPek->im,&avslutandeTecken);

    svansPek->nextPek = NULL;

    }

    return huvudPek ;

    }

    Hur skapas en länkad lista?

    • det går att skapa en länkad lista med iteration

    l_list_i.exe


    Hur skapas en l nkad lista19

    re=1

    im=1

    next=

    re=?

    im=?

    next= ?

    huvudPek

    svansPek

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken = ' ';

    Komplex *huvudPek=NULL , *svansPek ;

    /*-- read ahead, forsta posten ---*/

    huvudPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet --> 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&huvudPek->re,&huvudPek->im,&avslutandeTecken );

    svansPek = huvudPek;

    while ( avslutandeTecken != '*' ) {

    svansPek->nextPek = (Komplex *)malloc(sizeof( Komplex ));

    svansPek = svansPek->nextPek;

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&svansPek->re,&svansPek->im,&avslutandeTecken);

    svansPek->nextPek = NULL;

    }

    return huvudPek ;

    }

    Hur skapas en länkad lista?

    • det går att skapa en länkad lista med iteration

    l_list_i.exe


    Hur skapas en l nkad lista20

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken = ' ';

    Komplex *huvudPek=NULL , *svansPek ;

    /*-- read ahead, forsta posten ---*/

    huvudPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet --> 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&huvudPek->re,&huvudPek->im,&avslutandeTecken );

    svansPek = huvudPek;

    while ( avslutandeTecken != '*' ) {

    svansPek->nextPek = (Komplex *)malloc(sizeof( Komplex ));

    svansPek = svansPek->nextPek;

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&svansPek->re,&svansPek->im,&avslutandeTecken);

    svansPek->nextPek = NULL;

    }

    return huvudPek ;

    }

    Hur skapas en länkad lista?

    • det går att skapa en länkad lista med iteration

    re=1

    im=1

    next=

    re=2

    im=2

    next= NULL

    huvudPek

    svansPek

    l_list_i.exe


    Hur skapas en l nkad lista21

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken = ' ';

    Komplex *huvudPek=NULL , *svansPek ;

    /*-- read ahead, forsta posten ---*/

    huvudPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet --> 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&huvudPek->re,&huvudPek->im,&avslutandeTecken );

    svansPek = huvudPek;

    while ( avslutandeTecken != '*' ) {

    svansPek->nextPek = (Komplex *)malloc(sizeof( Komplex ));

    svansPek = svansPek->nextPek;

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&svansPek->re,&svansPek->im,&avslutandeTecken);

    svansPek->nextPek = NULL;

    }

    return huvudPek ;

    }

    Hur skapas en länkad lista?

    • det går att skapa en länkad lista med iteration

    re=1

    im=1

    next=

    re=2

    im=2

    next=

    re=?

    im=?

    next= ?

    huvudPek

    svansPek

    l_list_i.exe


    Hur skapas en l nkad lista22

    Komplex* LaesKomplexaTalLista( void )

    {

    char avslutandeTecken = ' ';

    Komplex *huvudPek=NULL , *svansPek ;

    /*-- read ahead, forsta posten ---*/

    huvudPek = (Komplex *)malloc(sizeof( Komplex ));

    printf("\nAvsluta med * efter sista talet --> 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&huvudPek->re,&huvudPek->im,&avslutandeTecken );

    svansPek = huvudPek;

    while ( avslutandeTecken != '*' ) {

    svansPek->nextPek = (Komplex *)malloc(sizeof( Komplex ));

    svansPek = svansPek->nextPek;

    printf("\nAvsluta med * efter sista talet 2 3* !");

    printf("\nGe real och imaginärdel --> ");

    scanf("%f%f%c",&svansPek->re,&svansPek->im,&avslutandeTecken);

    svansPek->nextPek = NULL;

    }

    return huvudPek ;

    }

    Hur skapas en länkad lista?

    • det går att skapa en länkad lista med iteration

    osv ....Det som avslutvisnings returneras är huvudPek’s värde

    re=1

    im=1

    next=

    re=2

    im=2

    next=

    re=3

    im=3

    next= NULL

    huvudPek

    svansPek

    l_list_i.exe


    ad