首页 > 解决方案 > 如何正确构建具有字符结构的链表

问题描述

我有一个动态结构链表,我需要创建以下函数:
1. 将从文本文件中加载数据。
2. 将新元素添加到我的链表结构中。
3.输出我的链表中存在的所有数据。
我也有菜单,所以我调用这些函数在控制台中输入我需要的内容。我想我在动态数据分配和指针方面存在问题。 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)

我将不胜感激

标签: cdata-structureslinked-list

解决方案


代码存在多个问题。

  1. 您正在使用 写入文件,AddElement然后使用ReadElement. 从第二项开始,您将阅读 read 函数中的所有元素。所以如果你写了10张专辑,你ReadElement每次都会读完。对于下一次写入,您将丢弃读取到链表中的 10 个相册并再次读取 11 个相册。

ReadElement在这种情况下不做功能,可以丢弃。

  1. in AddElement,您仅albA在读取许多其他参数时才写入ReadElement

  2. 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;
    }     
}

推荐阅读