İki Yapıları arasında işaretçiler ile İkili Arama Ağacı Yardım

oy
2

Neredeyse yapılır bir ev iş var ama ben ben işaretçileri ve ben oldukça kayıbım bütün bu tuhaf şeyler kullanıyorum ilk defa olduğunu uyarmak zorunda somewhere.I sıkışmış. Amacım (Soyadı Adı kimliği) gibi bir txt öğrencilerin veri listesinden okumaktır. hüner i Soyadlarını saklamak için bir ikili arama ağacı kullanmak (Bu yaptım) ve birinci ağacın içinde öğrenci ve kimliği (Kısmen tam) ilk isimlerini saklayan başka İkili arama ağacı oluşturmak zorunda olmasıdır. Sorun bazı öğrenci aynı soyadı ve farklı ilk ada sahip olduğunda ben soyadı için yeni bir düğüm oluşturmak olmamalıdır ama soyadının varolan düğüm içinde yeni öğrencilere ad ve id koymak zorunda olmasıdır. Cameron James 12131313: Bu gibi olmalı

Andrew 17286378 (onun soyadı da Cameron)

kodudur:

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

Ana i LoadData çağrı () öğrencileri ithal etmek

  loadData(&temp);

Ve LoadData () 'dir

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

Benim ana (soyisimlerin) ağacında yeni bir düğüm eklemek add_node () diyoruz. Bu alo çalışır ..

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

Kullanmak ne argümanlar bilmiyorum .. Bir add_node gibi functon () olan ancak öğrencilerin aynı Soyadı varsa o yeni nameANDid düğümlerini ekler ...; Sorunum (topname = add_node_nameANDid (topname, ısı2)) ile başlar Ben onların kullanımı (ıslak değil en azından) ile deneyimli değilim çünkü işaretçiler nefret ... Ve add_node_nameANDid () 'dir

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

add_node_nameANDid () i Nasıl () add_node_nameANDid içinde işaretçileri kullanmalısınız .. onları anlamak daha kolay olması için benzer değişkenleri kullanmaya çalıştı ben onu copmpile zaman diyor çünkü uyumsuz işaretçi türünden add_node_nameANDid `arasında [Uyarı] geçen arg 1' Çizgide

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

ya da argümanı 2 için uyumlu tipi `add_node_nameANDid

 topname=add_node_nameANDid(topname,temp2);}

i) add_node den add_node_nameANDid () (çağrı zaman.

Birisi bu karmaşa bana yardımcı lütfen?

Oluştur 23/05/2011 saat 09:57
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
3

Sorun kullanmış olduğunuz gibi görünüyor node *sağ ve sol yapıların her ikisi için. Peki oluyor bir kopyalama olmasıdır struct nameANDidbir içine struct node. Bana göre, eğer içinde nameANDidsize gereken nleftve nrightişaretçileri olmak struct nameANDiddeğil, struct node.

DÜZENLEME: diğer çeşitli problemler ben niyeti içine bakmak olacağını düşünüyorum gibi, var yohohoilk isimlerden ikili ağaç almak için yapı düğümünde. Ayrıca add_node_nameANDidkuruyor temp->nleftve temp->nrighthiç nullbu doğrudur, emin değilim.

Cevap 23/05/2011 saat 10:12
kaynak kullanıcı

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