#ifndef BINTREE_H #define BINTREE_H #include /* Typdefinition für die Vergleichsfunktion. Die Funktion muss zwei Datenzeiger vergleichen und zurückgeben: - < 0, wenn arg1 kleiner als arg2 ist - 0, wenn arg1 gleich arg2 ist - > 0, wenn arg1 größer als arg2 ist */ typedef int (*CompareFctType)(const void *arg1, const void *arg2); /* Struktur für einen Binärbaum-Knoten. Enthält: - data: Zeiger auf die gespeicherten Daten (beliebiger Typ, dynamisch allokiert) - left: Zeiger auf linken Teilbaum - right: Zeiger auf rechten Teilbaum */ typedef struct node { void *data; // Zeiger auf die Nutzdaten struct node *left; // Zeiger auf linken Kindknoten struct node *right; // Zeiger auf rechten Kindknoten } TreeNode; /* Fügt eine Kopie der Daten in den Binärbaum ein. Parameter: root : Wurzel des (Teil-)Baums data : Zeiger auf die einzufügenden Daten dataSize : Größe der Daten in Bytes compareFct : Vergleichsfunktion für die Ordnung isDuplicate : Optionaler Zeiger: - Wenn NULL: Duplikate sind erlaubt - Wenn != NULL: Duplikate werden ignoriert und *isDuplicate wird gesetzt: - 0: neuer Eintrag eingefügt - 1: Duplikat erkannt, nicht eingefügt Rückgabe: Zeiger auf die (ggf. neue) Wurzel des Baums oder NULL bei Speicherfehler. */ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate); /* Iteriert über den Baum in Inorder-Reihenfolge. Verhalten: - Erster Aufruf mit root != NULL: Iterator initialisieren - Folgeaufrufe mit root == NULL: nächstes Element zurückgeben Rückgabe: Zeiger auf die Daten des nächsten Knotens oder NULL, wenn Ende erreicht. Hinweis: Intern wird ein Stack verwendet. Nicht threadsicher. */ void *nextTreeData(TreeNode *root); /* Gibt den gesamten Baum frei (inklusive der gespeicherten Daten). Nach dem Aufruf sind alle Zeiger ungültig. */ void clearTree(TreeNode *root); /* Liefert die Anzahl der Knoten im Baum. Rückgabe: Anzahl der Knoten (0 bei leerem Baum). */ unsigned int treeSize(const TreeNode *root); #endif