data i prim rminnet som en l nkad lista
Download
Skip this Video
Download Presentation
Data (i primärminnet) som en länkad lista

Loading in 2 Seconds...

play fullscreen
1 / 30

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


  • 100 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 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