Binary Aide à la recherche de l'arbre avec des pointeurs entre deux structures

voix
2

J'ai un travail à domicile qui est presque fait, mais je suis resté fidèle somewhere.I doivent avertir que c'est la première fois que je suis en utilisant des pointeurs et tous ces trucs bizarres, donc je suis assez perdu. Mon but est de lire à partir d'une liste de données des étudiants txt comme (Nom Prénom ID). L'astuce est que je dois utiliser un arbre de recherche binaire pour stocker les noms (je l'ai fait) et de créer à l'intérieur du premier arbre un autre arbre de recherche binaire qui stocke les premiers noms des élèves et l'ID (partiellement complète). Le problème est que lorsque certains étudiants ont le même nom et prénom différent je ne dois pas créer un nouveau noeud pour les noms mais je dois mettre les nouveaux étudiants prénom et identifiant l'intérieur d'un nœud existant de nom. Il devrait être comme: Cameron James 12131313

Andrew 17286378 (son nom de famille est aussi Cameron)

Le code est le suivant:

typedef struct nameANDid{
    char first[20];
    int ID;
    struct node *nleft;
    struct node *nright;
}yohoho;
typedef struct node{  
   char last[20];  
   struct nameANDid yohoho;  
   struct node *left;
   struct node *right;
 }node;
 ///
 struct node temp;
 struct nameANDid temp2;
 struct node *top=NULL;
 struct nameANDid *topname=NULL;
 void loadData();
 struct nameANDid * add_node_nameANDid(struct nameANDid *, struct nameANDid *);
 /////
 struct node * add_node (struct node *, struct node *);
 struct node * search_node (struct node *, char *);
 void print_node (struct node *);
 void print_tree (struct node *);

Dans l'ensemble j'appelle les loadData () pour importer les étudiants

  loadData(&temp);

Et le loadData () est

void loadData(struct node *temp){      
int i;
FILE *fp;
fp=fopen(FILENAME,r);
if (fp == NULL) printf(File does not exist\n);
for (i=0; i<20; i++){       
    fscanf(fp,%s,&temp->last);
    fscanf(fp,%s,&temp->yohoho.first);
    fscanf(fp,%d,&temp->yohoho.ID);     
    top=add_node(top,temp);
    }
fclose(fp);
printf(\n\nFile loaded\n);  
}

J'appelle la add_node () qui insérer un nouveau noeud dans mon arbre principal (noms). Ce Alo fonctionne ..

 struct node * add_node (struct node *top, struct node *temp){
   struct node *newNode;  
   if (top == NULL){    
   newNode=(struct node *)malloc(sizeof(struct node));
   temp->left=NULL;
   temp->right=NULL;
   if (memcpy(newNode,temp,sizeof(struct node)) == NULL)    {
      printf(Node addition failed\n);
      return NULL;}
   else {      
     //printf(Node added\n);
     return newNode;}
   }
   else {   
      if (stricmp(temp->last,top->last) < 0){
         // printf(left\n);
        top->left=add_node(top->left,temp);}
      else if (stricmp(temp->last,top->last) == 0){
        // printf(Last names are equal\n); 
        topname=add_node_nameANDid(topname,temp2);} //Here is one of my problems
      else {
        // printf(right\n);
        top->right=add_node(top->right,temp);}
        // printf(Node added\n);   
        return top;
       } 
      return NULL;
  }   

Mon problème commence par (topname = add_node_nameANDid (topname, temp2);) qui est un functon comme add_node () mais elle ajoute de nouveaux nœuds de nameANDid si les étudiants ont le même nom de famille .. Je ne sais pas quels sont les arguments à utiliser ... Je déteste les pointeurs parce que je ne suis pas expérimenté avec leur utilisation (pas moins humide) ... Et le add_node_nameANDid () est

   struct nameANDid * add_node_nameANDid (struct nameANDid *topname, struct nameANDid *temp){
     struct nameANDid *newNode_nameANDid;  
     if (topname == NULL){    
    newNode_nameANDid=(struct nameANDid *)malloc(sizeof(struct nameANDid));
    temp->nleft=NULL;
    temp->nright=NULL;
    if (memcpy(newNode_nameANDid,temp,sizeof(struct nameANDid)) == NULL){
       printf(Node addition failed\n);
       return NULL;}
    else {      
      //printf(Node added\n);
      return newNode_nameANDid;}
    }
    else {   
        if (stricmp(temp->first,topname->first) <= 0){
           // printf(leftname\n);
           topname->nleft=add_node_nameANDid(topname->nleft,temp);}
        else {
           // printf(rightname\n);
           topname->nright=add_node_nameANDid(topname->nright,temp);}
          // printf(Node added\n);   
          return topname;
        } 
        return NULL;
     }

J'ai essayé dans add_node_nameANDid () d'utiliser des variables similaires pour être plus facile de les comprendre .. Comment dois-je utiliser les pointeurs dans le add_node_nameANDid () parce que quand je copmpile ce qu'il dit [Avertissement] passant arg 1 `add_node_nameANDid » de type pointeur incompatible en ligne

 topname->nleft=add_node_nameANDid(topname->nleft,temp);}(in add_node_nameANDid())

ou type incompatible pour l'argument 2 de `add_node_nameANDid »

 topname=add_node_nameANDid(topname,temp2);}

lorsque i appelle le add_node_nameANDid () à partir de add_node ().

Peut plaire à quelqu'un me aider avec ce gâchis?

Créé 23/05/2011 à 09:57
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
3

Il semble que le problème est que vous avez utilisé node *pour les deux structures à gauche et à droite. Donc , ce qui se passe est que vous copiez un struct nameANDiden struct node. Je suggère que nameANDidvous avez besoin nleftet nrightd'être des pointeurs vers struct nameANDid, non struct node.

EDIT: Il y a plusieurs autres problèmes, comme je pense que l'intention serait d'examiner yohohodans le nœud struct pour obtenir l'arbre binaire des prénoms. Aussi add_node_nameANDidest mise temp->nleftet temp->nrightà null, pas que ce soit correct.

Créé 23/05/2011 à 10:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more