Binární vyhledávací strom Pomoc s ukazateli mezi dvěma konstrukcí

hlasů
2

Mám domácí práce, která je skoro hotový, ale já jsem uvízl somewhere.I varovat, že je to poprvé, co jsem pomocí ukazatelů a všechny tyto podivné věci, takže jsem docela ztratil. Mým cílem je číst ze seznamu txt studenti dat as (příjmení jméno ID). Trik je v tom, že musím použít jeden strom binárního vyhledávání uložit příjmení (i to udělal), a vytvořit uvnitř prvního stromu další binární vyhledávací strom, který ukládá první jména studentů a ID (nedokončená). Problém je v tom, že když někteří studenti mají stejné příjmení a jiné křestní jméno i nesmí vytvořit nový uzel pro příjmení, ale musím dát nové studenty křestní jméno a číslo uvnitř stávajícího uzlu příjmení. To by mělo být takto: Cameron James 12131313

Andrew 17286378 (jeho příjmení je také Cameron)

Kód je:

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

V hlavní i volat loadData () dovážet studenty

  loadData(&temp);

A loadData () je

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

Zavolám add_node (), která vložit nový uzel ve svém hlavním (příjmení) stromu. To alo funguje ..

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

Můj problém začíná (topname = add_node_nameANDid (topname, temp2);), což je functon jako add_node (), ale přidává nové nameANDid uzly v případě, že studenti mají stejné příjmení .. Nevím, jaké argumenty použít ... nenávidím odkazy, protože nejsem zkušenosti s jejich použitím (ne mokrý minimálně) ... A add_node_nameANDid () je

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

V add_node_nameANDid () Snažil jsem se používají podobné proměnné být snadnější rozumět .. Jak bych měl použít ukazatele v add_node_nameANDid (), protože když jsem ji copmpile říká [Výstraha] absolvování arg 1 `add_node_nameANDid‘ od nekompatibilních ukazatel typu v souladu

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

nebo nekompatibilní typ argumentu 2 `add_node_nameANDid‘

 topname=add_node_nameANDid(topname,temp2);}

když jsem volat add_node_nameANDid () z add_node ().

Může prosím někdo pomoci mne s tímto nepořádek?

Položena 23/05/2011 v 09:57
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
3

Vypadá to, že problém je, že jste použili node *pro obě struktury vlevo a vpravo. Takže to, co se děje, je, že kopírujete struct nameANDiddo struct node. Domnívám se, že v nameANDidpotřebujete nlefta nrightbýt ukazatele na struct nameANDidne struct node.

EDIT: Existují různé další problémy, jako je Myslím, že záměrem bude, aby se zabývala yohohov struct uzlu získat binární strom křestních jmen. Také add_node_nameANDidje nastavení temp->nlefta temp->nrightna nullne jistý, že to je správné.

Odpovězeno 23/05/2011 v 10:12
zdroj uživatelem

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