Как сканировать файл строковыми строками и сохранять их в связанном списке ADT? - PullRequest
0 голосов
/ 16 января 2020

У меня есть задание, которое просит меня отсканировать файл, в котором много строк, каждая строка содержит одно слово, подобное этому:

sonnets
william
shakespeare
fairest
creatures
...

Мне нужен способ добавить эти слова в массив связанных списки, созданные

LinkedList* data = calloc(50, sizeof(LinkedList));
for (int i = 0; i < 50; i++) {
    data[i] = newLinkedList();
}

Я пытался использовать fscanf, но на самом деле буфер не хранит слова, а стирается каждый раз, когда я читаю новую строку. И в итоге в список сохраняется только одно слово:

raw = fopen("./shakespeare-cleaned5.txt", "r");
char* buf = calloc(50, sizeof(char));
int length = 0;
while (fscanf(raw, "%s", buf) == 1) {
    length = strlen(buf);
    add(data[length], buf);
}
fclose(raw);

Есть ли другой способ сделать это?

Вот части связанного списка ADT:

Node newNode(char* s) {
    Node N = malloc(sizeof(NodeObj));
    N->number = 1;
    N->item = s;
    N->next = NULL;
    return N;
}

void add(LinkedList L, char* s){
    Node N = NULL;
    if( L==NULL ){
        fprintf(stderr, 
            "StringList Error: calling add() on NULL StringList reference\n");
        exit(EXIT_FAILURE);
    }

    int index = find(L, s);

    if(index == 0){
        N = newNode(s);
        N->next = L->head;
        L->head = N;
        (L->numItems)++;
    }else{
        index--;
        N = L->head;
        for (int i = 0; i < index; i++) {
            N = N->next;
        }
        N->number++;
    }
}

Я также пытался сохранить все слова в массиве, но все, что я получил, - ошибка сегмента.

1 Ответ

2 голосов
/ 16 января 2020

Решение: выделить новую память для хранения слова при создании узла

char* temp = calloc(50, sizeof(char));
strcpy(temp, s);
N->item = temp;
...