繁体   English   中英

从文本文件创建链接列表

[英]Create link list from text file

无法读取文本文件并将其存储在链接列表中。 我正在读取具有名字,名称,优先级和读取级别的文件。 我认为问题可能是我没有正确分配字符串/ tempPtr,或者我的循环不断运行。 运行该程序时,它将持续运行,没有段错误。

typedef struct Student{
    char* firstName;
    char* lastName;
    int priority;
    int readingLevel;
    bookIds* wishlist;
    struct Student* next;
}student;    

student* buildStudentList(char* studentsFile, student* head)
{
    int i;
    FILE* fp;
    student* tempPtr = NULL;
    if((fp = fopen(studentsFile, "r")) == NULL)
        {
            printf("Unable to open file\n");
            return 0;
        }

    student* current = NULL;
    tempPtr = (student*)malloc(sizeof(student));
    tempPtr->firstName = malloc(sizeof(char)* NAME);
    tempPtr->lastName = malloc(sizeof(char)* NAME);

    while(fscanf(fp, "%s %s %d %d",tempPtr->firstName, tempPtr->lastName, tempPtr->priority, tempPtr->readingLevel) != EOF)
        {
            tempPtr->next = NULL;
            if(head == NULL)
                {
                    head = tempPtr;
                    current = tempPtr;
                    tempPtr = (student*)malloc(sizeof(student));
                }
            else
                {
                    current->next = tempPtr;
                    current = tempPtr;
                    tempPtr = (student*)malloc(sizeof(student));
                }
        }
    free(tempPtr);
    fclose(fp);
    return head;
}

我建议您更改student结构,以便firstNamelastName是数组而不是指针。 当它们总是相同大小时,就无需使用动态分配。

typedef struct Student{
    char firstName[NAME];
    char lastName[NAME];
    int priority;
    int readingLevel;
    bookIds* wishlist;
    struct Student* next;
}student;

接下来,无论何时分配新student ,都需要初始化wishListnext指向NULL指针。

调用fscanf() ,需要将指针传递给您要填充的int成员。

您可以通过仅在一个位置执行malloc()而不是在循环之前执行,然后在if每个分支中重复执行malloc()来简化代码。 将输入读入局部变量,然后在成功后分配student

typedef struct Student{
    char firstName[NAME];
    char lastName[NAME];
    int priority;
    int readingLevel;
    bookIds* wishlist;
    struct Student* next;
}student;    

student* buildStudentList(char* studentsFile, student* head)
{
    int i;
    FILE* fp;
    if((fp = fopen(studentsFile, "r")) == NULL)
        {
            printf("Unable to open file\n");
            return 0;
        }

    student* current = NULL;

    char firstName[NAME], lastName[NAME];
    int priority, readingLevel;

    while(fscanf(fp, "%s %s %d %d",firstName, lastName, &priority, &readingLevel) != EOF)
        {
            student* tempPtr = malloc(sizeof(student));
            tempPtr->next = NULL;
            tempPtr->wishlist = NULL;
            strcpy(tempPtr->firstName, firstName);
            strcpy(tempPtr->lastName, lastName);
            tempPtr->priority = priority;
            tempPtr->readingLevel = readingLevel;

            if(head == NULL)
                {
                    head = tempPtr;
                }
            else
                {
                    current->next = tempPtr;
                }
            current = tempPtr;
        }
    fclose(fp);
    return head;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM