Binary Search Tree Help met verwijzingen tussen twee structuren

stemmen
2

Ik heb een huis werk dat is bijna gedaan, maar ik heb geplakt somewhere.I moeten waarschuwen dat het de eerste keer dat ik ben met behulp van pointers en al deze rare dingen, dus ik vrij ben verloren. Mijn doel is om te lezen uit een lijst txt studenten gegevens (achternaam Voornaam ID). De truc is dat ik moet een binaire zoekboom gebruiken om de achternamen op te slaan (ik heb dit gedaan) en te creëren binnen de eerste boom een ​​andere Binary zoekopdracht boom, die de eerste namen van de studenten en de ID (gedeeltelijk voltooid) opslaat. Het probleem is dat wanneer sommige studenten hebben dezelfde achternaam en verschillende voornaam ik moet een nieuw knooppunt voor de achternamen niet maken, maar ik moet de nieuwe studenten voornaam en id binnen een bestaande knooppunt van de laatste naam te zetten. Het zou moeten zijn: Cameron James 12131313

Andrew 17286378 (zijn achternaam is ook Cameron)

De code is:

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

In de belangrijkste i bellen met de loadData () om de studenten te importeren

  loadData(&temp);

En de loadData () is

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

Ik noem het add_node (), die een nieuw knooppunt in mijn main (achternamen) boom in te voegen. Dit alo werkt ..

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

Mijn probleem begint met (topname = add_node_nameANDid (topname, temp2);) wat een functon als add_node (), maar ze voegt nieuwe nameANDid knooppunten als de studenten hebben dezelfde familienaam .. Ik weet niet welke argumenten te gebruiken ... ik haat pointers, want ik ben niet ervaren met het gebruik ervan (niet nat tenminste) ... En de add_node_nameANDid () is

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

In add_node_nameANDid () heb ik geprobeerd om soortgelijke variabelen te gebruiken om gemakkelijker zijn om ze te begrijpen .. Hoe moet ik de wijzers in de add_node_nameANDid (), omdat toen ik copmpile hij het zegt [Waarschuwing] passeren arg 1 van `add_node_nameANDid' van onverenigbare pointer-type in lijn

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

of incompatibel type voor het argument 2 van `add_node_nameANDid'

 topname=add_node_nameANDid(topname,temp2);}

als ik bel de add_node_nameANDid () uit add_node ().

Kan behagen iemand me helpen met deze puinhoop?

De vraag is gesteld op 23/05/2011 om 09:57
bron van user
In andere talen...                            


1 antwoorden

stemmen
3

Het lijkt erop dat het probleem is dat je hebt gebruikt node *voor zowel van de structuren links en rechts. Dus wat er gebeurt is dat je het kopiëren van een struct nameANDidin een struct node. Ik stel voor dat nameANDidje nodig hebt nleften nrightpointers zijn struct nameANDid, niet struct node.

EDIT: Er zijn verschillende andere problemen, zoals ik denk dat het de bedoeling zou zijn om te kijken naar yohohoin struct knooppunt naar het binaire boom voornamen krijgen. Ook add_node_nameANDidis het instellen van temp->nleften temp->nrightnaar null, niet zeker of dit correct is.

antwoordde op 23/05/2011 om 10:12
bron van user

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