From 1d16bb36253d51ea4fcdb753ae14a3da3534ea49 Mon Sep 17 00:00:00 2001 From: Bora Date: Thu, 29 May 2025 09:38:08 +0200 Subject: [PATCH] halo --- 28.6.3_wortstat.c | 94 +++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/28.6.3_wortstat.c b/28.6.3_wortstat.c index c1abf4b..8a82e04 100644 --- a/28.6.3_wortstat.c +++ b/28.6.3_wortstat.c @@ -3,105 +3,105 @@ #include #include -#define MAXWORT 100 // Maximale Wortlänge +#define MAXWORD 100 // Maximale Wortlänge // Definition eines Baumknotens für ein Wort -typedef struct BaumKnoten { - char *wort; // Das gespeicherte Wort - int anzahl; // Wie oft das Wort vorkam - struct BaumKnoten *links; // Linker Teilbaum (Wörter, die alphabetisch davor kommen) - struct BaumKnoten *rechts; // Rechter Teilbaum (Wörter, die alphabetisch danach kommen) -} BaumKnoten_t; +typedef struct TreeNode { + char *word; // Das gespeicherte Wort + int count; // Wie oft das Wort vorkam + struct TreeNode *left; // Linker Teilbaum (Wörter, die alphabetisch davor kommen) + struct TreeNode *right; // Rechter Teilbaum (Wörter, die alphabetisch danach kommen) +} TreeNode_t; // Funktion zum Einfügen eines Wortes in den Baum // Falls das Wort schon existiert, wird der Zähler erhöht -BaumKnoten_t* einfuegen(BaumKnoten_t *wurzel, const char *wort) { - if (wurzel == NULL) { +TreeNode_t* insert(TreeNode_t *root, const char *word) { + if (root == NULL) { // Neuer Knoten, falls das Wort noch nicht im Baum ist - BaumKnoten_t *neu = malloc(sizeof(BaumKnoten_t)); - if (!neu) { + TreeNode_t *newNode = malloc(sizeof(TreeNode_t)); + if (!newNode) { perror("Speicherfehler"); exit(EXIT_FAILURE); } - neu->wort = strdup(wort); // Wort kopieren und speichern - neu->anzahl = 1; // Erstes Vorkommen - neu->links = neu->rechts = NULL; // Noch keine Kinder - return neu; + newNode->word = strdup(word); // Wort kopieren und speichern + newNode->count = 1; // Erstes Vorkommen + newNode->left = newNode->right = NULL; // Noch keine Kinder + return newNode; } - int cmp = strcmp(wort, wurzel->wort); // Alphabetischer Vergleich + int cmp = strcmp(word, root->word); // Alphabetischer Vergleich if (cmp == 0) { // Wort schon vorhanden: Zähler erhöhen - wurzel->anzahl++; + root->count++; } else if (cmp < 0) { // Wort ist alphabetisch VOR dem aktuellen Knoten: links einfügen - wurzel->links = einfuegen(wurzel->links, wort); + root->left = insert(root->left, word); } else { // Wort ist alphabetisch NACH dem aktuellen Knoten: rechts einfügen - wurzel->rechts = einfuegen(wurzel->rechts, wort); + root->right = insert(root->right, word); } - return wurzel; + return root; } // Inorder-Ausgabe: Gibt die Wörter alphabetisch sortiert mit Häufigkeit aus -void ausgabe(BaumKnoten_t *wurzel) { - if (wurzel == NULL) +void printTree(TreeNode_t *root) { + if (root == NULL) return; - ausgabe(wurzel->links); // Erst linker Teilbaum - printf("%-12s : %d\n", wurzel->wort, wurzel->anzahl); // Dann aktueller Knoten - ausgabe(wurzel->rechts); // Dann rechter Teilbaum + printTree(root->left); // Erst linker Teilbaum + printf("%-12s : %d\n", root->word, root->count); // Dann aktueller Knoten + printTree(root->right); // Dann rechter Teilbaum } // Gibt den belegten Speicher des Baumes wieder frei -void freigeben(BaumKnoten_t *wurzel) { - if (wurzel == NULL) +void freeTree(TreeNode_t *root) { + if (root == NULL) return; - freigeben(wurzel->links); // Erst linker Teilbaum - freigeben(wurzel->rechts); // Dann rechter Teilbaum - free(wurzel->wort); // Erst das Wort freigeben - free(wurzel); // Dann den Knoten selbst + freeTree(root->left); // Erst linker Teilbaum + freeTree(root->right); // Dann rechter Teilbaum + free(root->word); // Erst das Wort freigeben + free(root); // Dann den Knoten selbst } // Prüft, ob ein Zeichen ein Buchstabe ist (a-z, A-Z) -int istBuchstabe(char c) { +int isLetter(char c) { return isalpha((unsigned char)c); } // Liest Wörter aus stdin, zählt sie und gibt die Statistik aus -void liesTextUndErzeugeStatistik() { - char wort[MAXWORT]; // Zwischenspeicher für das aktuelle Wort +void readTextAndPrintStats() { + char word[MAXWORD]; // Zwischenspeicher für das aktuelle Wort int index = 0; // Position im Wort int c; // Aktuelles Zeichen - BaumKnoten_t *baum = NULL; // Wurzel des Baumes + TreeNode_t *tree = NULL; // Wurzel des Baumes // Zeichenweise Einlesen bis Dateiende (EOF) while ((c = getchar()) != EOF) { - if (istBuchstabe(c)) { + if (isLetter(c)) { // Nur Buchstaben werden akzeptiert, alles in Kleinbuchstaben - if (index < MAXWORT - 1) - wort[index++] = tolower(c); + if (index < MAXWORD - 1) + word[index++] = tolower(c); } else if (index > 0) { // Wortende erreicht (kein Buchstabe mehr) - wort[index] = '\0'; // String abschließen - baum = einfuegen(baum, wort); // Wort in Baum einfügen + word[index] = '\0'; // String abschließen + tree = insert(tree, word); // Wort in Baum einfügen index = 0; // Für das nächste Wort zurücksetzen } } // Falls am Ende noch ein Wort übrig ist (z.B. Datei endet ohne Leerzeichen) if (index > 0) { - wort[index] = '\0'; - baum = einfuegen(baum, wort); + word[index] = '\0'; + tree = insert(tree, word); } - ausgabe(baum); // Statistik ausgeben (alphabetisch sortiert) - freigeben(baum); // Speicher aufräumen + printTree(tree); // Statistik ausgeben (alphabetisch sortiert) + freeTree(tree); // Speicher aufräumen } // Hauptfunktion: Startet das Programm int main() { - liesTextUndErzeugeStatistik(); + readTextAndPrintStats(); return 0; } -// Kompilieren: gcc -o wortstat wortstat.c -// Ausführen: ./wortstat < schwafel.txt \ No newline at end of file +// Kompilieren: gcc -o wordstat wordstat.c +// Ausführen: ./wordstat < somefile.txt \ No newline at end of file