Binarne drzewo poszukiwań Pomoc dla wskaźników między dwiema strukturami

głosy
2

Mam pracę do domu, który jest prawie gotowy, ale mam zatrzymany somewhere.I trzeba ostrzec, że jest to pierwszy raz używam wskazówki i wszystkie te dziwne rzeczy, więc jestem całkiem zagubiony. Moim celem jest, aby odczytać dane z listy studentów txt jako (nazwisko imię ID). Sztuką jest to, że muszę używać jedno wyszukiwanie binarne drzewo do przechowywania nazwiska (i zostało to zrobione) oraz stworzenie wewnątrz pierwszego drzewa inny drzewo binarne wyszukiwania, które przechowuje imiona uczniów i ID (częściowo kompletne). Problem polega na tym, że gdy jakiś uczeń mają to samo nazwisko i imię innego nie musi utworzyć nowy węzeł nazwisk, ale mam umieścić nowych studentów imię i identyfikator wewnątrz istniejącego węzła nazwiska. Powinno być tak: James Cameron 12131313

Andrew 17286378 (jego nazwisko jest również Cameron)

Kod jest:

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

W głównym nazywam loaddata (), aby importować studentów

  loadData(&temp);

A loaddata () jest

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

Wzywam add_node (), która wstawić nowy węzeł w moim głównym (nazwiska) drzewa. Ten alo działa ..

 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 problem zaczyna się (topname = add_node_nameANDid (topname, temp2);), która jest functon jak add_node (), ale dodaje nowe węzły nameANDid jeśli studenci mają to samo nazwisko .. Nie wiem, jakich argumentów użyć ... nienawidzę wskazówek, bo nie jestem doświadczony z ich użyciem (nie mokre co najmniej) ... A add_node_nameANDid () jest

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

W add_node_nameANDid () Próbuję użyć podobnych zmiennych będzie łatwiej je zrozumieć .. Jak stosować kursory w add_node_nameANDid (), ponieważ kiedy copmpile to mówi [Warning] przechodzącej argumentu 1 `add_node_nameANDid” z niekompatybilnego typu wskaźnika w kolejce

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

lub niezgodne typu dla argumentu 2 `add_node_nameANDid”

 topname=add_node_nameANDid(topname,temp2);}

kiedy wezwać add_node_nameANDid () z add_node ().

Może ktoś proszę mi pomóc z tego bałaganu?

Utwórz 23/05/2011 o 09:57
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
3

Wygląda na to, że problem jest, że użyłeś node *dla obu struktur lewo i prawo. Więc co się dzieje, jest to, że kopiujesz struct nameANDiddo struct node. I sugerują, że nameANDidtrzeba nlefti nrightbyć wskaźniki do struct nameANDidnie struct node.

EDIT: Są różne inne problemy, takie jak myślę intencją byłoby spojrzeć yohohow węźle struct uzyskać binarne drzewo imion. Także add_node_nameANDidjest ustawienie temp->nlefti temp->nrightdo null, nie wiem, to jest prawidłowe.

Odpowiedział 23/05/2011 o 10:12
źródło użytkownik

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