Binært søketre Hjelp med pekere mellom to Structures

stemmer
2

Jeg har et hjem arbeid som er nesten ferdig, men jeg har fast somewhere.I må advare at det er første gang jeg bruker pekere og alle disse rare ting så jeg er ganske vill. Min hensikt er å lese fra en txt studenter dataliste som (etternavn Navn ID). Trikset er at jeg må bruke en binært søketre for å lagre etternavn (jeg har gjort dette), og for å skape inne i første treet annet binært søketre som lagrer de første navnene på studentene og ID (delvis komplett). Problemet er at når noen student har samme etternavn og annet fornavn jeg må ikke opprette en ny node for etternavn, men jeg må sette de nye studentene fornavn og id inni en eksisterende node etternavn. Det bør være like: Cameron James 12131313

Andrew 17286378 (hans etternavn er også Cameron)

Koden er:

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

I hoved jeg kaller loadData () for å importere studentene

  loadData(&temp);

Og loadData () er

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

Jeg kaller add_node () som setter inn en ny node i min main (Etternavn) treet. Dette alo fungerer ..

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

Mitt problem starter med (topname = add_node_nameANDid (topname, temp2);) som er en functon som add_node (), men hun legger til nye nameANDid noder om studentene har samme etternavn .. Jeg vet ikke hva argumenter for å bruke ... jeg hater pekere fordi jeg ikke er erfaren med deres bruk (ikke våt minst) ... Og add_node_nameANDid () er

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

I add_node_nameANDid () jeg prøvde å bruke tilsvarende variabler for å være lettere å forstå dem .. Hvordan bør jeg bruke pekere i add_node_nameANDid () fordi når jeg copmpile det står det [Advarsel] bestått arg en av `add_node_nameANDid' fra uforenlige pekertype på linje

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

eller inkompatibel type for argument 2 av 'add_node_nameANDid'

 topname=add_node_nameANDid(topname,temp2);}

Når jeg kaller add_node_nameANDid () fra add_node ().

Kan ta noen hjelpe meg med dette rotet?

Publisert på 23/05/2011 klokken 08:57
kilden bruker
På andre språk...                            


1 svar

stemmer
3

Det ser ut som problemet er at du har brukt node *for begge strukturene venstre og høyre. Så det som skjer er at du skal kopiere en struct nameANDidtil en struct node. Jeg foreslår at nameANDiddu trenger nleftog nrightå være pekere til struct nameANDid, ikke struct node.

EDIT: Det finnes ulike andre problemer, slik som jeg tror intensjonen er å se inn yohohoi struct node for å få binærtreet på fornavn. Også add_node_nameANDidsetter temp->nleftog temp->nrighttil null, ikke sikker på at dette er riktig.

Svarte 23/05/2011 kl. 09:12
kilden bruker

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