Связный список, объясните ошибки - C (СИ)

Формулировка задачи:

#include <stdio.h>
#include <stdlib.h>
#include < string.h >
#include <assert.h>
 
typedef struct FIRM 
{
    char FIO[30];//ФИО сотрудника
    char DATE[10];
    char TIME_ARRIVAL[5];//время прихода
    char TIME_CARE[5];//время ухода
    struct Firm * next;
} Firm_t, * list_t;
 
int check_dates(char mass[10])//проверка ввода даты
    {
        int day, month, year;
 
        if(mass[2]!='.' || mass[5]!='.')  // Проверяем корректность формата
        {
            puts("      The date is incorrect");
            return 0;
        }
 
        // Преобразуем строковые символы в числа
        day = atoi(mass);
        month = atoi(mass+3);
        year = atoi(mass+6);
 
        if((month==4 || month==6 || month==9 || month==11) && day>30) // если слишком много дней в коротком месяце
        {
            puts("      The day or month is incorrect");
            return 0;
        }
 
        if(month==2 && day>28)  // отдельно проверяем месяц февраль
        {
            puts("      The day or month is incorrect");
            return 0;
        }
 
        if(day>31) // если введен слишком большой день
        {
            puts("      The day is incorrect");
            return 0;
        }
 
        if(month>12) // если введен слишком большой месяц
        {
            puts("      The month is incorrect");
            return 0;
        }
    return 1;
    };
 
int check_time(char mass[5])//проверка ввода времени
    {
        int minute, hour;
 
        if(mass[2]!=':')  // Проверяем корректность формата
        {
            puts("      The time is incorrect");
            return 0;
        }
 
        // Преобразуем строковые символы в числа
        hour = atoi(mass);
        minute = atoi(mass+3);
         
        if(minute>60) // если введен слишком большой день
        {
            puts("      The minute is incorrect");
            return 0;
        }
 
        if(hour>24) // если введен слишком большой месяц
        {
            puts("      The hour is incorrect");
            return 0;
        }
    return 1;
    };
 
Firm_t * Firm_new(const char FIOn[30],const char DATEn[10],const char TIME_ARRIVALn[5],const char TIME_CAREn[5]) 
{
    Firm_t * pFirm = malloc(sizeof(Firm_t));
    assert( pFirm );
    strcpy (pFirm->FIO, FIOn);
    strcpy (pFirm->DATE, DATEn);
    strcpy (pFirm->TIME_ARRIVAL, TIME_ARRIVALn);
    strcpy (pFirm->TIME_CARE, TIME_CAREn);
    pFirm->next = NULL;
    return pFirm;
}
 
int list_add(list_t * pList, Firm_t * pFirm) 
{
    return ( *pList && list_add(&((*pList)->next), pFirm) || ( *pList = pFirm ) );//main.c(98): error #2140: Type error in 
                                                 argument 1 to 'list_add'; expected 'list_t *' but found '(incomplete) struct Firm * *'.
}
 
void list_purge(list_t list) 
{
    if ( list ) 
    {
        list_purge(list->next);//main.c(105): error #2140: Type error in argument 1 to 'list_purge'; expected 'list_t' 
                                                                                    but found '(incomplete) struct Firm *'.
        free(list);
    }
}
 
void list_dump(list_t list) 
{
    if ( list ) 
    {
        printf("FIO: %s ", list->FIO);
        printf("DATE: %s ", list->DATE);
        printf("TIME ARRIVAL: %s ", list->TIME_ARRIVAL);
        printf("TIME CARE: %s ", list->TIME_CARE);
                list_dump(list->next);//main.c(118): error #2140: Type error in argument 1 to 'list_dump'; expected 'list_t'    
                                                                                      but found '(incomplete) struct Firm *'.
    }
}
 
int main(void) 
{
    char FIOc[30], DATEc[10], TIME_ARRIVALc[5], TIME_CAREc[5];
 
    list_t list = NULL;
    
    while(1)
    {
        printf("FIO: ");
        fgets(FIOc,30,stdin);
        if(strlen(FIOc)==1)
            break;
        
        while(1)
        {
            printf("date: ");
            scanf("%s", DATEc);
            if (check_dates(DATEc)==1)
                break;
        }
        while(1)
        {
            printf("time_arrival: ");
            scanf("%s", TIME_ARRIVALc);
            if (check_time(TIME_ARRIVALc)==1)
                break;
        }
        while(1)
        {
            printf("time_care: ");
            scanf("%s", TIME_CAREc);
            if (check_time(TIME_CAREc)==1)
                break;
        }
 
        list_add(&list, Firm_new(FIOc, DATEc, TIME_ARRIVALc, TIME_CAREc));
    }
    
    list_dump(list);
    list_purge(list);
    
    return 0;
}
Тут реализовано, заполнение и вывод связанного списка. Я так понимаю, я не правильно обращаюсь к след элементу в выделенных строчках. Пожалуйста объясните как будет правильно.


textual

Код к задаче: «Связный список, объясните ошибки - C (СИ)»

list_purge((Firm_t *)list->next);
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

15   голосов, оценка 3.867 из 5

Источник