Bináris keresőfa Segítség mutató két Structures

szavazat
2

Van egy otthoni munka, amely majdnem kész, de én ragadt somewhere.I kell figyelmeztetni, hogy ez az első alkalom, én vagyok segítségével mutatókat és ezek mind furcsa dolgok így vagyok elveszett. Célom az, hogy olvasni egy txt diákok adatok listát (Név Név ID). A trükk az, hogy azt kell használni egy bináris keresési fa tárolja a vezetéknevek (ezt tettem), és olyan belső az első fát egy másik bináris keresési fa, amely tárolja az első a tanulók neve és azonosítója (Részben kész). A probléma az, hogy amikor néhány diák azonos eredetű és különböző utónév i ne hozzon létre egy új csomópont a vezetéknevű de azt kell tenni az új hallgatók első nevét és id belül meglévő csomópont utolsó név. Meg kell, mint: Cameron James 12131313

Andrew 17286378 (a családi is Cameron)

A kód:

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

A fő hívom a loadData () importálja a diákok

  loadData(&temp);

És loadData () függvény

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

Hívom a add_node (), amely be egy új csomópont a fő (családi) fa. Ez alo működik ..

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

A problémám kezdődik (topname = add_node_nameANDid (topname, Temp2)), amely egy functon mint add_node (), de hozzáteszi új nameANDid csomópontokat, ha a hallgatók azonos vezetéknév .. nem tudom, milyen érveket használni ... utálom mutatókat, mert én nem tapasztaltam a saját használatra (nem nedves legalább) ... És a add_node_nameANDid () függvény

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

A add_node_nameANDid () i igyekezett hasonló változókat, hogy könnyebb legyen megérteni őket .. Hogyan kell használni a mutatók a add_node_nameANDid (), mert amikor én copmpile ez azt mondja [Warning] elhaladó arg 1 `add_node_nameANDid” inkompatibilis mutató típus Sorban

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

vagy nem kompatibilis típusú argumentum 2 `add_node_nameANDid”

 topname=add_node_nameANDid(topname,temp2);}

mikor hívja a add_node_nameANDid () re add_node ().

Tud szíves valaki segítsen nekem ez a rendetlenség?

A kérdést 23/05/2011 09:57
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
3

Úgy tűnik, a probléma az, hogy már használt node *mind a struktúrák balra és jobbra. Tehát mi történik az, hogy másol struct nameANDidát struct node. Javaslom, hogy nameANDidszükség van nleft, és nrighthogy mutatókat struct nameANDidnem struct node.

EDIT: Vannak egyéb problémák, mint például azt hiszem, a szándék az lenne, hogy vizsgálja meg yohohoa struct csomópont, hogy a bináris fa első nevek. Szintén add_node_nameANDida beállítás temp->nleftés temp->nrighta nullnem biztos, hogy ez a helyes.

Válaszolt 23/05/2011 10:12
a forrás felhasználó

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