------------------------------------------HEADER PIERWSZY #pragma once struct MY_STOS { void *wsk_data; //wskaznik do danych typu void * MY_STOS *wsk_prev; // kolejny elem }; typedef void(*FreeData)(void *wsk_dat); //Definicja typu: wskaznik do funkcji z prototypem void NazwaFunkcji(void *); typedef int (CompData)(void * wsk_curData, void * wsk_SearchData); void stack_int(FreeData wsk_fun_free); void stack_free(); MY_STOS* stack_push(void* wsk_dat); MY_STOS stack_pop(); ----------------------------------------------KONIEC HEADERA PIERWSZEGO, POCZATEK DRUGIEGO #pragma once enum MY_MESSAGES { MY_MESS_ALLOC_ERROR_STOS, MY_MESS_BAD_NUMBER, MY_MESS_TOTAL }; void my_mess_fun(enum MY_MESSAGES mess); ------------------------------------------------------POCZATEK KODU #include "my_stos.h" #include "my_msg.h" #include "stdafx.h" int last_elem = 0; static MY_STOS *top = NULL; FreeData wsk_freedata; void stack_int(FreeData wsk_fun_free) { top = NULL; wsk_freedata = wsk_fun_free; } void stack_free() { MY_STOS *p = top, *ptmp = NULL; while (p) { (*wsk_freedata)(p->wsk_data); // zwolnienie danych z biezacego elemntu ptmp = p; //pomocnicza p = p->wsk_prev; // przestawienie wskaznika free(ptmp); // zwolnienie biezacego elementu } top = NULL; } MY_STOS *stack_push(void *wsk_dat) { //alokujemy pamiec dla nowego elementu kolejki MY_STOS* current = (MY_STOS*)malloc(sizeof(MY_STOS)); if (!current) { my_mess_fun(MY_MESS_ALLOC_ERROR_STOS); return NULL; } current->wsk_prev = top; // nowy element wskazuje na gorny top = current; // potem zostanie gornym return current; } MY_STOS stack_pop() { MY_STOS temp; MY_STOS *next; if (!top) { temp.wsk_data = NULL; temp.wsk_prev = NULL; } else { next = top->wsk_prev; temp.wsk_data = top->wsk_data; // pobieramy wartosc free(top); } }