2

この問題では、a を読み、単語が何であるかを区別する必要があります。単語は意味のあるものである必要はありません。単語には、asdas、sdgsgd、dog、sweet などがあります。アクセスするには、マッピング ファイルを使用する必要があります。

File *map, *dictfile, *datafile;
char *dictname, *dataname;
map = fopen(argv[1],"r");
while (fgets(buffer,sizeof(buffer),map) != NULL)
{
dictname = strtok(buffer," ");
dataname = strtok(NULL, " ");
strtok(dictname,"\n");
strtok(dataname,"\n");

そのコードはマッピング ファイルに入り、 と ファイル名が何であるかを区別します。彼らから私はファイルを開きます

if((datafile = fopen(dictname,"r")) == NULL) //error checking
{
  in here I have to call a readDict(dictfile)
}

私の問題はreadDictにあります。実際に単語とそうでないものを区別するには、このdictファイルで文字ごとに移動する必要があります。単語は、任意のアルファベット文字で構成できます。含まれているとしましょう: dictionary$@#$LoL!@#FFDAfg(()) これに含まれる単語は、dictionary、LoL、FFDAfg です。私はこれらの文字を読む必要があり、それが文字である場合は、これをトライに直接追加する必要があります(一度に文字を追加するだけでトライを管理する方法を理解していません)か、追跡する必要があります各文字を文字列に入れ、アルファベット以外の文字に到達したら、その「単語」をトライに追加する必要があります。

私のトライ構造は次のとおりです。

struct trieNode
{
bool isWord;
struct trieNode *children[26]; //26 given there are 26 letters in the alphabet
};

私は方法を持っています

struct trieNode *createNode()
{
int i;
struct trieNode *tmp = (struct trieNode*)malloc(sizeof(struct trieNode));
for (i = 0; i<26;i++)
tmp -> children[i] = NULL;

tmp -> isWord = false;
return tmp;

私の現在の挿入方法は次のとおりです。

void insert(char *key)
{
int level = 0;
int index = getIndex(key[level]); //previously defined just gets the index of where the key should go
int len = strlen(key);

if(root == NULL)
root = createNode(); //root is defined under my struct def as: struct trieNode *root = NULL;
struct trieNode *tmp = root;
for (level = 0; level < len; level++)
{
if (tmp -> children [index] == NULL)
tmp ->children[index] = createNode();

tmp = tmp->children[index];
}
}

文字列をトライに挿入することになった場合、この方法はうまくいくと思いますが、私の問題は、以前の readDict ファイルから文字列を取得する方法がわからないことです。また、これを(可能であれば)一度に文字を挿入するように変更する方法がわからないので、文字を文字ごとに読み込んで、それが文字であるかどうかを確認し、小文字に変換した後、そうでない場合はトライに追加しますそこの。

4

1 に答える 1

1

そのため、大まかな方法​​の 1 つとして、次のようなものがあります。いくつかのエッジケースを処理するには、おそらくさらにいくつかの条件を追加する必要があります。

void *readDict(char *fileName)
{
    FILE *file = fopen(fileName, "r");
    char *word = malloc(100);
    int index = 0;
    int c;
    while ((c = fgetc(file)) != EOF)
    {
       char ch = (char)c;
       if (isalpha(ch)) // check if ch is a letter
          word[index++] = ch;
       else
       {
          word[index] = '\0';
          index = 0;
          insert(word);
       }
    }
    fclose(file);
}
于 2015-10-21T06:48:08.393 に答える