300 likes | 432 Views
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.
E N D
Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
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() 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 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!
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
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 ;
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
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 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 lista? Bytes Heap Stack tid
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 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 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 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 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 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 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 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 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 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 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
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 lista? Det här skulle jag nog behöva höra en gång till.
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
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
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
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
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
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