Нужна помощь в настройке алфавитного списка из файла, состоящего из нескольких строк символов 7

#c #struct

#c #структура

Вопрос:

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


struct dictionary {
    char *data;
    struct dictionary *nextPtr;

};

typedef struct dictionary Dictionary;
typedef Dictionary* DictionaryPtr; 

// Prototypes
void printList(DictionaryPtr currentPtr);
void insert(DictionaryPtr *sPtr, char *value);
int isEmpty(DictionaryPtr sPtr);


void insert(DictionaryPtr *sPtr, char *value){

    DictionaryPtr newPtr = malloc(sizeof(Dictionary));



    if(newPtr != NULL){
        newPtr->data = value;
        newPtr->nextPtr = NULL;
        DictionaryPtr previousPtr = NULL;
        DictionaryPtr currentPtr = *sPtr;


        while(currentPtr != NULL amp;amp; value > currentPtr->data){
            previousPtr = currentPtr;
            currentPtr = currentPtr->nextPtr;
        }

        if(previousPtr == NULL){
            newPtr->nextPtr = *sPtr;
            *sPtr = newPtr;
        }
        else{
            previousPtr->nextPtr = newPtr;
            newPtr->nextPtr = currentPtr;
        }
    }
    else{
        printf("%s not inserted. No memory available.n", value);
    }
}


int isEmpty(DictionaryPtr sPtr){
    return sPtr == NULL;
}

void printList(DictionaryPtr currentPtr){
    //if empty
    if(isEmpty(currentPtr)){
        printf("List is empty.n");
    }
    else{
        printf("The list is:");

        while(currentPtr != NULL){
            printf("%s --> ", currentPtr->data);
            currentPtr = currentPtr->rightPtr;
        }
        printf("NULLn");
    }
}
int main(void){

    FILE *fp = fopen("P4WORDS.TXT", "r"); 
        if (fp == NULL){
            printf("Dictionary file not included in file structure");
            exit(0);
        }
    
    fseek()
        fseek(fp, 0, SEEK_END); 
        int bytes = ftell(fp); 
        int count = bytes / 8; 
    
        DictionaryPtr startPtr = NULL;
        char word[8];
        int byteCount = 0;
    
    
        while (byteCount < bytes){
            fseek(fp, byteCount, SEEK_SET); 
            if(fgets(word, 8, fp) != NULL){ 
                    insert(amp;startPtr, word);
                    printList(startPtr);
            }
            //rewind(fp);
            byteCount = byteCount   8;
        }
    
        printList(startPtr);
        return 0;
}
 

На данный момент у меня есть это, и, похоже, происходит то, что в итоге последнее слово из файла несколько раз печатается в списке. Я протестировал и убедился, что данные собраны, но, похоже, они перезаписываются при каждом повторении. Я думаю, что есть какая-то ошибка в insert () или настройке моей структуры словаря… Я просто не могу точно определить это. У кого-нибудь есть указатель на то, как я могу правильно сохранить и распечатать список?

Файл состоит из…

 Abandon
Abating
Abdomen
Abetted
Abetter
Abettor
Abiding
Abigail
Ability
Abjured
Abolish
Aborted
Abounds
Abraham
Abreast
Abridge
Absalom
Abscess
Abscond
Absence
Absolve
Absorbs
Abstain
Abusing
Abusive
Abysmal
Academy
Acceded
Accents
Accepts
Acclaim
Accords
Account
Accrued
Accrues
Accusal
Accused
Accuser
Accuses
Accusor
Acetate
Acetone
Achaean
Achieve
Acidity
Acolyte
Acquire
Acreage
Acrobat
Acronym
Acrylic
Actions
Actives
Actress
Actuary
Actuate
Acutely
Adagios
Adamant
Adapted
Adapter
Adaptor
Addenda
Addicts
Addison
Addling
Address
Adeline
Adenoma
Adeptly
Adhered
Adheres
Adjoins
Adjourn
Adjudge
Adjunct
Adjusts
Admiral
Admired
Admirer
Admires
Admixed
Adopted
Adoring
Adorned
Adrenal
Adsorbs
Adulate
Advance
Adverbs
Adverse
Advised
Adviser
Advises
 

Комментарии:

1. TLDR — похоже, вы снова и снова используете одну и ту же память для разных слов. Может быть, вам нужно malloc() и strcpy() ( strdup() если в вашей системе это есть, и вы не возражаете потерять немного переносимости)? … не забудьте освободить ресурсы, как только закончите с ними.

2. newPtr->data = value; Функция вызывается с одной и той же word переменной каждый раз. Сделайте копию с strdup помощью . Не забудьте free , когда больше не нужно.

3. опубликованный код не компилируется! 1) словарь структуры не содержит поля: nextptr 2) относительно: fseek() вызывает ошибку слишком малого количества аргументов 3) это утверждение: typedef struct dictionary Dictionary;dictionary содержит «случайный» конец: dictionary 4) опубликованный код заставляет компилятор также выводить несколько предупреждений.

4. OT: относительно: else{ printf("%s not inserted. No memory available.n", value); } лучше всего информировать пользователя об ошибке путем вывода в stderr , а не stdout . Кроме того, лучше всего указать stderr причину, по которой система считает, что произошла ошибка. Предлагаю perror( "malloc failed" );

5. OT: относительно; while(currentPtr != NULL){ printf("%s --> ", currentPtr->data); currentPtr = currentPtr->rightPtr; } это «может» привести к появлению строки на вашем терминале длиной в сотни символов. предложение: printf("%s -->n ", currentPtr->data); с добавлением ‘ n’ результатом будет одна запись на строку.