1 / 30

C-programmering ID120V

C-programmering ID120V. Stack och Kö. 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.

cosima
Télécharger la présentation

C-programmering ID120V

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. C-programmering ID120V Stack och Kö william@kth.se William Sandqvist william@kth.se

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

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

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

  5. 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 stegnedåt. Det räcker med att ta bort platsen ochordna pekarna. Push Vi behöver inte flytta elementen i listan – bara ordna pekarna. William Sandqvist william@kth.se

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

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

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

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

  10. NULL 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 BottenPekarTyp William Sandqvist william@kth.se

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

  12. NULL 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 A n d e r s William Sandqvist william@kth.se bottenPek

  13. NULL Push() 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;} d invärde utvärde invärde e invärde r utvärde s William Sandqvist william@kth.se bottenPek

  14. NULL 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;} A n d e r s William Sandqvist william@kth.se bottenPek

  15. NULL Pop() Både data in resp data ut Tar bort stackelement och återför data i den borttagna tunnan via *x . 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

  16. NULL Baklanges() Funktionen Baklanges() tar slut och har via referensen xString uppdaterat strängen i main(). 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

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

  18. NULL ”köhandtaget” data data data data pekare pekare pekare pekare börjanPek Själva kön slutPek 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 William Sandqvist william@kth.se

  19. Kö funktionsprototyper • voidStallDigIKon( KoTyp* , DataTyp); •  placerar data sist i kön. • voidNasta( KoTyp* , DataTyp* ); •  återför datat som är först i kön och tar sedan bort det från kön • intArTom( KoTyp ); •  returnerar 1 om kön är tom annars 0. • DataTypVemPaTur( KoTyp ); •  returnerar datat som ligger först i kön William Sandqvist william@kth.se

  20. Kö programexempel Provkör vid lab! 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. William Sandqvist william@kth.se

  21. NULL ”köhandtaget” data data data data pekare pekare pekare pekare börjanPek Själva kön slutPek 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. William Sandqvist william@kth.se

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

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

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

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

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

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

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

More Related