2016-03-20 24 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! Bu benim sorunum olduğu kod. Her şey düzgün çalışıyor, sadece kodun son iki satırında "eşleştirilemeyen işaretçi türünden atama" alıyorum ve nedenini bilmiyorum. İşaretçileri değiştirirseniz, bunlar uyumlu türlere sahip olurlar (bence, yani liste = * liste-> sonraki;) Bölümleme hatası alıyorum. Bunu nasıl düzeltebilirim? Yardım için sayesinde A* olarak tanımlanır buBağlantılı listeleri/işaretler (C)

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

fonksiyon create 'ın dönüş tipi için bu

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

AList olduğunu Muco

+1

"AList" türü takma adınız gibi, işaretçi olan tür takma adını oluşturmamanın bir nedeni vardır, çünkü bir işaretçi olduğunu unutmak ve yanlışlıkla bir işaretçi için bir işaretçi yapmak 'sonraki' yapı üyesi ile yapmak veya yanlış boyut tahsis etmek. –

+0

İşaretçiler bir "typedef" takma adıyla gizlenmemeye çalışın - 'create' işleviniz yanlış, 'A' 'için bir alan olan' AList 'için alan ayırırsınız,' struct A 'için alan ayırmanız gerekir. – Holt

+0

Ben bir kod geliştirici değilim, ama bu şekilde güzel görünmüyor mu? Ve dahası, bu yüzden A için bellek ayırmalıyım ama A * AList yeni = (AList) malloc (büyüklük (A)) gibi döndürmelidir; ? – Muco

cevap

0

değişim. Ancak, A::next 'nın türü olan AList*, bu nedenle uyumsuz türünüz var.

İlgili konular