Binary Search Baum Hilfe mit Zeiger zwischen zwei Strukturen

stimmen
2

Ich habe eine zu Hause aus arbeiten, die fast fertig ist, aber ich stecken habe somewhere.I haben zu warnen, dass es das erste Mal ist, ich bin mit Zeigern und all diese seltsamen Dingen, so dass ich ziemlich bin verloren. Mein Ziel ist es aus einer txt Student Datenliste als (Vorname Nachname ID) zu lesen. Der Trick ist, dass ich einen binären Suchbaum zu verwenden, haben Sie die Namen zu speichern (Ich habe dies getan) und innerhalb des ersten Baumes eines anderen Binary Suchbaum zu erstellen, die die ersten Namen der Schüler speichern und die ID (teilweise abgeschlossen). Das Problem ist, dass, wenn einige Schüler die gleichen Nachnamen und andere Vornamen haben ich nicht einen neuen Knoten für die Familienname erstellen müssen, aber ich habe die neuen Studenten Vornamen und ID in einem vorhandenen Knoten des Nachnamens zu setzen. Es sollte sein wie: Cameron James 12131313

Andrew 17286378 (sein Nachname ist auch Cameron)

Der Code ist:

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

Im Haupt nenne ich das loaddata (), um die Studenten zu importieren

  loadData(&temp);

Und die loaddata () ist

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

Ich nenne die add_node (), die einen neuen Knoten in meinem Haupt (Nachnamen) Baum einfügen. Diese alo funktioniert ..

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

Mein Problem beginnt mit (topname = add_node_nameANDid (topname, TEMP2);), die eine functon wie add_node () ist, aber sie fügt neue nameANDid Knoten, wenn die Schüler den gleichen Nachnamen haben .. Ich weiß nicht, welche Argumente zu verwenden ... ich hasse Zeiger, weil ich nicht mit ihrem Einsatz erlebt habe (nicht nass zumindest) ... Und die add_node_nameANDid () ist

   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 () habe ich versucht, ähnliche Variablen zu verwenden, leichter zu sein, sie zu verstehen .. Wie soll ich die Zeiger in der add_node_nameANDid () verwenden, denn wenn ich es copmpile sagt, es [Warnung] Gang arg 1 von `add_node_nameANDid‘ von inkompatiblen Zeigertyp in der Reihe

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

oder inkompatiblen Typ für Argument 2 von `add_node_nameANDid‘

 topname=add_node_nameANDid(topname,temp2);}

wenn ich rufe die add_node_nameANDid () von add_node ().

Kann mit diesem Schlamassel mir bitte jemand helfen?

Veröffentlicht am 23/05/2011 um 09:57
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
3

Es sieht aus wie das Problem ist , dass Sie verwendet haben , node *für beide der Strukturen nach links und rechts. Also , was passiert ist , dass Sie eine kopieren struct nameANDidin ein struct node. Ich schlage vor , dass in die nameANDidSie benötigen nleftund nrightzu sein Zeiger auf struct nameANDid, nicht struct node.

EDIT: Es gibt verschiedene andere Probleme, wie ich glaube , die Absicht zu schauen wäre yohohoKnoten in struct den binären Baum von Vornamen zu erhalten. Auch add_node_nameANDidsetzt temp->nleftund temp->nrightan null, nicht sicher , ob dies richtig ist .

Beantwortet am 23/05/2011 um 10:12
quelle vom benutzer

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