Читать файл построчно, чтобы структурировать - PullRequest
0 голосов
/ 01 мая 2020

Я хочу прочитать файл, который выглядит следующим образом:

Spyros 1
George 2
John 3

и я хочу сохранить каждого студента в структуре:

typedef struct studentR *student;
struct studentR{
   char name[MAXSTRING];
   int id;
   student next;
};

Я написал следующую часть код, который делает то, что я хочу, но только для первой строки. Как я могу переместить его на следующую строку?

while(fscanf(fp, "%s %d", st->name, &st->id) != EOF){
    l = list_push_back(l, st->name, st->id);
}

Вот list_push_back

//enters the new student in the end of the list
list list_push_back(list l, char *name, int id){
    student new_student = (student)malloc(sizeof(struct studentR));
    assert(new_student);

    strcpy(new_student->name, name);
    new_student->id = id;
    new_student->next = NULL;


    //push payload(stsudent data) at the top if the list is empty
    if (list_isempty(l))
    {
        l->head = new_student;
        l->tail = new_student->next;
        l->size++;
    }else{
        //push the payload(student data) at the bottom if the list is NOT empty
        student last = (student)malloc(sizeof(struct studentR));
        assert(last); 
        last->next = new_student;
        l->tail = new_student;
        l->size++;
    }

    return l;
}

1 Ответ

1 голос
/ 01 мая 2020

Что не так с этим кодом:

  • Никогда правильно не установите tail в случае добавления к пустому списку.
  • Утечка памяти в надстройке -not-empty-list case (дважды).
  • Сортировать-добавить-узел в случае add-to-not-list-list, но при этом происходит утечка памяти.

Эта функция должна выглядеть следующим образом:

list list_push_back(list l, const char *name, int id)
{
    student new_student = malloc(sizeof *new_student);
    assert(new_student);

    strcpy(new_student->name, name);
    new_student->id = id;
    new_student->next = NULL;

    if (l->size == 0)
    {
        l->head = new_student;
    }
    else
    {
        l->tail->next = new_student;
    }
    l->tail = new_student;
    l->size++;

    return l;
}

Это all .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...