2014-05-19 12 views
1

J'écris un programme d'arborescence binaire dans lequel chaque nœud contient une structure. Étant nouveau pour les pointeurs, je ne suis pas sûr de savoir comment corriger cette erreur que je reçois.L'expression de structure arborescente doit avoir un type de classe

Ce sont mes struct:

//inventory definition 
typedef struct inventory 
{ 
    char invName[36]; 
    int invPartNo; 
    int invQOH; 
    float invUnitCost; 
    float invPrice; 
}item; 

//tree definition 
struct btree { 
    item *data; 
    struct btree *left; 
    struct btree *right; 
} ; 

Et dans ces deux fonctions, je reçois l'erreur 'expression doit avoir un type de classe':

struct btree *binary_search(struct btree *tree, int data) 
{ 
    if (tree==NULL) return NULL; 
    else if (data == tree->data.invPartNo) //tree in this line is highlighted red with the error 
     return tree; 
    else if (data < tree->data.invPartNo) //tree in this line is highlighted red with the error 
     return(binary_search(tree->left, data)); 
    else 
     return(binary_search(tree->right, data)); 
} 


btree *Insert(btree *node, inventory i) 
{ 
    if(node == NULL) 
    { 
     btree *temp; 
     temp = (btree *)malloc(sizeof(btree)); 
     temp->data = i; 
     temp->left = temp->right = NULL; 
     return temp; 
    } 
    if(i.invPartNo > node->data.invPartNo) //node is highlighted with error 
    { 
     node->right = Insert(node->right, i); 
    } 
    else if(i.invPartNo < node->data.invPartNo) //node is highlighted with error 
    { 
     node->left = Insert(node->left, i); 
    } 
    return node; 
} 
+3

Le membre 'data' est un pointeur. Il y a d'autres incohérences dans votre code (comme utiliser 'inventory' comme type), êtes-vous sûr de programmer C et non C++? En outre, il y a d'autres erreurs que je suis surpris de ne pas poser (par exemple, l'affectation d'une structure sans pointeur à un pointeur vers la structure). –

+0

'data == (arbre-> données) -> invPartNo'..après tout' data' est pointeur dans le noeud – GoldRoger

+0

S'il vous plaît, ne pas convertir la valeur de retour de 'malloc' –

Répondre

2

node->data est un pointeur à un type item, donc . ne lui convient pas lorsque vous essayez de sélectionner un sous-champ.

Vous devez utiliser ->, comme dans (node->data)->invPartNo.

Mais je ne suis pas tout à fait sûr pourquoi vous séparer la charge utile dans une autre structure (a). Je ferais probablement tout une structure et ensuite juste utiliser la manipulation des pointeurs pour la restructuration de l'arbre. En d'autres termes, quelque chose comme:

struct btree { 
    item data;   // Now it IS "node->data.something". 
    struct btree *left; 
    struct btree *right; 
}; 

(a) Il y a parfois des raisons valables pour cela, comme si la charge utile btree est encore une autre collection comme une liste chaînée, ou si vous voulez que les arbres être capable de stocker des types de données arbitraires. Mais il apparaît ici qu'il serait beaucoup plus simple de n'avoir qu'un niveau d'indirection, celui des noeuds eux-mêmes.

Questions connexes