82 lines
2.3 KiB
C
82 lines
2.3 KiB
C
|
|
#ifndef BINTREE_H
|
|
#define BINTREE_H
|
|
|
|
#include <stdlib.h>
|
|
|
|
/*
|
|
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
|