This commit is contained in:
Thilo 2025-12-16 11:47:40 +01:00
commit 5941913b6c
7 changed files with 13 additions and 41 deletions

View File

@ -1,24 +1,20 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "stack.h" #include "stack.h"
#include "bintree.h" #include "bintree.h"
static StackNode *push_left(TreeNode *node, StackNode *stack); static StackNode *push_left(TreeNode *node, StackNode *stack);
/* Vergleichsfunktion */ int compareFct(const void *a, const void *b)
int compareFct(const void *argument1, const void *argument2)
{ {
int x = *((int *)argument1); int x = *((int *)a);
int y = *((int *)argument2); int y = *((int *)b);
if (x < y) return -1; if (x < y) return -1;
if (x > y) return 1; if (x > y) return 1;
return 0; return 0;
} }
/* Erzeugt einen neuen Baumknoten mit Datenkopie */
static TreeNode *create_node(const void *data, size_t data_size) static TreeNode *create_node(const void *data, size_t data_size)
{ {
TreeNode *node = malloc(sizeof(TreeNode)); TreeNode *node = malloc(sizeof(TreeNode));
@ -27,7 +23,6 @@ static TreeNode *create_node(const void *data, size_t data_size)
perror("Speicher wurde NICHT reserviert!"); perror("Speicher wurde NICHT reserviert!");
return NULL; return NULL;
} }
node->data = malloc(data_size); node->data = malloc(data_size);
if (!node->data) if (!node->data)
{ {
@ -35,67 +30,48 @@ static TreeNode *create_node(const void *data, size_t data_size)
free(node); free(node);
return NULL; return NULL;
} }
memcpy(node->data, data, data_size); memcpy(node->data, data, data_size);
node->left = NULL; node->left = NULL;
node->right = NULL; node->right = NULL;
return node; return node;
} }
/* Fügt Daten in den Binärbaum ein */
TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize,
CompareFctType compareFct, int *isDuplicate) CompareFctType compareFct, int *isDuplicate)
{ {
if (root == NULL) if (root == NULL)
{ {
if (isDuplicate) if (isDuplicate) *isDuplicate = 0;
*isDuplicate = 0;
return create_node(data, dataSize); return create_node(data, dataSize);
} }
int cmp = compareFct(data, root->data); int cmp = compareFct(data, root->data);
if (cmp < 0) if (cmp < 0)
{
root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate);
}
else if (cmp > 0) else if (cmp > 0)
{
root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate);
} else if (isDuplicate)
else *isDuplicate = 1;
{
if (isDuplicate)
*isDuplicate = 1;
}
return root; return root;
} }
/* Inorder-Iterator über den Baum */ // nextTreeData benutzt jetzt einen extern verwalteten Stack
void *nextTreeData(TreeNode *root) void *nextTreeData(TreeNode *root, StackNode **stack)
{ {
static StackNode *stack = NULL;
/* Neuer Start → linken Pfad auf Stack legen */
if (root != NULL) if (root != NULL)
stack = push_left(root, stack); *stack = push_left(root, *stack);
if (stack == NULL) if (*stack == NULL)
return NULL; return NULL;
/* TOP lesen, dann POP */ TreeNode *node = (TreeNode *)top(*stack);
TreeNode *node = (TreeNode *)top(stack); *stack = pop(*stack);
stack = pop(stack);
if (node->right != NULL) if (node->right != NULL)
stack = push_left(node->right, stack); *stack = push_left(node->right, *stack);
return node->data; return node->data;
} }
/* Hilfsfunktion: linken Pfad auf Stack legen */
static StackNode *push_left(TreeNode *node, StackNode *stack) static StackNode *push_left(TreeNode *node, StackNode *stack)
{ {
while (node != NULL) while (node != NULL)
@ -106,23 +82,19 @@ static StackNode *push_left(TreeNode *node, StackNode *stack)
return stack; return stack;
} }
/* Gibt gesamten Baum frei */
void clearTree(TreeNode *root) void clearTree(TreeNode *root)
{ {
if (root == NULL) if (root == NULL)
return; return;
clearTree(root->left); clearTree(root->left);
clearTree(root->right); clearTree(root->right);
free(root->data); free(root->data);
free(root); free(root);
} }
/* Liefert Anzahl der Knoten */
unsigned int treeSize(const TreeNode *root) unsigned int treeSize(const TreeNode *root)
{ {
if (root == NULL) if (root == NULL)
return 0; return 0;
return 1 + treeSize(root->left) + treeSize(root->right); return 1 + treeSize(root->left) + treeSize(root->right);
} }

BIN
bintree.o Normal file

Binary file not shown.

BIN
highscore.o Normal file

Binary file not shown.

BIN
main.o Normal file

Binary file not shown.

BIN
numbers.o Normal file

Binary file not shown.

BIN
stack.o Normal file

Binary file not shown.

BIN
timer.o Normal file

Binary file not shown.