Info2P5/28.6.3_wortstat.c
2025-05-26 13:01:51 +02:00

172 lines
2.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXWORT 100
// Baumstruktur für ein Wort
typedef struct BaumKnoten {
char *wort;
int anzahl;
struct BaumKnoten *links;
struct BaumKnoten *rechts;
} BaumKnoten;
// Neues Wort in den Baum einfügen oder Zähler erhöhen
BaumKnoten* einfuegen(BaumKnoten *wurzel, const char *wort) {
if (wurzel == NULL) {
BaumKnoten *neu = malloc(sizeof(BaumKnoten));
if (!neu) {
perror("Speicherfehler");
exit(EXIT_FAILURE);
}
neu->wort = strdup(wort);
neu->anzahl = 1;
neu->links = neu->rechts = NULL;
return neu;
}
int cmp = strcmp(wort, wurzel->wort);
if (cmp == 0) {
wurzel->anzahl++;
} else if (cmp < 0) {
wurzel->links = einfuegen(wurzel->links, wort);
} else {
wurzel->rechts = einfuegen(wurzel->rechts, wort);
}
return wurzel;
}
// Inorder-Ausgabe des Baumes
void ausgabe(BaumKnoten *wurzel) {
if (wurzel == NULL)
return;
ausgabe(wurzel->links);
printf("%-12s : %d\n", wurzel->wort, wurzel->anzahl);
ausgabe(wurzel->rechts);
}
// Speicher freigeben
void freigeben(BaumKnoten *wurzel) {
if (wurzel == NULL)
return;
freigeben(wurzel->links);
freigeben(wurzel->rechts);
free(wurzel->wort);
free(wurzel);
}
// Nur Buchstaben akzeptieren
int istBuchstabe(char c) {
return isalpha((unsigned char)c);
}
// Einlesen der Wörter aus stdin
void liesTextUndErzeugeStatistik() {
char wort[MAXWORT];
int index = 0;
int c;
BaumKnoten *baum = NULL;
while ((c = getchar()) != EOF) {
if (istBuchstabe(c)) {
if (index < MAXWORT - 1)
wort[index++] = tolower(c);
} else if (index > 0) {
wort[index] = '\0';
baum = einfuegen(baum, wort);
index = 0;
}
}
// letztes Wort, falls am Ende kein Trennzeichen
if (index > 0) {
wort[index] = '\0';
baum = einfuegen(baum, wort);
}
ausgabe(baum);
freigeben(baum);
}
// Hauptfunktion
int main() {
liesTextUndErzeugeStatistik();
return 0;
}
//gcc -o wortstat wortstat.c
//./wortstat < schwafel.txt