Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avSiv Åkesson
1
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
2
Anders Sjögren 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. 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. Komplex z.........
3
Anders Sjögren malloc() och calloc() Stack Bytes Heap Stack Heap Stack Heap calloc() (malloc()) har använts en gång calloc() (malloc()) har använts flera gång länkad lista, posterna hänger ihop med pekare Att indexera fungerar bra, z[3] Att indexera fungerar inte, z[3] z[3] Att indexera fungerar bra, z[3] Att utöka en ”array” genom succesiva allokeringar går inte så bra, minnet ”hänger” inte ihop.
4
Anders Sjögren Tänk om arrayen Komplex 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 Komplex z......... Detta löser problemet!
5
Anders Sjögren Länkad lista 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 inget = null re im pekare re im pekare re im pekare re im pekare Den nya strukturen, posten
6
Anders Sjögren Länkad lista strukturen inget = null typedefstruct Komplex{ floatre; /* realdel */ float im; /* Imaginärdel */ struct Komplex*nextPek; /* pekare till nästa */ } Komplex ; re im pekare re im pekare re im pekare re im pekare Eftersom strukturen skall referera till sig själv så måste definitionen se ut på detta sätt.
7
Anders Sjögren Hur skapas en länkad lista? main() inget = null int main ( void ) { Komplex* zListPek ; zListPek = LaesKomplexaTalLista(); SkrivKomplexTalLista( zListPek ); /* free() har utelämnats, skriv den rutinen själv */ return 0 ; } re im pekare re im pekare re im pekare re im pekare Det behövs en pekare till första posten! zListPek Denna funktion skapar listan
8
Anders Sjögren Hur skapas en länkad lista? 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. inget = null re im pekare re im pekare re im pekare re im pekare zListPek Repetera rekursion?
9
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken; 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 ; } Hur skapas en länkad lista? rekursion ger en elegant lösning! L K T L förkortas LINKLIST:EXE
10
Anders Sjögren Hur skapas en länkad lista? Stack Bytes Heap tid
11
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=1 im=1 next= ? re=1 im=1 next= ? tid L K T L LaesKomplexaTalLista() anropas första gången och allokerar ”sin post”, utan att fylla i någon adress till nästa post (nextPek). Koden ofull- ständig!
12
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=1 im=1 next= ? re=2 im=2 next= ? tid L K T L LaesKomplexaTalLista() anropas 2:a gången och pss allokeras dess post.
13
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? tid L K T L re=2 im=2 next= ? L K T L LaesKomplexaTalLista() anropas 3:a gången
14
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL tid L K T L Nu avslutas inmatningen och next ges värdet NULL Koden ofull- ständig!
15
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL tid L K T L LKTL har ju adressen till ”sin” post som strax skall returneras
16
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL tid L K T L 3:e LKTL returnerar adressen till ”sin” post till 2:a LKTL. Koden ofull- ständig!
17
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= ? re=2 im=2 next= re=3 im=3 next= NULL tid L K T L 2:a LKTL får då reda på adressen till nästa post och kan tilldela sin post rätt next-värde. Koden ofull- ständig!
18
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= ? re=2 im=2 next= re=3 im=3 next= NULL tid L K T L osv....
19
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= ? re=2 im=2 next= re=3 im=3 next= NULL tid L K T L osv.... Koden ofull- ständig!
20
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= re=2 im=2 next= re=3 im=3 next= NULL tid L K T L osv.... Koden ofull- ständig!
21
Anders Sjögren Hur skapas en länkad lista? Stack Bytes re=1 im=1 next= ? Heap re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= ? re=1 im=1 next= ? re=2 im=2 next= ? re=3 im=3 next= NULL re=1 im=1 next= re=2 im=2 next= re=3 im=3 next= NULL tid L K T L zListPek Avslutningsvis så returneras adressen till den först allokerade posten till zListPek som blir ”handtaget” till listan.
22
Anders Sjögren Hur skapas en länkad lista? main() inget = null int main ( void ) { Komplex* zListPek ; zListPek = LaesKomplexaTalLista(); SkrivKomplexTalLista( zListPek ); /* free() har utelämnats, skriv den rutinen själv */ return 0 ; } re im pekare re im pekare re im pekare re im pekare Det behövs en pekare till första posten! zListPek Denna funktion skapar listan
23
Anders Sjögren Hur skapas en länkad lista? Det här skulle jag nog behöva höra en gång till.
24
Anders Sjögren Går det inte att skapa listan med iteration? ?
25
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken = ' '; 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 ; } det går att skapa en länkad lista med iteration L K T L förkortas l_list_i.exe Hur skapas en länkad lista?
26
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken = ' '; 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 ; } det går att skapa en länkad lista med iteration l_list_i.exe Hur skapas en länkad lista? Stack re=1 im=1 next= NULL Heap huvudPek svansPek
27
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken = ' '; 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 ; } det går att skapa en länkad lista med iteration l_list_i.exe Hur skapas en länkad lista? re=1 im=1 next= re=? im=? next= ? huvudPek svansPek
28
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken = ' '; 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 ; } det går att skapa en länkad lista med iteration l_list_i.exe Hur skapas en länkad lista? re=1 im=1 next= re=2 im=2 next= NULL huvudPek svansPek
29
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken = ' '; 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 ; } det går att skapa en länkad lista med iteration l_list_i.exe Hur skapas en länkad lista? re=1 im=1 next= re=2 im=2 next= huvudPek svansPek re=? im=? next= ?
30
Anders Sjögren Komplex*LaesKomplexaTalLista( void ) { charavslutandeTecken = ' '; 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 ; } det går att skapa en länkad lista med iteration l_list_i.exe Hur skapas en länkad lista? re=1 im=1 next= re=2 im=2 next= huvudPek svansPek re=3 im=3 next= NULL osv....Det som avslutvisnings returneras är huvudPek’s värde
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.