172 lines
2.3 KiB
C
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
|