В C объявление struct
не вводит новый тип автоматически. Вам нужно использовать ключевое слово struct
с именем, которое вы дали структуре (которая технически называется тегом структуры):
struct MList *ml_create(void);
Вы можете обойти это, определив имя нового типа, используя ключевое слово typedef
:
typedef struct Mlist_head MList;
Теперь вы можете сделать:
MList ml_create(void);
Также:
По последним двум пунктам сравните ваш код:
if ((m = (struct MList *)malloc(sizeof(struct MList))) != NULL){
с этим, вот как я бы написал:
if ((m = malloc(sizeof *m)) != NULL) {
Для меня последнее намного легче читать, так как в нем меньше шума, и при этом оно безопаснее, поскольку не повторяет имя типа. Если тип указателя m
позже изменится, моя версия по-прежнему будет на 100% правильной.