Plik txt na słownik wyrazów

0

Witam,
chciałbym prosić o drobne naprowadzenie. Otóż mam za zadanie zrobić program, który utworzy z dowolnego pliku txt słownik wyrazów, posortowanych alfabetycznie, bez powtórek z tego właśnie pliku. Muszę wykorzystać do tego dynamiczne przydzielanie pamięci, bo nie wiem z góry jaka będzie ilość wyrazów.

No i tu się pojawia u mnie jeden z problemów. O ile potrafię zrobić, aby program wpisywał do głównej tablicy słowa - tablice znaków (niestety ilość elementów wpisana w programie od razu), to ze zrobieniem tego samego dynamicznie mam drobny kłopot. Wiem, że muszę wykorzystać w tym celu funkcje malloc(), jednak nie potrafię jej użyć dla tablicy 2-wymiarowej (tablica tablic znaków).

Druga sprawa to sortowanie - jaki sposób sortowania najlepiej by do tego pasował? Jak wyłapywać duplikaty słów, aby nie wpisywać ich 2 raz do pamięci?

Prosiłbym o jakieś drobne naprowadzenie w jaki sposób mogę to wykonać. Program muszę napisać w C.

Pozdrawiam.

0

Może zaimplementuj SortTree, ale nie wstawiaj istniejących już wartości. Albo zwykłą listę...

0

Mógłbyś coś więcej powiedzieć na ten temat? I jak mogę zapisywać w pamięci te słowa?

1

O drzewie znajdziesz tutaj: http://math.hws.edu/eck/cs225/s03/binary_trees/
Spokojnie sobie to na C przetłumaczysz, jest tam też o sort tree, tylko zamiast wstawiać wartość "większą lub równą" do prawego pod-drzewa, po prostu wstawiaj tylko "większą", a równej nie wstawiaj, bo już ją masz. Dostaniesz wtedy posortowane unikalne wartości z wejścia.

Jeśli jeszcze nie wiesz jak działać z malloc/calloc, to najwyższy czas zacząć się tego uczyć. ;)

0

Dziękuje, jeżeli chodzi o malloc() to wiem jak na niej działać, jednak nie mam bladego pojęcia jak wykorzystać ją dla tablicy 2 wymiarowej, bo chyba taka zostanie wykorzystana w przypadku utworzenia tablicy tablic znaków.

0

Drzewo (na szybko wstukane, być może są tam jakieś błędy - ale kompiluje się i wydaje się działać):

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

typedef struct SortTree SortTree;

struct SortTree {
    SortTree* left;
    SortTree* right;
    char* data;
};

void tree_insert(SortTree** root, const char* data) {
    if (*root == NULL) {
        *root = malloc(sizeof(SortTree));
        (*root)->left = NULL;
        (*root)->right = NULL;
        (*root)->data = malloc(strlen(data) + 1);
        strcpy((*root)->data, data);
    } else {
        if (strcmp(data, (*root)->data) < 0) {
            tree_insert(&((*root)->left), data);
        } else if (strcmp(data, (*root)->data) > 0) { 
            tree_insert(&((*root)->right), data);
        }
    }
}

void tree_remove(SortTree** root) {
    if (*root != NULL) {
        if ((*root)->left != NULL) {
            tree_remove(&((*root)->left));
        }
        (*root)->left = NULL;
        if ((*root)->right != NULL) {
            tree_remove(&((*root)->right));
        }
        (*root)->right = NULL;
        
        free((*root)->data);
        (*root)->data = NULL;
        free(*root);
        *root = NULL;
    }
}

void tree_inorder_print(SortTree* root, FILE* file) {
    if (root == NULL) return;
    tree_inorder_print(root->left, file);
    fprintf(file, "%s\n", root->data);
    tree_inorder_print(root->right, file);
}
    
int main(void) {
    SortTree* root = NULL;
    const char* word[] = { "francja", "delta", "gamma", "beta", "alpha",
                            "beta", "delta", "castelanni", "evangelion",
                            "francja", "gamma"};
    for (int i = 0; i < 11; ++i) {
        tree_insert(&root, word[i]);
    }
    
    tree_inorder_print(root, stdout); // możesz podać otwarty do zapisu plik
    
    tree_remove(&root); // czyścimy po sobie
    
    return 0;
}

A na 2d tablicy... Tssk... Skąd wiesz ile słów będzie? Alokowanie samo w sobie jest proste:

char** tab = malloc(sizeof(char*) * ilosc_stringow);
for (int i = 0; i < ilosc_stringow; ++i) {
    tab[i] = malloc(dlugosc_slowa + 1); // + 1 na \0
}

Analogicznie robisz zwalnianie pamięci.

0

Dziękuje bardzo za pomoc, z tym alokowaniem pamięci jakoś sobie poradziłem, sortowanie będę robił niedługo ale na pewno się przyda.

Proszę jeszcze nie zamykać tematu :)


Wszystko już zrobione, dziękuje za pomoc.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1