Jazyk C 2013 – 12. cvičenie [Knižnica pre zásobník II.]

Knižnica pre zásobník

Dopracujte do knižnice pre zásobník operácie pre push a pop

Upratovanie v projekte

  • Odsuňme všetky projektové súbory do separátneho adresára (zasobnik_projekt)
    • hlavičkový súbor zasobnik.h
    • knižnica zasobnik.c
    • demo zasobnik_demo.c

Je to kvôli separátnemu makefile.

Separátny makefile

Založme si makefile, ktorým budeme kompilovať projekt.

CC=gcc
CFLAGS=-Wall -Wextra -ansi -pedantic -Werror -lm

zasobnik_demo: zasobnik.c
  • Zápis hovorí: cieľ zasobnik_demo potrebuje na svoju realizáciu súbor zasobnik.c.
  • Vďaka implicitným pravidlám nástroja make sa automaticky zistí, že na cieľ zasobnik_demo, ktorý je zároveň názvom výslednej binárky, treba tiež súbor zasobnik_demo.c.
  • Ak zavoláme:

    make
    

    vykoná sa:

    gcc -Wall -Wextra -ansi -pedantic -Werror -lm    zasobnik_demo.c zasobnik.c   -o zasobnik_demo
    

Funkcia pre push

Do hlavičkového súboru dodáme funkciu:

int push(ZASOBNIK * zasobnik, char c);

Implementácia bude:

int push(ZASOBNIK * zasobnik, char c) {
   struct polozka * p = malloc(sizeof(struct polozka ));
   if( p == NULL ) {
        return -1;
   }
   p->znak = c;
   p->dalsi = *zasobnik;

   *zasobnik = p;
   return 0;
}
  • Pozor na fakt, že funkcia mení celý zásobník! (Pridáva na jeho začiatok nové prvky.)
  • Ak funkcia mení svoj parameter a chceme, aby sa zmeny udržali aj po jej ukončení, musíme využiť odovzdávanie odkazom.
  • Parameter zasobnik bude odovzdávaný odkazom cez pointer.
  • V deme potom pristupujeme k funkcii cez zásobník odovzdávaný odkazom. Využijeme operátor referencie, ampersand, ktorý pre danú premennú vráti jej adresu v pamäti. Túto adresu môžeme využiť ako pointer.

    Volanie funkcie bude:

    push(&z, 'A');
    

    Celý kód:

    #include<stdio.h>
    #include"zasobnik.h"
    
    int main() {
            ZASOBNIK z = stack_new();
            push(&z, 'A');
            /* ... */*
    }     
    

Funkcia pre pop

Do hlavičkového súboru dodáme funkciu:

char pop(ZASOBNIK * zasobnik);
  • Opäť vieme, že funkcia mení celý zásobník (odoberá prvok) a preto ho odovzdajme odkazom.

  • Implementácia v súbore zasobnik.c:

    char pop(ZASOBNIK * zasobnik) {
       char c;
       struct polozka * p;
    
       if(stack_empty(*zasobnik)) {
            return '\0';
       }
    
       p = *zasobnik;
       c = (*zasobnik)->znak;
       (*zasobnik) = (*zasobnik)->dalsi;
       free(p);
       p = NULL;
    
       return c;
    }
    

Demo kód bude vyzerať:

#include<stdio.h>
#include"zasobnik.h"

int main() {
        ZASOBNIK z = stack_new();
        push(&z, 'A');
        push(&z, 'H');
        push(&z, 'O');
        push(&z, 'J');

        if(stack_empty(z)) {
                puts("Zasobnik je prazdny");
        } else {
                puts("Zasobnik NIE JE prazdny");
        }

        printf("%c", pop(&z));
        printf("%c", pop(&z));
        printf("%c", pop(&z));
        printf("%c", pop(&z));
        printf("%c", pop(&z));

        return 0;
}

Zdroje

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *