0
私は、テキストファイルから読み込んで単語ごとに文字列を抽出し、バイナリ検索ツリーに格納する関数を書いています。この関数はすべての句読点を無視し、重複する単語を破棄しなければなりません(単語の頻度にのみ追加されます)。fscanf()私のADTノードを置き換えますか?
私の問題は、「while(fscanf(fp、 "%s"、line)!= EOF)」が実行されるたびに、私のrootWordが新しく読み込まれた単語に置き換えられます。私はfscanfがこれをどうすることが可能であるかを理解できません。
typedef struct word * wordPtr;
typedef struct position * positionPtr;
typedef struct position
{
int position;
positionPtr nextPosition;
} Position;
typedef struct word
{
char * word;
unsigned freq;
positionPtr firstPosition;
wordPtr leftWord;
wordPtr rightWord;
} Word;
typedef struct bstWord
{
wordPtr rootWord;
unsigned wordCount;
} BSTWord;
int BSTCreate(BSTWord* bst, char* fileName)
{
FILE * fp = fopen(fileName,"r");
char line[MAX_WORD_LEN + 1];
int charCount = 0;
char * token;
char delimit[] = "\t\r\n\v\f,.-;:\"\' ";
while (fscanf(fp, "%s", line)!=EOF)
{
wordPtr prev = NULL, curr = bst->rootWord;
wordPtr newWord;
positionPtr newPosition;
int lessThen;
int status = 1;
token = strtok(line, delimit);
charCount = charCount + 1;
while(curr!=NULL)
{
prev = curr;
if(strcmp(token, curr->word)<0)
{
printf("\nless");
lessThen = 1;
curr = curr->leftWord;
status = 1;
}
else if(strcmp(token, curr->word)>0)
{
printf("\nmore");
lessThen = 0;
curr = curr->rightWord;
status = 1;
}
else if(strcmp(token, curr->word)==0) //If word is already in tree, add freq + update position
{
if ((newPosition = malloc(sizeof(Position))) == NULL)
return FAILURE;
newPosition->position = charCount;
newPosition->nextPosition = NULL;
positionPtr prevPosition = NULL, currPosition = curr->firstPosition;
while(currPosition!=NULL)
{
prevPosition = currPosition;
currPosition = currPosition->nextPosition;
}
prevPosition->nextPosition = newPosition;
status = 0;
curr = NULL;
break;
}
}
if(status == 1)
{
if ((newWord = malloc(sizeof(Word))) == NULL)
return FAILURE;
if ((newPosition = malloc(sizeof(Position))) == NULL)
return FAILURE;
newPosition->position = charCount;
newWord->word = token;
newWord->freq = 1;
newWord->firstPosition = newPosition;
newWord->leftWord = NULL;
newWord->rightWord = NULL;
if(bst->rootWord == NULL)
bst->rootWord = newWord;
else
{
if(lessThen)
{
prev->leftWord = newWord;
}
else
{
prev->rightWord = newWord;
}
}
}
bst->wordCount++;
}
fclose(fp);
free(fp);
return SUCCESS;
}
:あなたは追加のメモリを割り当て、そこに文字列をコピーする必要が
'strtok()'は新しいバッファを割り当てませんが、渡されたバッファにポインタを返します。 – EOF
私はそれを知らない、私はそれを見て、ありがとう。 –