【问题标题】:How to properly build linked list with char structures如何正确构建具有字符结构的链表
【发布时间】:2019-11-09 01:47:53
【问题描述】:

我有一个动态结构链表,我需要创建以下函数:
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)

我会很感激你的帮助

【问题讨论】:

  • 您的输出是纯文本。请不要添加文字图片。而是将文本添加到问题正文中。错误消息也可以很容易地添加为文本。

标签: c data-structures linked-list


【解决方案1】:

代码存在多个问题。

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

ReadElement 在这种情况下没有功能,可以被丢弃。

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

【讨论】:

  • 是的,我没有写所有的 scanfs,因为它们很大而且非常相似,我想在这里最小化代码。谢谢,我会纠正我的错误。
  • 我尝试使用您的更正,但它再次崩溃。你能帮我么。这是我的完整代码以及您的更正 - pastebin.com/8rKrmPs4。主要问题 - 我从 DATA 文件加载数据,我需要将这些数据放入链表结构中,所以我可以用一个函数调用整个数据海量并获取完整列表,其中包含我从 DATA 加载的专辑和我添加的专辑使用来自 DATAinput 的控制台。这是主要问题,我找不到将数据移动到结构中的方法,因为我在指针和分配动态内存方面遇到了麻烦,我尝试了很多次。
  • 我已将所有更正添加到我的代码中,但它仍然无法正常工作。它进入while循环并粉碎。我认为在 while 条件(fscanf (file, "%s ...... ptr->inform.artist) == 5) 的某个地方有问题,我尝试使用 =!EOF 和 "a" 模式,但似乎没有任何帮助。这里是带有最新更正的更新代码,我删除了所有多余的 pastebin.com/QkjBSmmC 。另外我想提一下,我的列表是单独链接的,所以我想我们只能有一个指针 - *next?
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多