From 204f2a25267c95017e29fbfa608e945172970203 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 4 Dec 2025 18:56:18 +0100 Subject: [PATCH 1/2] Added complete stack functionality --- .vscode/settings.json | 6 ++++ makefile | 2 ++ stack.c | 37 +++++++++++++++++--- stack.h | 11 +++--- stackTests | Bin 0 -> 32600 bytes test_stack.c | 77 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 stackTests create mode 100644 test_stack.c diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f36e144 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "stdio.h": "c", + "stdlib.h": "c" + } +} \ No newline at end of file diff --git a/makefile b/makefile index 5b2e04b..49f367b 100644 --- a/makefile +++ b/makefile @@ -37,6 +37,8 @@ doble_initial: # -------------------------- # Unit Tests # -------------------------- +stackTests: stack.o test_stack.c $(unityfolder)/unity.c + $(CC) $(CFLAGS) -I$(unityfolder) -o stackTests test_stack.c stack.o $(unityfolder)/unity.c ${LDFLAGS} unitTests: echo "needs to be implemented" diff --git a/stack.c b/stack.c index e3a90d4..1814599 100644 --- a/stack.c +++ b/stack.c @@ -8,26 +8,53 @@ * `clearStack`: gibt den gesamten Speicher frei. */ // Pushes data as pointer onto the stack. -StackNode *push(StackNode *stack, void *data) +StackNode* push(StackNode* stack, void* data) { - + //pointer onto new struct + StackNode* newNode = malloc(sizeof(StackNode)); + newNode->data = data; + //*stack := first node of the stack; is now the second to first node + newNode->nextNode = stack; + return newNode; } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) -StackNode *pop(StackNode *stack) +StackNode* pop(StackNode* stack) { + //getting the second to first node + StackNode* tmp = stack->nextNode; + // data should be freed by the caller + // free(stack->data); + // stack->data = NULL; + free(stack); + stack = NULL; + + return tmp; } // Returns the data of the top element. -void *top(StackNode *stack) +void* top(StackNode* stack) { + //No stack --> No data-pointer + if (stack == NULL) return NULL; + return stack->data; } // Clears stack and releases all memory. -void clearStack(StackNode *stack) +void clearStack(StackNode* stack) { + if (stack == NULL) return; + if (stack->nextNode != NULL) clearStack(stack->nextNode); + + // date should be freed by the caller. + // free(stack->data); + // stack->data = NULL; + + free(stack); + // technically not needed (dangling pointer) + stack = NULL; } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..4c3a3a7 100644 --- a/stack.h +++ b/stack.h @@ -7,17 +7,20 @@ The latest element is taken from the stack. */ #include -//TODO: passenden Datentyp als struct anlegen +typedef struct StackNode { + void* data; + struct StackNode* nextNode; +} StackNode; // Pushes data as pointer onto the stack. -StackNode *push(StackNode *stack, void *data); +StackNode* push(StackNode *stack, void *data); // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) -StackNode *pop(StackNode *stack); +StackNode* pop(StackNode *stack); // Returns the data of the top element. -void *top(StackNode *stack); +void* top(StackNode *stack); // Clears stack and releases all memory. void clearStack(StackNode *stack); diff --git a/stackTests b/stackTests new file mode 100644 index 0000000000000000000000000000000000000000..be175e300bf66b704f798afa774ef4ac8de0611b GIT binary patch literal 32600 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 S-xZGFiY2mkp-aG3)&4IMn&->_ literal 0 HcmV?d00001 diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..9b77f35 --- /dev/null +++ b/test_stack.c @@ -0,0 +1,77 @@ +#include +#include +#include "unity.h" +#include "stack.h" + + +void test_topReturnsCorrectValue(void) { + // 1. Arrange + int* value1; + int* value2; + int* outVal1; + int* outVal2; + value1 = malloc(sizeof(int)); + value2 = malloc(sizeof(int)); + StackNode* startNode = NULL; + + // 2. Act + *value1 = 1234; + *value2 = 5678; + startNode = push(startNode, value1); + // new top node is node 2 + startNode = push(startNode, value2); + outVal2 = top(startNode); + // node 1 should now be the top node + startNode = pop(startNode); + outVal1 = top(startNode); + + // 3. Assert + //Also tests for the functionality of 'push' + TEST_ASSERT_EQUAL_INT32(*value1, *outVal1); + TEST_ASSERT_EQUAL_INT32(*value2, *outVal2); + + free(value1); + value1 = NULL; + free(value2); + value2 = NULL; + clearStack(startNode); +} + +void test_popRemovesElements(void) { + // 1. Arrange + StackNode* startNode = NULL; + + // 2. Act + // Entering some Elements into Stack (could be added manually for testing) + startNode = push(startNode, NULL); + startNode = push(startNode, NULL); + startNode = push(startNode, NULL); + startNode = push(startNode, NULL); + // Now removing created Elements + startNode = pop(startNode); + startNode = pop(startNode); + startNode = pop(startNode); + startNode = pop(startNode); + + // 3. Assert + TEST_ASSERT_NULL(startNode); +} + +void setUp(void){ + +} + +void tearDown(void){ + +} + +int main(void) { + UNITY_BEGIN(); + + printf("\n============================\nStack tests\n============================\n"); + + RUN_TEST(test_topReturnsCorrectValue); + RUN_TEST(test_popRemovesElements); + + return UNITY_END(); +} \ No newline at end of file From 64a16f06d7a677decc561f723c072e50287b0d81 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 4 Dec 2025 19:30:33 +0100 Subject: [PATCH 2/2] added more unit tests for test_stack.c --- numbers.c | 2 +- stackTests | Bin 32600 -> 36760 bytes test_stack.c | 13 +++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/numbers.c b/numbers.c index f59d9a2..61fa7cc 100644 --- a/numbers.c +++ b/numbers.c @@ -14,7 +14,7 @@ // Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while // creating random numbers. -unsigned int *createNumbers(unsigned int len) +unsigned int* createNumbers(unsigned int len) { } diff --git a/stackTests b/stackTests index be175e300bf66b704f798afa774ef4ac8de0611b..b79915217077cf184d78befb711f6a45b40d3b7d 100644 GIT binary patch delta 9477 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 delta 9418 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