Datei einlesen und danach Daten in einen Binärbaum einbringen
-
Ich hab noch eine Suchfunktion eingebaut, mit der ich bestimmte Knoten suchen kann.
int such_node(char *s) { node *knoten, *current, *last; int vergleich = 1, i = 0; char *suchwort; if (anfang == NULL) { anfang = knoten; } else { printf("Bitte geben sie ein Suchwort ein, um ein Wort aus der Datei zu suchen !\n"); scanf("%s", s); current = anfang; while (current != s) { if (vergleich == 0) { printf("Dieses Wort ist in der Datei enthalten\n"); getch(); exit(1); } last = current; vergleich = strcmp(knoten->name, s); if (vergleich < 0) { i++; current = current->left; if (current->left->name != NULL) { vergleich = strcmp(current->right->name, s); printf("%s%d%s", "Dieses Wort wurde im", i, ".Durchlauf nicht gefunden.\n"); } } else if (vergleich > 0) { i++; current = current->right; if (current->right->name != NULL) { vergleich = strcmp(current->left->name, s); printf("%s%d%s", "Dieses Wort wurde im ", i, ". Durchlauf nicht gefunden.\n"); } } else { exit(1); } } printf("Dieses Wort existiert einfach nicht in dieser Datei !\n"); } return 0; }
Kann man daran noch was verändern nach eurer Ansicht ?
-
Zwei Fehler hab ich ausgemerzt.... nämlich vorher konnte man nicht alle Wörter finden, die in dem Baum waren und nun klappt das auch ganz gut. Es gibt jetzt nur noch einen Fehler, wenn ich ein Suchwort habe, was nicht in der Datei vorkommt:
int such_node(char *s) { node *knoten, *current, *last; int vergleich = 1, i = 0; if (anfang == NULL) { anfang = knoten; } else { printf("Bitte geben sie ein Suchwort ein, um ein Wort aus der Datei zu suchen !\n"); scanf("%s", s); current = anfang; while (current != s) { if (vergleich == 0) { printf("Dieses Wort ist in der Datei enthalten\n"); getch(); exit(1); } last = current; vergleich = strcmp(s,current->name); if (vergleich < 0) { i++; current = current->left; if (current->name != NULL) { vergleich = strcmp(current->right->name, s); printf("%s%d%s", "Dieses Wort wurde im", i, ".Durchlauf nicht gefunden.\n"); } } else if (vergleich > 0) { i++; current = current->right; if (current->name != NULL) { vergleich = strcmp(current->left->name, s); printf("%s%d%s", "Dieses Wort wurde im ", i, ". Durchlauf nicht gefunden.\n"); } } else { printf("Dieses Wort ist in der Datei enthalten !\n"); getch(); exit(1); } } printf("Dieses Wort existiert einfach nicht in dieser Datei !\n"); } return 0; }
-
So ich bin mit dem neuen Wissen nochmal neu dran gegangen und hab mir nochmal den ganzen Kram angeschaut:
#include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <conio.h> struct tnode { char *word; /* Baumknoten */ int match; /* zeigt auf Text */ struct tnode *left; /* linker Unterbaum */ struct tnode *right; /* rechter Unterbaum */ }; struct tnode *talloc(void); #define MAXWORD 100 #define YES 1 #define NO 0 struct tnode *addtreex(struct tnode *, char *, int, int *); void treexprint(struct tnode *); int compare(char *, struct tnode *, int, int *); /* in alphabetischer Reihenfolge alle Gruppen von Variablennamen ausgeben, die in den ersten num(6) Zeichen gleich sind */ int main(int argc, char *argv[]) { struct tnode *root; char word[MAXWORD]; int found = NO; /* YES wenn gefunden */ int num; /* Anzahl unterschiedlicher Zeichen */ FILE* fp; num = (--argc && (*++argv)[0] == '-') ? atoi(argv[0]+1) : 6; root = NULL; fp = fopen("gedicht.txt", "r"); // nur reading und keine andere Option while(!feof(fp)) { fscanf(fp, "%s", word); root = addtreex(root, word, num, &found); found = NO; } treexprint(root); getch(); return 0; } /* addtreex: w bei oder unterhalb p einfügen */ struct tnode *addtreex(struct tnode *p, char *w, int num, int *found) { int cond; if (p == NULL) { p = talloc(); p->word = strdup(w); p->match = *found; p->left = p->right = NULL; } else if ((cond = compare(w, p, num, found)) < 0) p->left = addtreex(p->left, w, num, found); else if (cond > 0) p->right = addtreex(p->right, w, num, found); return p; } /* compare: Wörter vergleichen, p-> match ändern */ int compare(char *s, struct tnode *p, int num, int *found) { int i; char *t = p->word; for (i = 0; *s == *t; i++, s++, t++) { if (*s == '\0') { return 0; } } if (i >= num) { *found = YES; p->match = YES; } return *s - *t; } /* treexprint: Baum-Elemente mit p->match == YES ausgeben */ void treexprint(struct tnode *p) { if (p != NULL) { treexprint(p->left); if (p->match) { printf("%s\n", p->word); } treexprint(p->right); } } /* comment: Kommentar übergehen und / oder EOF liefern int comment(void) { int c; while ((c = getch()) != EOF) { if (c == '*') { if ((c =getch()) == '/') { break; } else { ungetch(c); } } } return c; } */ /* talloc: tnode erzeugen */ struct tnode *talloc(void) { return(struct tnode *)malloc(sizeof(struct tnode)); }
Damit gehts schon mal
-
Wie könnte ich diese Zeilen am besten erklären ?:
if (i >= num) { *found = YES; p->match = YES; }