2013-01-07 3 views
0

J'ai fait un arbre binaire où il y a essentiellement trois niveaux de struct:structures de données récursives vont mal - types incompatibles lors de l'attribution Liste à partir du type struct * l

typedef struct l { 
    char n[15]; 
    struct l *next; 
} List; 

typedef struct { 
    char rname[20]; 
    char lname[20]; 
    List number; 
} info; 

typedef struct tree { 
    info thisnode; 
    struct tree *left; 
    struct tree *right; 
} Tree; 

et sur cette ligne de code

t->thisnode.number = t->thisnode.number.next; 

Je reçois l'erreur mentionnée dans le titre

Normalement, avec des structures de données récursives ces type de tâches attribuées, en dépit de la prochaine ayant struct de type * l. Quelqu'un pourrait-il m'aider à comprendre pourquoi dans ce cas, cela ne fonctionne pas?

Aussi j'aurais instinctivement la ligne ci-dessus comme

t->thisnode.number = t->thisnode.number->next; 

Mais mon compilateur semble comme ça encore moins.

Répondre

0

Eh bien, les types sont sûrement incompatibles.

Le type du champ next dans number est struct l *, mais le type de number dans info est List, qui est un alias pour struct l, à savoir l'ensemble struct, pas seulement un pointeur vers elle. Donc, vous essayez d'assigner un pointeur dans une structure entière, qui ne volera pas.

Il semble qu'il vous manque un niveau de pointeur, peut-être le champ number dans info devrait être List *?

+0

Hmmm J'ai fait comme vous avez suggéré et changé le nombre d'infos en Liste * et cela me permet de faire l'assignation, et m'a débarrassé de beaucoup d'erreurs de compilateur que je recevais (une fois que j'ai changé tous les numéros. nombre-> n). Mais dans ma fonction principale, je reçois un défaut seg après avoir inséré une entrée, alors qu'avec le même code avant d'ajouter la structure List, je n'avais pas ce problème. Je vais jouer un peu avec ça, mais j'ai l'impression que C n'aime pas cette structure de 3 niveaux, ou est-ce que ça va? – Joe

+0

Eh bien, il semble que j'ai oublié de malloc lorsque «numéro» lors de l'attribution de numéro-> n [x] et cela semble avoir corrigé le défaut seg. – Joe

0

L'expression t->thisnode.number est de type List (à savoir struct l), tandis que t->thisnode.number->next est de type struct l * (bien, serait si elle a effectivement compilé que vous accédez à un membre non-pointeur avec la syntaxe d'accès pointeur).

Questions connexes