Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二叉搜索树帮助在两个结构之间使用指针_C_Pointers_Binary Search Tree - Fatal编程技术网

C 二叉搜索树帮助在两个结构之间使用指针

C 二叉搜索树帮助在两个结构之间使用指针,c,pointers,binary-search-tree,C,Pointers,Binary Search Tree,我的家庭作业快做完了,但我却陷入了困境。我不得不警告说,这是我第一次使用指针和所有这些奇怪的东西,所以我很迷茫。我的目的是从txt学生数据列表中读取为(姓氏名称ID)。诀窍是,我必须使用一个二元搜索树来存储姓氏(我已经这样做了),并在第一个树中创建另一个二元搜索树来存储学生的名字和ID(部分完成)。问题是,当一些学生有相同的姓氏和不同的名字时,我不能为姓氏创建新节点,但我必须将新学生的名字和id放在姓氏的现有节点中。应该是这样的: 卡梅隆·詹姆斯12131313 安德鲁17286378(他也姓卡

我的家庭作业快做完了,但我却陷入了困境。我不得不警告说,这是我第一次使用指针和所有这些奇怪的东西,所以我很迷茫。我的目的是从txt学生数据列表中读取为(姓氏名称ID)。诀窍是,我必须使用一个二元搜索树来存储姓氏(我已经这样做了),并在第一个树中创建另一个二元搜索树来存储学生的名字和ID(部分完成)。问题是,当一些学生有相同的姓氏和不同的名字时,我不能为姓氏创建新节点,但我必须将新学生的名字和id放在姓氏的现有节点中。应该是这样的: 卡梅隆·詹姆斯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(&temp);
loadData()是

“add_node_nameANDid”的参数2的类型或不兼容

 topname=add_node_nameANDid(topname,temp2);}
当我从add_node()调用add_node_nameANDid()时


有人能帮我解决这个问题吗?

看起来问题在于您对左右结构都使用了
node*
。因此,所发生的情况是,您正在将一个
struct name和id
复制到一个
struct节点中。我建议在
nameANDid
中,您需要
nleft
nright
作为指向
struct nameANDid
的指针,而不是
struct node


编辑:还有其他各种问题,比如我想我们的目的是在struct节点中查看
yohoho
,以获得名字的二叉树。另外,
add_node\u name和id
正在将
temp->nleft
temp->nright
设置为
null
,不确定这是否正确。

谢谢!!!。。这确实在报告窗口中删除了很多行,但是你知道我应该如何从add_node()调用add_node_nameANDid()。当我调用topname=add_node_nameANDid(topname,temp2)时,它仍然说“add_node_nameANDid”的参数2的不兼容类型”;我听从你的建议,“topname=add_node_nameANDid(topname,&temp->yohoho);”成功了!!!!。。。好好祝福你!!!!!!!!!!!!!!!!!!!!!!!!!!
 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;
  }   
   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;
     }
 topname->nleft=add_node_nameANDid(topname->nleft,temp);}(in add_node_nameANDid())
 topname=add_node_nameANDid(topname,temp2);}