2016-03-20 6 views
0
typedef struct A A; 
typedef struct A* AList; 


struct A{ 
    char* name; 
    AList *next; 
}; 

AList create(char *name) 
{ 
    AList new = (AList)malloc(sizeof(AList)); 
    new->name = name; 
    new->next = NULL; 
    return new; 
} 

void add(char* name, AList *aList) 
{ 
    AList list = *aList; 
    if (list == NULL) 
    { 
     list = create(name); 
     *aList = list; 
    } 
    else 
    { 
     while (list->next != NULL) 
      list = list->next; 
     list->next = create(name); 
    } 
} 

Hello! Это код, с которым я столкнулся. Все работает правильно, я получаю «назначение от несовместимого типа указателя» в последних двух строках кода, и я не знаю почему. Если я изменяю указатели, чтобы они имели совместимые типы (на мой взгляд, т. Е. List = * list-> next;), я получаю ошибку сегментации. Как я могу это исправить? Спасибо за помощь, MucoСвязанные списки/указатели в C

+1

Существует причина, по которой я не рекомендую создавать псевдонимы типа, которые являются указателями, такими как псевдоним типа ALIST, потому что тогда легко забыть, что это указатель, и по ошибке сделать что-то указателем на указатель, как вы делать с элементом 'next', или назначать неправильный размер. –

+0

Старайтесь не скрывать указатели на псевдонимы 'typedef'. Ваша функция' create' неверна, вы выделяете пространство для 'AList', которое является' A * ', в то время как вы должны выделять пространство для' struct A'. – Holt

+0

Я не пурист кода, но разве этот способ не выглядит лучше? И еще, поэтому я должен выделить память для A, но вернуть A *, как ALIST new = (AList) malloc (sizeof (A)); ? – Muco

ответ

0

изменить это

struct A{ 
    char* name; 
    AList *next; 
}; 

к этому

struct A{ 
    char* name; 
    AList next; 
}; 

Функция create «s возвращаемый тип AList, который определяется как A*. Но тип A::next - AList*, что составляет A**, поэтому у вас есть несовместимый тип.

Смежные вопросы