Commit 7c4da6d
Changed files (3)
src
02
src/02/05/stack.c
@@ -1,7 +1,7 @@
#include "stack.h"
#include <stdlib.h>
-Node *node_init(int data) {
+Node *node_init(void *data) {
Node *node = malloc(sizeof(Node));
node->next = NULL;
node->data = data;
@@ -18,7 +18,7 @@ int stack_size(Stack *self) {
if (!self || !self->head)
return 0;
- int count;
+ int count = 0;
Node *current = self->head;
while (current) {
++count;
@@ -28,25 +28,25 @@ int stack_size(Stack *self) {
return count;
}
-int stack_peek(Stack *self) {
+void *stack_peek(Stack *self) {
if (self->head)
return self->head->data;
- return -1;
+ return NULL;
}
-void stack_push(Stack *stack, int data) {
+void stack_push(Stack *stack, void *data) {
Node *node = node_init(data);
node->next = stack->head;
stack->head = node;
}
-int stack_pop(Stack *self) {
+void *stack_pop(Stack *self) {
if (self->head) {
Node *tmp = self->head;
- int data = tmp->data;
+ void *data = tmp->data;
self->head = self->head->next;
free(tmp);
return data;
}
- return -1;
+ return NULL;
}
src/02/05/stack.h
@@ -1,6 +1,6 @@
typedef struct node {
struct node *next;
- int data;
+ void *data;
} Node;
typedef struct {
@@ -8,7 +8,7 @@ typedef struct {
} Stack;
Stack *stack_init();
-int stack_peek(Stack *self);
+void *stack_peek(Stack *self);
int stack_size(Stack *self);
-void stack_push(Stack *self, int data);
-int stack_pop(Stack *self);
+void stack_push(Stack *self, void *data);
+void *stack_pop(Stack *self);
src/02/05/stack_test.c
@@ -9,7 +9,7 @@ AfterEach(Stack) {}
Ensure(Stack, when_pushing_an_item_on_to_a_stack) {
Stack *stack = stack_init();
- stack_push(stack, 10);
+ stack_push(stack, (void *)10);
assert_that(stack_size(stack), is_equal_to(1));
assert_that(stack_peek(stack), is_equal_to(10));
@@ -18,22 +18,36 @@ Ensure(Stack, when_pushing_an_item_on_to_a_stack) {
Ensure(Stack, when_pushing_multiple_items_on_to_a_stack) {
Stack *stack = stack_init();
- stack_push(stack, 20);
- stack_push(stack, 10);
- stack_push(stack, 50);
+ stack_push(stack, (void *)20);
+ stack_push(stack, (void *)10);
+ stack_push(stack, (void *)50);
assert_that(stack_size(stack), is_equal_to(3));
assert_that(stack_peek(stack), is_equal_to(50));
}
+Ensure(Stack, when_pushing_a_custom_type_on_to_a_stack) {
+ typedef struct {
+ } Item;
+
+ Stack *stack = stack_init();
+ Item *item = malloc(sizeof(Item));
+
+ stack_push(stack, item);
+
+ assert_that(stack_size(stack), is_equal_to(1));
+ assert_that(stack_peek(stack), is_equal_to(item));
+ assert_that(stack_pop(stack), is_equal_to(item));
+}
+
Ensure(Stack, when_popping_an_item_off_of_a_stack) {
Stack *stack = stack_init();
- stack_push(stack, 20);
- stack_push(stack, 10);
- stack_push(stack, 50);
+ stack_push(stack, (void *)20);
+ stack_push(stack, (void *)10);
+ stack_push(stack, (void *)50);
- int result = stack_pop(stack);
+ void *result = stack_pop(stack);
assert_that(stack_size(stack), is_equal_to(2));
assert_that(stack_peek(stack), is_equal_to(10));