Compare commits

..

No commits in common. "main" and "MM_Branch" have entirely different histories.

2 changed files with 14 additions and 22 deletions

View File

@ -8,8 +8,8 @@ StackNode *push(StackNode *stack, void *data)
if(node == NULL) if(node == NULL)
return stack; // allocation failed -> return unchanged stack return stack; // allocation failed -> return unchanged stack
node->data = data; // Setze Daten node->data = data; // Set the data for the new node
node->next = stack; // Setze nächsten Knoten auf aktuellen Stack node->next = stack; // New node points to the previous top of the stack
return node; return node;
} }
@ -21,7 +21,7 @@ StackNode *pop(StackNode *stack)
return NULL; return NULL;
StackNode *next = stack->next; StackNode *next = stack->next;
// Speicher des aktuellen Knotens freigeben // Do NOT free stack->data here; caller owns the pointed data
free(stack); free(stack);
return next; return next;
} }

View File

@ -8,45 +8,37 @@ int main(void)
StackNode *s = NULL; StackNode *s = NULL;
// push 3 integers // push 3 integers
int *a = malloc(sizeof(int)); int *a = malloc(sizeof(int)); *a = 1; s = push(s, a);
*a = 1; int *b = malloc(sizeof(int)); *b = 2; s = push(s, b);
s = push(s, a); int *c = malloc(sizeof(int)); *c = 3; s = push(s, c);
int *b = malloc(sizeof(int));
*b = 2;
s = push(s, b);
int *c = malloc(sizeof(int));
*c = 3;
s = push(s, c);
// oben liegt c (3) // top should be c (3)
int *topv = (int *)top(s); int *topv = (int *)top(s);
if(topv == NULL || *topv != 3) { fprintf(stderr, "stack top expected 3\n"); return 1; } if(topv == NULL || *topv != 3) { fprintf(stderr, "stack top expected 3\n"); return 1; }
// oben liegt nun 2 // pop -> now top should be 2
s = pop(s); s = pop(s);
topv = (int *)top(s); topv = (int *)top(s);
if(topv == NULL || *topv != 2) { fprintf(stderr, "stack top expected 2 after pop\n"); return 2; } if(topv == NULL || *topv != 2) { fprintf(stderr, "stack top expected 2 after pop\n"); return 2; }
// oben liegt nun 1 // pop -> now top should be 1
s = pop(s); s = pop(s);
topv = (int *)top(s); topv = (int *)top(s);
if(topv == NULL || *topv != 1) { fprintf(stderr, "stack top expected 1 after pop\n"); return 3; } if(topv == NULL || *topv != 1) { fprintf(stderr, "stack top expected 1 after pop\n"); return 3; }
// letzen Stapelinhalt holen // pop last
s = pop(s); s = pop(s);
if(s != NULL) { fprintf(stderr, "stack expected empty after popping all\n"); return 4; } if(s != NULL) { fprintf(stderr, "stack expected empty after popping all\n"); return 4; }
// Eigenen Speicher freigeben // free stored data (stack does not free data)
free(a); free(a); free(b); free(c);
free(b);
free(c);
// test clearStack mit leerem Stack // test clearStack on empty and small stacks
s = push(s, malloc(sizeof(int))); s = push(s, malloc(sizeof(int)));
s = push(s, malloc(sizeof(int))); s = push(s, malloc(sizeof(int)));
clearStack(s); // clearStack must free nodes but not payload; free payloads not necessary because we leaked intentionally for test of API clearStack(s); // clearStack must free nodes but not payload; free payloads not necessary because we leaked intentionally for test of API
// Note: above payloads are not freed (stack API spec); this test ensures clearStack doesn't crash. // Note: above payloads are not freed (stack API spec); this test ensures clearStack doesn't crash.
// Funktioniert alles // Success
printf("test_stack: OK\n"); printf("test_stack: OK\n");
return 0; return 0;
} }