【问题标题】:Binary Search Tree Help with pointers between two Structures二叉搜索树帮助与两个结构之间的指针
【发布时间】:2011-05-23 08:57:22
【问题描述】:

我有一个几乎完成的家庭作业,但我卡在某个地方。我必须警告这是我第一次使用指针和所有这些奇怪的东西,所以我很迷茫。我的目的是从 txt 学生数据列表中读取(姓氏 ID)。诀窍是我必须使用一个二叉搜索树来存储姓氏(我已经这样做了)并在第一棵树内创建另一个二叉搜索树来存储学生的名字和 ID(部分完成)。问题是,当一些学生有相同的姓氏和不同的名字时,我不能为姓氏创建新节点,但我必须将新学生的名字和 id 放在现有的姓氏节点中。它应该是这样的: 卡梅伦詹姆斯 12131313

Andrew 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() 是

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

我调用 add_node() 在我的主(姓氏)树中插入一个新节点。这也有效..

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

我的问题从 (topname=add_node_nameANDid(topname,temp2);) 开始,这是一个类似于 add_node() 的函数,但如果学生的姓氏相同,她会添加新的 nameANDid 节点。我不知道要使用什么参数...我讨厌指针,因为我没有使用它们的经验(至少不湿)... 而 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 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() 中,我尝试使用类似的变量来更容易理解它们。 我应该如何使用 add_node_nameANDid() 中的指针,因为当我编译它时它说 [警告] 从行中不兼容的指针类型传递 `add_node_nameANDid' 的 arg 1

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

或 `add_node_nameANDid' 的参数 2 的类型不兼容

 topname=add_node_nameANDid(topname,temp2);}

当我从 add_node() 调用 add_node_nameANDid() 时。

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

【问题讨论】:

    标签: c pointers binary-search-tree


    【解决方案1】:

    看起来问题在于您对左右两个结构都使用了node *。所以发生的事情是您将struct nameANDid 复制到struct node 中。我建议在nameANDid 中你需要nleftnright 指向struct nameANDid,而不是struct node

    编辑:还有其他各种问题,例如我认为目的是查看结构节点中的yohoho 以获取名字的二叉树。另外add_node_nameANDidtemp-&gt;nlefttemp-&gt;nright 设置为null,不确定这是否正确。

    【讨论】:

    • 谢谢!!!..确实在报告窗口中删除了很多行但是你知道我应该如何从 add_node() 调用 add_node_nameANDid() ..它仍然说“当我调用 topname=add_node_nameANDid(topname,temp2); 时,“add_node_nameANDid”的参数 2 的类型不兼容;
    • 我听从你的建议和“topname=add_node_nameANDid(topname,&temp->yohoho);”成功了!!!!!!...祝福你!!!!!!!!!!!!!!!!!!!!!!!!!!!
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 2023-03-09
    • 2020-03-18
    • 2017-03-15
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多