0

ファイルの単語をアルファベット順に保持し、ファイル内の単語の出現回数をカウントするバイナリ ツリーを構築しようとしています。その後、元のテキスト ファイル内の単語を置換できるようにする必要があります。今のところ、バイナリ ツリーをセットアップして、そこに単語を取得しようとしています。文字列のトークン化が機能し、すべての行に単語と句読点が出力されます。句読点も文字配列に格納し、その出現回数をカウントする必要があります。挿入機能に問題がありますが、何が間違っているのかわかりません。セグメンテーション違反が発生しています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
Name: Marcus Lorenzana
*/

//binary tree struct to hold left and right node
//as well as the word and number of occurrences
typedef struct node
{
    char* word;
    int count;
    struct node *left;
    struct node *right;
}
node;

node *insert(node *item, char *word);
char* readFile(char* filename);

int main()
{
    FILE *fin;
    char *word;
    fin = fopen("data.txt", "r");


    char* filecontents = readFile("data.txt");

    //create dictionary node
    node *dictionary; 
    dictionary = NULL;

    //read words and punctuation in from the text file
    word = strtok (filecontents, " \n");
    int i = 0;
    while (word != NULL)
    {

        printf("%s\n",word);
        insert(dictionary,word);
        printf("%s",dictionary->word); 
        word = strtok (NULL, " \n");
        i++;
    }




    return 0;
}

//not sure if works
node *insert(node *item, char *word)
{
    if(item==NULL)
    {
        item= (node*) malloc(sizeof(node));
        strcpy(item->word, word);
        item->left=NULL;
        item->right=NULL;
        item->count++;
    }
    else
    {
        if(strcmp(word, item->word)<0)
        {
            item->left=insert(item->left, word); 
            item->count++;
        }
        else if(strcmp(word, item->word)>0)
        {
            item->right=insert(item->right, word);
            item->count++;
        }
        else
        {
            item->count++;
        }
    }
    return item;
}


char* readFile(char* filename)
{
    FILE* file = fopen(filename,"r");
    if(file == NULL)
    {
        return NULL;
    }

    fseek(file, 0, SEEK_END);
    long int size = ftell(file);
    rewind(file);

    char* content = calloc(size + 1, 1);

    fread(content,1,size,file);

    return content;
}
4

1 に答える 1