C programmering id120v
This presentation is the property of its rightful owner.
Sponsored Links
1 / 30

C-programmering ID120V PowerPoint PPT Presentation


  • 82 Views
  • Uploaded on
  • Presentation posted in: General

C-programmering ID120V. Stack och Kö. [email protected] William Sandqvist [email protected] 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 [email protected]

Download Presentation

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


C programmering id120v

C-programmering ID120V

Stack och Kö

[email protected]

William Sandqvist [email protected]


Data i l nkad lista

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

William Sandqvist [email protected]


Tv s tt att hantera data

Två sätt att hantera data

Stack och Kö

sist in

Stack

LIFO

först ut

William Sandqvist [email protected]


Tv s tt att hantera data1

Två sätt att hantera data

Stack och Kö

först in

först ut

FIFO

William Sandqvist [email protected]


Likna stacken med en stege

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 [email protected]


Stack exempel

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 [email protected]


Datatyper och funktionsprototyp

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 {

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[] );

Nyttolast!

William Sandqvist [email protected]


Datatyper och funktionsprototyp1

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 {

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[] );

StackElementTyp

NULL

Push()

William Sandqvist [email protected]


Datatyper och funktionsprototyp2

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 {

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[] );

StackElementTyp

NULL

BottenPekarTyp

William Sandqvist [email protected]


Datatyper och funktionsprototyp3

NULL

Datatyper och funktionsprototyp

#include <stdio.h>

#include <stdlib.h>

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

BottenPekarTyp

William Sandqvist [email protected]


Bokst ver i omv nd ordning

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 [email protected]


Baklanges

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 [email protected]

bottenPek


C programmering id120v

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 [email protected]

bottenPek


Baklanges pop

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 [email protected]

bottenPek


C programmering id120v

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 [email protected]

bottenPek


Baklanges1

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 [email protected]


K r main

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 [email protected]


Implementera en k

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 [email protected]


K funktionsprototyper

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 [email protected]


K programexempel

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 [email protected]


Hur det fungerar

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 {

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.

William Sandqvist [email protected]


Hur det fungerar1

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 ;

typedefstruct KoTyp

{

KoElementPekarTyp koBorjanPek, koSlutPek ;

} KoTyp ; StackElementTyp *BottenPekarTyp ;

William Sandqvist [email protected]


St ll dig i k n

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 [email protected]


Stalldigikon

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 [email protected]


N sta

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 [email protected]


Nasta

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 [email protected]


C programmering id120v

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 [email protected]


Artom

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 [email protected]


  • Login