Presentation laddar. Vänta.

Presentation laddar. Vänta.

C-programmering ID120V William Sandqvist Stack och Kö

Liknande presentationer


En presentation över ämnet: "C-programmering ID120V William Sandqvist Stack och Kö"— Presentationens avskrift:

1 C-programmering ID120V William Sandqvist Stack och Kö

2 Data i länkad lista William Sandqvist Stack Kö 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.

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

4 Två sätt att hantera data William Sandqvist Stack och Kö först införst ut Kö FIFO

5 Likna stacken med en stege William Sandqvist 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. Vi behöver inte flytta elementen i listan – bara ordna pekarna. Push

6 Stack, exempel William Sandqvist 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

7 Datatyper och funktionsprototyp William Sandqvist #include typedef struct { intheltalsData; } DataTyp ; typedef struct StackElementTyp { DataTypd; struct StackElementTyp *next ; } StackElementTyp ; typedef StackElementTyp*BottenPekarTyp ; voidPop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b, DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); Det data som vi vill lagra på stacken. Om man konstruerar Push() och Pop() för att ta en struct blir dessa funktioner generella. Nyttolast!

8 Datatyper och funktionsprototyp William Sandqvist #include typedef struct { intheltalsData; } DataTyp ; typedef struct StackElementTyp { DataTypd; struct StackElementTyp* next ; } StackElementTyp ; typedef StackElementTyp*BottenPekarTyp ; voidPop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b, DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); 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 NULL StackElementTyp Push()

9 Datatyper och funktionsprototyp William Sandqvist #include typedef struct { intheltalsData; } DataTyp ; typedef struct StackElementTyp { DataTypd; struct StackElementTyp* next ; } StackElementTyp ; typedef StackElementTyp * BottenPekarTyp ; voidPop( BottenPekarTyp *b, DataTyp *x ); void Push( BottenPekarTyp *b, DataTyp x ) ; int ArTom( BottenPekarTyp b ); void Baklanges( char xString[] ); NULL StackElementTyp För att tydligt kunna skapa en pekare, handtag, till stacken (botten). OBS pekare! BottenPekarTyp

10 Datatyper och funktionsprototyp William Sandqvist #include typedef struct { intheltalsData; } DataTyp ; typedef struct StackElementTyp { DataTypd; struct StackElementTyp* next ; } StackElementTyp ; typedef StackElementTyp * BottenPekarTyp ; voidPop( 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

11 Bokstäver i omvänd ordning William Sandqvist 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; }

12 Fyller på stacken baklanges() William Sandqvist 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 bottenPek

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

14 baklanges()- Pop() William Sandqvist 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 bottenPek

15 William Sandqvist 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; } bottenPek NULL A n d e r s utvärde invärde Både data in resp data ut Tar bort stackelement och återför data i den borttagna tunnan via *x. A Pop() utvärde invärde

16 bottenPek NULL A n d e r s Funktionen Baklanges() tar slut och har via referensen xString uppdaterat strängen i main(). 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; } William Sandqvist

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

18

19 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 pekare data pekare data pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist

20 Kö funktionsprototyper William Sandqvist 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

21 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. Kö programexempel William Sandqvist Provkör vid lab!

22 Hur det fungerar pekare data pekare data pekare data pekare data NULL börjanPek slutPek Själva kön ”köhandtaget” William Sandqvist /* queue.c */ #include typedef struct { int heltal; } DataTyp ; typedef struct KoElementTyp { DataTypd; 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.

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

24 Ställ dig i kön pekare data pekare data pekare data pekare data NULL börjanPek slutPek ”köhandtaget” pekare data pekare data pekare data pekare data NULL börjanPek slutPek ”köhandtaget” Ny till slutet av kön William Sandqvist

25 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

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

27 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

28 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

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

30


Ladda ner ppt "C-programmering ID120V William Sandqvist Stack och Kö"

Liknande presentationer


Google-annonser