jazykc  2013.3
upoljazykc
 All Classes Files Functions Variables Typedefs Macros Pages
dynamicky-zasobnik.c
Go to the documentation of this file.
1 
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <assert.h>
45 
46 struct prvek {
47  int data;
48  struct prvek *next;
49 };
50 typedef struct prvek prvek;
51 
56 prvek *pridej (prvek *zasobnik, int data) {
57  prvek *novy = malloc(sizeof *novy);//netreba typecast, void* v Cecku je OK!!!
58  novy->data = data;
59  novy->next = zasobnik;
60  return novy;
61 }
62 
63 int vrchol (prvek *zasobnik) {
64  assert(zasobnik);//zasobnik nesmi byt prazdny
65  return zasobnik->data; //na toto by stacilo i makro?
66 };
67 
68 prvek * odeber (prvek *zasobnik) {
69  prvek *next;
70  if (!zasobnik) return NULL; //prazdny zasobnik
71  next = zasobnik->next;
72  free(zasobnik);
73  return next;//novy vrsek zasobniku
74 }
75 
76 #define is_empty(z) (!(z))
77 
78 //todo: cbk by mel mit nejaky ctx/userdata pointer
79 int for_each(prvek *zasobnik, int (*cbk)(int i, int data)) {
80  prvek *next = zasobnik;
81  int i = 0;
82  int data;
83  for (i=0; next; next=next->next, i++) {
84  if (cbk(i, next->data)) break;
85  }
86  return i;
87 }
88 
89 static int cbk_vypis (int i, int data) {
90  printf("%d.ty prvek .data=%d\n",i,data);
91  return 0;
92 }
93 
94 #define dup(z) (z)=pridej((z),vrchol((z)))
95 
96 
97 int main(void) {
98  prvek* z=NULL;//prazdny zasobnik
99  int i;
100 
101  for (i=1; i<=10; i++)
102  z = pridej(z, i);
103  for_each(z, cbk_vypis);//nic, prazdny
104 
105  while (z!=NULL){
106  printf("%i\n", vrchol(z));
107  z=odeber(z);
108  }
109  for_each(z, cbk_vypis);//nic, prazdny
110  z = pridej(z, 11);
111  z = pridej(z, 12);
112  z = pridej(z, 13);
113  dup(z);
114  for_each(z, cbk_vypis);
115 
116  return EXIT_SUCCESS;
117 }
prvek * pridej(prvek *zasobnik, int data)