Помощь в бинарном дереве поиска с указателями между двумя структурами

#c #pointers #binary-search-tree

#c #указатели #двоичное дерево поиска

Вопрос:

У меня есть домашняя работа, которая почти выполнена, но я где-то застрял.Я должен предупредить, что это первый раз, когда я использую указатели и все эти странные вещи, поэтому я довольно растерян. Моя цель — прочитать список данных учащихся в текстовом формате как (Идентификатор фамилии). Хитрость в том, что я должен использовать одно бинарное дерево поиска для хранения фамилий (я сделал это) и создать внутри первого дерева другое бинарное дерево поиска, в котором хранятся имена студентов и идентификатор (частично заполненный). Проблема в том, что, когда у какого-либо учащегося одинаковая фамилия и другое имя, я не должен создавать новый узел для фамилий, но я должен поместить имя и идентификатор нового учащегося в существующий узел с фамилией. Это должно быть похоже на: Cameron James 12131313

Эндрю 17286378 (его фамилия также Кэмерон)

Код является:

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

В основном я вызываю loadData () для импорта студентов

   loadData(amp;temp);
  

И loadData() является

 void loadData(struct node *temp){      
int i;
FILE *fp;
fp=fopen(FILENAME,"r");
if (fp == NULL) printf("File does not existn");
for (i=0; i<20; i  ){       
    fscanf(fp,"%s",amp;temp->last);
    fscanf(fp,"%s",amp;temp->yohoho.first);
    fscanf(fp,"%d",amp;temp->yohoho.ID);     
    top=add_node(top,temp);
    }
fclose(fp);
printf("nnFile loadedn");  
}
  

Я вызываю add_node (), который вставляет новый узел в мое основное дерево (фамилии). Это alo работает..

  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 failedn");
      return NULL;}
   else {      
     //printf("Node addedn");
     return newNode;}
   }
   else {   
      if (stricmp(temp->last,top->last) < 0){
         // printf("leftn");
        top->left=add_node(top->left,temp);}
      else if (stricmp(temp->last,top->last) == 0){
        // printf("Last names are equaln"); 
        topname=add_node_nameANDid(topname,temp2);} //Here is one of my problems
      else {
        // printf("rightn");
        top->right=add_node(top->right,temp);}
        // printf("Node addedn");   
        return top;
       } 
      return NULL;
  }   
  

Моя проблема начинается с (topname=add_node_nameANDid(topname, temp2);), которая является функцией, подобной add_node(), но она добавляет новые узлы nameANDid, если у студентов одинаковая фамилия.. Я не знаю, какие аргументы использовать…Я ненавижу указатели, потому что у меня нет опыта их использования (по крайней мере, не wet)…
И add_node_nameANDid() является

    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 failedn");
       return NULL;}
    else {      
      //printf("Node addedn");
      return newNode_nameANDid;}
    }
    else {   
        if (stricmp(temp->first,topname->first) <= 0){
           // printf("leftnamen");
           topname->nleft=add_node_nameANDid(topname->nleft,temp);}
        else {
           // printf("rightnamen");
           topname->nright=add_node_nameANDid(topname->nright,temp);}
          // printf("Node addedn");   
          return topname;
        } 
        return NULL;
     }
  

В add_node_nameANDid() я попытался использовать похожие переменные, чтобы их было легче понять..
Как я должен использовать указатели в add_node_nameANDid(), потому что, когда я копирую его, он говорит
[Предупреждение] передача аргумента 1 `add_node_nameANDid’ из несовместимого типа указателя в строке

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

или несовместимый тип для аргумента 2 `add_node_nameANDid’

  topname=add_node_nameANDid(topname,temp2);}
  

когда я вызываю add_node_nameANDid() из add_node().

Может, пожалуйста, кто-нибудь помочь мне с этим беспорядком?

Ответ №1:

Похоже, проблема в том, что вы использовали node * для обеих структур left и right. Итак, что происходит, так это то, что вы копируете struct nameANDid в struct node . Я предполагаю, что в nameANDid вам нужно nleft , чтобы nright и struct nameANDid были указателями на struct node , а не на ,,.

РЕДАКТИРОВАТЬ: Существуют различные другие проблемы, такие как, я думаю, намерение состояло бы в том, чтобы изучить yohoho в struct node, чтобы получить двоичное дерево имен. Также add_node_nameANDid устанавливается temp->nleft и temp->nright на null , не уверен, что это правильно.

Комментарии:

1. Спасибо !!! .. это, конечно, убирает много строк в окне отчета, но есть ли у вас какие-либо идеи, как я должен вызвать add_node_nameANDid() из add_node().. Он по-прежнему говорит «несовместимый тип для аргумента 2 `add_node_nameANDid», когда я вызываю topname=add_node_nameANDid(topname, temp2);

2. Я следую вашему совету и «topname=add_node_nameANDid(topname,amp;temp-> йохохо);» это сработало !!!!… Благослови вас господь!!!!!!!!!!!!!!!!!!!!!!!!!!