Witam.
Napisałem program który wczytuje z pliku tekstowego treść , wpisuje wyrazy do drzewa oraz ilość ich wystąpień(sortuje alfabetycznie) , następnie wrzuca w drugie drzewo gdzie sortuje względem wystąpień.
Na koncu program wypisuje wyraz oraz ilość wystąpień. Niestety podczas testowania zauważyłem że 2 rzeczy są nie wporządku, a z 2 muszę was prosić o pomoc.
1.program jakimś cudem wczytuje nieznany mi znak i wrzuca go w drzewo jako wyraz (prawdopodobne związane z EOF ale nie wiem jak to naprawić)
2.program wypisuje jeden z wyrazów kompletnie błędnie (traktując go jako cyfrę). Błąd znajduje się po mojej analizie gdzieś w korzeniu (tak uważam ponieważ tym wyrazem jest pierwszy który jest wczytywany zatem jest to korzeń)
3.Chcę aby program wyrzucał na ekran wyrazy ktore powtarzają się najwięcej razy , ale chcę żeby wyświetlił tylko określoną ilość (tj jeżeli np program wczyta 1000 różnych wyrazów o różnych ilościach wystąpień , to ja chcę żeby on tylko wyświetlił 100 najszęstszych). Próbowałem to zrobić tak że przechodzi przez tablicę to zwiększa zmienną o 1 za każdym razem gdy idzie do kolejnego węzła, niestety opornie to wyszło :P.
4.NIe bardzo wiem w którym momencie i w jaki sposób zwolnić tablice w takim drzewie (jakby ktoś wytłumaczył to byłbym wdzięczny :) )
Oto kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int count;
char value[50];
struct node *left;
struct node *right;
};
struct node_v2
{
int count_v2;
char value_v2[50];
struct node_v2 *left_v2;
struct node_v2 *right_v2;
int poss;
};
void addnode(char word[],struct node *start);
void checktree(struct node *start);
void addnode_tree2(char word[],int i,struct node_v2 *start_v2);
void print_tree21(struct node_v2 *start_v2,int i);
void print_tree22(struct node_v2 *start_v2);
struct node *root;
struct node *start;
struct node_v2 *root2;
struct node_v2 *start_v2;
int main ()
{
char word[50];
int c;
root=root2=NULL;
FILE *fr;
if((fr=freopen("tekst.txt","r",stdin))==NULL)
{
printf("error\n");
exit(1);
}
while(feof(fr)==0)
{
if((c=getchar())!=EOF && !((c>='a' && c<='z') || (c>='A' && c<='Z')))
continue;
int i=0;
if (c>='a' && c<= 'z')
c -= 'a'-'A';
word[i]=c;
i++;
while((c=getchar())!=EOF && ((c>='a' && c<='z') || (c>='A' && c<='Z')))
{
if (c>='a' && c<= 'z')
c -= 'a'-'A';
word[i]=c;
i++;
}
word[i]='\0';
addnode(word,&root);
}
checktree(&root);
print_tree21(&root2,1);
print_tree22(&root2);
fclose(fr);
return 0;
}
void addnode(char word[],struct node *start)
{
if (root == NULL)
{
root=(struct node *)malloc(sizeof(root));
strcpy(root->value,word);
(root->count)=1;
root->left = NULL;
root->right = NULL;
}
else if(strcmp((start->value),word)<0)
{
if(start->right != NULL)
{
addnode(word,start->right);
}
else
{
struct node *new = (struct node*)malloc(sizeof *root);
strcpy(new->value,word);
(new->count)=1;
new->left = NULL;
new->right = NULL;
start->right=new;
}
}
else if(strcmp((start->value),word)>0)
{
if(start->left != NULL)
{
addnode(word,start->left);
}
else
{
struct node *new = (struct node*)malloc(sizeof *root);
strcpy(new->value,word);
(new->count)=1;
new->left = NULL;
new->right = NULL;
start->left=new;
}
}
else if(strcmp((start->value),word)==0)
{
(start->count)+=1;
}
}
void checktree(struct node *start)
{
if((start->left) != NULL)
checktree(start->left);
addnode_tree2(start->value,start->count,&root2);
if((start->right) != NULL)
checktree(start->right);
}
void addnode_tree2(char word[],int i,struct node_v2 *start_v2)
{
if (root2 == NULL)
{
root2=(struct node_v2*)malloc(sizeof(root2));
strcpy(root2->value_v2,word);
(root2->count_v2)=i;
root2->left_v2 = NULL;
root2->right_v2 = NULL;
root2->poss=0;
}
else if((start_v2->count_v2)>=i)
{
if((start_v2->right_v2) != NULL)
{
addnode_tree2(word,i,start_v2->right_v2);
}
else
{
struct node_v2 *new_v2 = (struct node_v2*)malloc(sizeof *root2);
strcpy((new_v2->value_v2),word);
(new_v2->count_v2)=i;
(new_v2->left_v2) = NULL;
(new_v2->right_v2) = NULL;
start_v2->poss=0;
(start_v2->right_v2)=new_v2;
}
}
else if((start_v2->count_v2)<i)
{
if(start_v2->left_v2 != NULL)
{
addnode_tree2(word,i,(start_v2->left_v2));
}
else
{
struct node_v2 *new_v2 = (struct node_v2*)malloc(sizeof *root2);
strcpy((new_v2->value_v2),word);
(new_v2->count_v2)=i;
(new_v2->left_v2) = NULL;
(new_v2->right_v2) = NULL;
start_v2->poss=0;
(start_v2->left_v2)=new_v2;
}
}
}
void print_tree21(struct node_v2 *start_v2,int i)
{
if(start_v2->right_v2 != NULL)
{
print_tree21(start_v2->right_v2,i);
start_v2->poss=i;
i++;
}
if(start_v2->left_v2 != NULL)
{
print_tree21(start_v2->left_v2,i);
start_v2->poss=i;
i++;
}
}
void print_tree22(struct node_v2 *start_v2)
{
if(start_v2->right_v2 != NULL)
print_tree22(start_v2->right_v2);
if((start_v2->poss)<=100)
printf("%s %d %d\n",start_v2->value_v2,start_v2->count_v2,start_v2->poss);
if(start_v2->left_v2 != NULL)
print_tree22(start_v2->left_v2);
}
Ps.Program bedzie wczytywał pliki z pliku tekst.txt który musi znajdowac sie w tym samym folderze co program
Z góry dziękuję za pomoc :)
Przemo