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

Slides:



Advertisements
Liknande presentationer
Talföljder formler och summor
Advertisements

X-mas algebra Är du redo? Klicka!!.
void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Kräkseminarium Bo Ahrenfeldt
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Funktioner och programorganisation
Algoritmer och data strukturer -Länkade listor
Föreläsning 3 Lista Array/länkad lista Lista implementerad som länkad lista Inlämningsuppgifter.
För utveckling av verksamhet, produkter och livskvalitet. Rekursiva algoritmer, en annan sort tänkande -Hur -När -Bra/Dåligt (kap 7)
Datastrukturer och algoritmer Föreläsning 11. Datastrukturer och algoritmer VT08 Innehåll  Mängd  Lexikon  Heap  Kapitel , , 14.4.
Komplexa tal inför Laborationerna
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och datastructurer - Lite mer rekursivitet -Sorterrings algoritmer -- Kapitel 8 Algoritmer.
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Algoritmer och datastrukturer
Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack
Föreläsning 6 Länkade lista Komplexitet Linjärsökning & binärsökning
C-programmering ID120V William Sandqvist Länkad lista
Programmeringsteknik K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Föreläsning 10 Länkade lista Stack och Kö Att arbeta med listor
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Föreläsning 11 Arrayer.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
Programmeringsteknik för Media1 & K1
William Sandqvist C:s minnesmodell.
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Modulär programutveckling
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
Anders Sjögren Bitfält Kompakt datalagring i delar av bytes, ett fält av bits StackBytes Heap.
Riktade listor i C och Java Lösning till gruppövning 1.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Programmering i C# 9. Pekare och osäker kod.
Anders Sjögren Bitfält exempel Nu kommer ett förbättrat program. Det är funktions- uppdelat och kan lägga till poster som lagras på fil.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
Rekursion. En metoddefinition som innehåller ett anrop av sig själv kallas rekursiv.
F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med.
Köer -- Kapitel 16. Principen med en kö Köer är FIFO datastrukturer  First In – First Out  enqueue() Lägg till data i kön (först)  dequeue() Hämta.
Anders Sjögren Deklarationsområde och funktioner.
Lennart Edblom & Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
OOP&M - teori1 OOP – Föreläsning 7 (Sista oop I) Konstruktioner för att hantera upprepningar Kapitel 11.
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Funktioner något in och något annat ut.
TDP004 Objektorienterad Programmering Fö 5 Minneshantering.
Länkade listor á la C/C++
Presentationens avskrift:

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

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

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.

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!

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

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.

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

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?

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

Anders Sjögren Hur skapas en länkad lista? Stack Bytes Heap tid

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!

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.

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

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!

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

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!

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!

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

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!

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!

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.

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

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

Anders Sjögren Går det inte att skapa listan med iteration? ?

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?

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

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

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

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= ?

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