Árbol binario de búsqueda de ayuda con los punteros entre dos estructuras

votos
2

Tengo un trabajo a domicilio que está casi hecho, pero he pegado somewhere.I que advertirle de que es la primera vez que estoy usando punteros y todas estas cosas raras, así que estoy bastante perdido. Mi propósito es leer una lista de los estudiantes txt datos (Nombre Apellido ID). El truco es que tengo que usar un árbol de búsqueda binaria para almacenar los apellidos (he hecho esto) y para crear en el interior del primer árbol a otro árbol de búsqueda binario que almacena los nombres de los estudiantes y el ID (parcialmente completo). El problema es que cuando algún estudiante tiene el mismo apellido y nombre diferente que no debe crear un nuevo nodo para los apellidos, pero tengo que poner los nuevos estudiantes de primer nombre y la identificación dentro de un nodo existente del apellido. Debe ser como: Cameron James 12131313

Andrew 17286378 (su apellido es también Cameron)

El código es:

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 *);

En lo principal que yo llamo el loadData () para importar los estudiantes

  loadData(&temp);

Y el loadData () es

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);  
}

Me llamo el add_node () que insertar un nuevo nodo en mi árbol principal (Apellidos). Este alo funciona ..

 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;
  }   

Mi problema comienza con (topname = add_node_nameANDid (topname, Temp 2);), que es un functon como add_node () pero añade nuevos nodos nameANDid si los estudiantes tienen el mismo apellido .. No sé qué argumentos utilizar ... no me gusta punteros porque no tengo experiencia con su uso (no mojado por lo menos) ... Y el add_node_nameANDid () es

   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;
     }

En add_node_nameANDid () i intentado utilizar variables similares a ser más fácil de entender .. ¿Cómo debo usar los punteros en el add_node_nameANDid () porque cuando copmpile lo que dice [Aviso] arg paso 1 del `add_node_nameANDid' de tipo de apuntador incompatible en línea

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

o tipo incompatible para el argumento 2 de `add_node_nameANDid'

 topname=add_node_nameANDid(topname,temp2);}

cuando llamo al add_node_nameANDid () desde add_node ().

Puede complacer a alguien que me ayude con este lío?

Publicado el 23/05/2011 a las 09:57
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
3

Parece que el problema es que se han utilizado node *tanto para las estructuras de izquierda y derecha. Así que lo que está sucediendo es que va a copiar una struct nameANDiden una struct node. Sugiero que, en nameANDidlo que necesita nlefty nrightque seas punteros a struct nameANDid, no struct node.

EDIT: Hay varios otros problemas, tales como creo que la intención sería la de buscar en yohohoen el nodo de estructura para conseguir el árbol binario de los primeros nombres. También add_node_nameANDidestá fijando temp->nlefty temp->nrightpara null, no está seguro de que esto es correcto.

Respondida el 23/05/2011 a las 10:12
fuente por usuario

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