William Sandqvist william@kth.se C-programmering ID120V Stack och Kö william@kth.se William Sandqvist william@kth.se.

Slides:



Advertisements
Liknande presentationer
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.
Advertisements

© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2004 Datastrukturer och algoritmer Föreläsning 4.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
Algoritmer och data strukturer -Länkade listor
Föreläsning 3 Lista Array/länkad lista Lista implementerad som länkad lista Inlämningsuppgifter.
Operatorer.
Programmeringsteknik Föreläsning 4 Skolan för Datavetenskap och kommunikation.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Föreläsning 4.
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
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.
Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack
C-programmering ID120V William Sandqvist Länkad lista
Programmeringsteknik för K och Media
1 Föreläsning 3 Datalogi för E1 / 2D1343 Repetition List List operationer Stränghantering For-slingor.
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.
William Sandqvist Funktion som byter plats på två variabler /* swap1.c first attempt at a swaping function */ /* from Stephen Prata, C Primer.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
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ö.
Vektorer (klassen Vector) Sortering
Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar.
Programmeringsteknik för Media1 & K1
William Sandqvist C:s minnesmodell.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 4 ( ) INNEHÅLL: -Logiska opertorer -Poster.
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.
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.
William Sandqvist Databuffer Omvandlar mellan olika storlekar på dataobjekt Anpassar mellan olika dataöverföringshastigheter Databuffer.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
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 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Problemlösningsmetodik
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Tabeller -Villkorssatser -Repetitionssatser.
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Datastrukturer och algoritmer
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Språket för inbyggda system 2
Anders Sjögren Filer - långtidslagring. Anders Sjögren Filtyper i DOS talet ett ( intx=1; ) lagrat i en –textfil, (en sekvens av tecken ( bytes )) enligt.
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.
F5 - Fält & strängar 1 Programmeringsteknik, 4p vt-00 Fält Många element av samma typ Typexempel : lista av heltal Gemensamt namn Individuella värden nås.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 7 ( ) Innehåll: -IPC: Meddelandeköer.
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.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
TILLÄMPAD DATALOGI (TILDA) Övning 1 Marcus Hjelm
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 10.
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Kronljusströmställaren 0, 1, 2, 3
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
OOP&M - teori1 OOP – Föreläsning 7 (Sista oop I) Konstruktioner för att hantera upprepningar Kapitel 11.
© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 4.
Anders Sjögren Operatorer. Anders Sjögren Operand(er)
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 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.
Länkade listor á la C/C++
Föreläsning 8: Exempel och problemlösning
Mer om repetionssatser och arrayer
Presentationens avskrift:

William Sandqvist william@kth.se C-programmering ID120V Stack och Kö william@kth.se William Sandqvist william@kth.se

William Sandqvist william@kth.se Data i länkad lista Det är enklast att nå länkade listor från ”ändarna”. Man lägger till eller tar bort element – men man flyttar inte om i listan. Stack Kö William Sandqvist william@kth.se

Två sätt att hantera data Stack och Kö sist in Stack LIFO först ut William Sandqvist william@kth.se

Två sätt att hantera data Stack och Kö först in först ut Kö FIFO William Sandqvist william@kth.se

Likna stacken med en stege Man kan bara kliva på i nedre ändan, push. Man kan bara kliva av i nedre ändan, pop. När någon ny kliver på måste inte alla andra på stegen ta ett kliv uppåt. Det räcker med att skapa en ny plats och ordna pekarna. När någon kliver av behöver inte alla ta ett steg nedåt. Det räcker med att ta bort platsen och ordna pekarna. Push Vi behöver inte flytta elementen i listan – bara ordna pekarna. William Sandqvist william@kth.se

William Sandqvist william@kth.se Stack, exempel Ett exempel på hur man med en länkad lista och funktionerna push() och pop() skapar en datastack ( datastruktur ).  Programmet vänder på teckenordningen i en sträng  Att lagra och vända på ordningen är typiskt för stacken William Sandqvist william@kth.se

Datatyper och funktionsprototyp Det data som vi vill lagra på stacken. Om man konstruerar Push() och Pop() för att ta en struct blir dessa funktioner generella. #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp *next ; } StackElementTyp ; typedef StackElementTyp* BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); Nyttolast! William Sandqvist william@kth.se

Datatyper och funktionsprototyp För att kunna lagra som en stack med en länkad lista så måste det finnas en next-pekare. Denna tillfogas av Push() m h a denna struct #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp * next ; } StackElementTyp ; typedef StackElementTyp* BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); StackElementTyp NULL Push() William Sandqvist william@kth.se

Datatyper och funktionsprototyp För att tydligt kunna skapa en pekare, handtag, till stacken (botten). OBS pekare! #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp * next ; } StackElementTyp ; typedef StackElementTyp * BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); StackElementTyp NULL BottenPekarTyp William Sandqvist william@kth.se

Datatyper och funktionsprototyp #include <stdio.h> #include <stdlib.h> typedef struct { int heltalsData; } DataTyp ; typedef struct StackElementTyp { DataTyp d; struct StackElementTyp * next ; } StackElementTyp ; typedef StackElementTyp * BottenPekarTyp ; void Pop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b , DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); För att lägga till, i botten, stackelement på stacken NULL BottenPekarTyp William Sandqvist william@kth.se

Bokstäver i omvänd ordning int main(int argc, char *argv[]) { char strang[21] = {'\0'}; printf("Ge en str\204ng, max 20 tecken: --> "); scanf("%s", strang ); baklanges( strang ); printf ("\nBakl\204nges blir det:\t%s\n", strang ); system("PAUSE"); return 0; } William Sandqvist william@kth.se

William Sandqvist william@kth.se baklanges() void Baklanges( char xString[] ) { int i; DataTyp data; BottenPekarTyp bottenPek = NULL ; for ( i=0 ; xString[i] != '\0' ; ++i ) { data.heltalsData = xString[i]; Push( &bottenPek , data ); } for ( i=0 ; xString[i] != '\0' ; ++i ) { Pop( &bottenPek , &data ); xString[i] = data.heltalsData ; } return; } Fyller på stacken NULL A n d e r s William Sandqvist william@kth.se bottenPek

William Sandqvist william@kth.se Push() NULL Både data in resp data ut Skapar stackelement , data + pekare A n void Push( BottenPekarTyp *b , DataTyp x ) { BottenPekarTyp temp; temp = malloc(sizeof( StackElementTyp )); temp->d = x ; temp->next = *b ; *b = temp ; return; } invärde d utvärde invärde e invärde r utvärde s William Sandqvist william@kth.se bottenPek

William Sandqvist william@kth.se baklanges()- Pop() void Baklanges( char xString[] ) { int i; DataTyp data; BottenPekarTyp bottenPek = NULL ; for ( i=0 ; xString[i] != '\0' ; ++i ) { data.heltalsData = xString[i]; Push( &bottenPek , data ); } for ( i=0 ; xString[i] != '\0' ; ++i ) { Pop( &bottenPek , &data ); xString[i] = data.heltalsData ; } return; } NULL A n d e r s William Sandqvist william@kth.se bottenPek

William Sandqvist william@kth.se Pop() Både data in resp data ut Tar bort stackelement och återför data i den borttagna tunnan via *x . NULL A A invärde n void Pop( BottenPekarTyp *b, DataTyp *x ) { BottenPekarTyp b1 = *b ; if ( !ArTom( b1 )) { *x = b1 -> d ; *b = b1 -> next ; free( b1 ); } else printf("Tom stack!\n"); return; } invärde d e utvärde r s utvärde William Sandqvist william@kth.se bottenPek

William Sandqvist william@kth.se Baklanges() Funktionen Baklanges() tar slut och har via referensen xString uppdaterat strängen i main(). NULL void Baklanges( char xString[] ) { int i; DataTyp data; BottenPekarTyp bottenPek = NULL ; for ( i=0 ; xString[i] != '\0' ; ++i ) { data.heltalsData = xString[i]; Push( &bottenPek , data ); } for ( i=0 ; xString[i] != '\0' ; ++i ) { Pop( &bottenPek , &data ); xString[i] = data.heltalsData ; } return; } A n d e r bottenPek s William Sandqvist william@kth.se

William Sandqvist william@kth.se Kör main() int main(int argc, char *argv[]) { char strang[21] = {'\0'}; printf("Ge en str\204ng, max 20 tecken: --> "); scanf("%s", strang ); baklanges( strang ); printf ("\nBakl\204nges blir det:\t%s\n", strang ); system("PAUSE"); return 0; } William Sandqvist william@kth.se

William Sandqvist william@kth.se Implementera en kö  en kö kan realiseras som en länkad lista via ett ”köhandtag” (struktur) håller man reda på början och slut i kön  med ”köhandtaget” kan man då lägga till data sist i kön resp plocka bort i början pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist william@kth.se

Kö funktionsprototyper void StallDigIKon( KoTyp* , DataTyp);  placerar data sist i kön. void Nasta( KoTyp* , DataTyp* );  återför datat som är först i kön och tar sedan bort det från kön int ArTom( KoTyp );  returnerar 1 om kön är tom annars 0. DataTyp VemPaTur( KoTyp );  returnerar datat som ligger först i kön William Sandqvist william@kth.se

William Sandqvist william@kth.se Kö programexempel Detta program tar emot heltal från tangentbordet och lagrar dem i en kö. På kommando kan det första talet i kön plockas bort. Provkör vid lab! William Sandqvist william@kth.se

William Sandqvist william@kth.se Hur det fungerar /* queue.c */ #include <stdio.h> #include <stdlib.h> typedef struct { int heltal; } DataTyp ; typedef struct KoElementTyp { DataTyp d; struct KoElementTyp * next ; } KoElementTyp ; Datat som programmet skall bearbeta inläses till en struct av typen DataTyp. Funktionen StallDigIKon() tillfogar en next-pekare och lagrar detta , data och pekare, i en ny struktur av typen KoElementTyp. Denna inlänkas sedan sist i kön. pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist william@kth.se

William Sandqvist william@kth.se Hur det fungerar typedef struct KoElementTyp { DataTyp d; struct KoElementTyp *next ; } KoElementTyp ; typedef KoElementTyp * KoElementPekarTyp ; typedef struct KoTyp KoElementPekarTyp koBorjanPek, koSlutPek ; } KoTyp ; StackElementTyp *BottenPekarTyp ; pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist william@kth.se

William Sandqvist william@kth.se Ställ dig i kön Ny till slutet av kön pekare data pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare pekare data pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare William Sandqvist william@kth.se

William Sandqvist william@kth.se StallDigIKon() void StallDigIKon( KoTyp* koPek, DataTyp x) { KoElementPekarTyp temp; temp = malloc(sizeof(KoElementTyp)) ; temp->d = x; temp->next = NULL ; if ( ArTom( *koPek )) koPek->koBorjanPek = koPek->koSlutPek = temp ; else koPek->koSlutPek->next = temp ; koPek->koSlutPek = temp ; } return ; William Sandqvist william@kth.se

William Sandqvist william@kth.se Nästa! Ska betjänas pekare data pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare Ny först i kön! pekare data pekare data NULL ”köhandtaget” data börjanPek slutPek pekare William Sandqvist william@kth.se

William Sandqvist william@kth.se Nasta() void Nasta( KoTyp* koPek, DataTyp* xPek) { KoElementPekarTyp temp = koPek->koBorjanPek ; if ( !ArTom( *koPek ) ) *xPek = temp -> d ; koPek->koBorjanPek = temp->next ; free( temp ); } else printf("Tom k\224! \n"); return; William Sandqvist william@kth.se

William Sandqvist william@kth.se main() int main(int argc, char *argv[]) { char c ; DataTyp data; KoTyp ko = {NULL, NULL}; Info(); while (printf("--> "),scanf(" %c",&c), c != 'a' ) if ( c=='+'){scanf("%d", &data.heltal); StallDigIKon( &ko, data ); } else if ( c=='-' ) if ( ArTom( ko )) printf("Tom k\224! \n"); else { Nasta( &ko, &data ); printf("%d har tagits bort från k\224n!\n", data.heltal); } system("PAUSE"); return 0; William Sandqvist william@kth.se

William Sandqvist william@kth.se ArTom() int ArTom(KoTyp k) { if(k.koBorjanPek != NULL) return 0; /* Är INTE tom */ else return 1; /* Är tom */ } Inte mycket att bråka om … William Sandqvist william@kth.se