Как правильно построить связанный список со структурами символов - PullRequest
2 голосов
/ 27 июня 2019

У меня есть связанный список динамической структуры, и мне нужно создать функции, которые:
1. будут загружать данные из текстового файла.
2. добавить новый элемент в структуру связанного списка.
3. outputвсе данные, имеющиеся в моем связанном списке.
У меня также есть меню, поэтому я вызываю эти функции для ввода того, что мне нужно в консоли.Я предполагаю, что у меня есть проблемы с динамическим распределением данных и указателями.https://imgur.com/a/8ynqar8

Я боролся с этим уже пару дней, пытаясь решить проблему с помощью правильных указателей выделения.

    #define MES_LEN 100    
    #define m 23    
    typedef struct {    
       char index[m];    
       char name[MES_LEN];    
       char release[MES_LEN];    
       char length[MES_LEN];    
       char artist[MES_LEN];    
       } INFORM;    
    typedef struct list_elem {    
       INFORM inform;    
       struct list_elem *next;    
    }    
    LEL;    
    LEL* list;    
    void AddElement(void);    // Writing new element to file (DATAinput)
    void LoadData(void); // Reading previously written data    
    void ReadElement (void); // Reading data from existing file data (DATA)    
    void OutpuAll(void); // Output in console all previously added data from both files    
    int menu(void);    
    int main() {    
    ...                 
            case 1: OutpuAll(); break;                       // Output all data    
            case 2: AddElement(); ReadElement(); break;    // Add element to file                 
            case 3: LoadData(); break;             // Loading data from the file    
    ...
    }    
        void AddElement (void) // I have an empty file that i fill and then read and link to my main structure(this works fine)    
        {           
        char albN[25], albR[11], albL[11], albA[25], albI[5];    
        FILE * fileD;    
        fileD = fopen("DATAinput.txt", "r");    
    ...      
        printf("Enter album artist \n");    
            scanf("%s", albA);    
            fprintf(fileD, "%s ", albA);    
            fclose(fileD);    

    } 

    void ReadElement (void) // Reading previously written data(AddElement)    
    {    
        LEL *ptr;    
        ptr = (LEL*)malloc(sizeof(LEL));    
        FILE * fileD;    
        fileD = fopen("DATAinput.txt", "r");    
        if (fileD == NULL) {    
            printf("Can not open the file\n");    
            exit(1);    
        }    
        while(fscanf (fileD, "%s %s %s %s %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist) != EOF)    
        { ptr->next=NULL;    
            printf("\n Id:%s Album: %s  Released: %s  Length: %s  Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist); }    
        fclose(fileD);    
        free(ptr);    
    }    
    void LoadData(void)

 // Reading existing data from file    

    {    
        LEL *current, *head;    
        LEL *ptr;    
        ptr = (LEL*)malloc(sizeof(LEL));     
        FILE * file;     
        file = fopen("DATA.txt", "r");    
        if (file == NULL) {    
            printf("Can not open the file\n");    
        }    
        while(fscanf (file, "%s %s %s %s %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist) != EOF)    
        {  printf("\n %s Album: %s  Released: %s  Length: %s  Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist); }       
               fclose(file);    
               ptr->next = NULL;    
        }    
    void OutpuAll(void) // Trying to output data that i previously loaded from files to structure.    
    {    
        LEL *ptr; 
LEL* ptr = list;
    while (ptr!=NULL) {  
            printf("\n Id:%s Album: %s  Released: %s  Length: %s  Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist);}     
       }
    ptr = ptr->next;
}

У меня есть некоторые проблемы с указателями в конце этих функций

void ReadElement (void)    
void LoadData(void)    
void OutpuAll(void)

Буду благодарен за помощь

1 Ответ

0 голосов
/ 27 июня 2019

Есть несколько проблем с кодом.

  1. Вы пишете в файл с помощью AddElement, а затем читаете с помощью ReadElement.Начиная со второго пункта, вы будете читать все элементы в функции чтения.Так что если вы написали 10 альбомов, вы будете читать все их в ReadElement каждый раз.При следующей записи вы отбрасываете 10 альбомов, прочитанных в связанный список, и снова читаете 11 альбомов.

ReadElement в этом случае не работает и может быть отброшен.

в AddElement, вы пишете только albA, в то время как вы читаете множество других параметров в ReadElement

AddElement, открывает файл в "r" режим, который установит указатель файла на начало файла.Вам нужно открыть его в режиме "a"

Есть дополнительные проблемы, вы можете увидеть код ниже для справки.

LEL *head = NULL;
LEL *currrent = NULL;

void AddElement (void) // I have an empty file that i fill and then read and link to my main structure(this works fine)    
{           
    char albN[25], albR[11], albL[11], albA[25], albI[5];    
    FILE * fileD;    
    fileD = fopen("DATAinput.txt", "a");    
    printf("Enter album artist \n");    
    scanf("%s", albA);    
    fprintf(fileD, "%s ", albA); 

    // add other scanf and fprintfs         
    fclose(fileD);    

} 

void LoadData(void)
{
    LEL *ptr;
    FILE * file;
    file = fopen("DATA.txt", "r");
    if (file == NULL) {
        printf("Can not open the file\n");
    }
    while(fscanf (file, "%s %s %s %s %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist) == 5)
    {
        ptr = malloc(sizeof(LEL));
        ptr->next=NULL;
        printf("\n %s Album: %s  Released: %s  Length: %s  Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist);
        if (head == NULL)
        {
           head = ptr;
           current = ptr;
        }
        else
        {
           current ->next = ptr;
           current = current->next;
        }
    }
    fclose(file);

}

void OutpuAll(void) // Trying to output data that i previously loaded from files to structure.    
{    
    LEL *ptr; 
    LEL* ptr = head;
    while (ptr!=NULL) {  
        printf("\n Id:%s Album: %s  Released: %s  Length: %s  Artist: %s", ptr->inform.index, ptr->inform.name, ptr->inform.release, ptr->inform.length, ptr->inform.artist);
        ptr = ptr->next;
    }     
}
...