1 / 30

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 ?. Problemet med Komplex z[?] är att storleken måste bestämmas när man skriver programmet inte när det körs.

kesia
Download Presentation

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

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )

  2. 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 .........

  3. 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

  4. 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!

  5. 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

  6. 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 ;

  7. 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

  8. 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?

  9. 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

  10. Hur skapas en länkad lista? Bytes Heap Stack tid

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. Hur skapas en länkad lista? Det här skulle jag nog behöva höra en gång till.

  24. Går det inte att skapa listan med iteration? ?

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

More Related