【问题标题】:binaryTree insert and remove - CbinaryTree 插入和删除 - C
【发布时间】:2015-10-18 03:39:33
【问题描述】:

我已经用教程完成了插入节点和删除树。我测试了它,它工作正常。但是我不明白为什么我需要在插入中通过引用来传递根,而在 deleteAll 中只是指针。因为我认为只传递指针它是一个值引用,然后每次更改都只能在函数中看到。

typedef struct node{
    int element;
    struct node *left;
    struct node *right;
}*tTree;

void insert(tTree *myTree, int element){
  if(*myTree == NULL){
    myTree= (tTree)malloc(sizeof(*myTree));
    myTree->element = element;
    myTree->left = NULL;
    myTree->right = NULL;   
  }
  else{
    int treeElement = (*myTree)->element;
    if( treeElement > element){
      insert(&(*myTree)->left, element);
    }
    else{
      insert(&(*myTree)->right, element);
    }
  }
}



void deleteAll(tTree myTree){
    if(myTree != NULL){
        deleteAll(myTree->right);
        deleteAll(myTree->left);
        free(myTree);
    }
}

int size(tTree myTree){
    if (myTree != NULL){
        return 1 + size(myTree->right) + size(myTree->left);    
    }
    else
        return 0;
}

int main(){

  tTree root = NULL;
  insert(&root,3);
  insert(&root,2);
  insert(&root,4);
  insert(&root,1);
  printf("Number of nodes: %d\n",size(root));   
  deleteAll(root);
    root = NULL;
  printf("Number of nodes: %d\n",size(root));   
  return 1;
}

【问题讨论】:

  • 很简单,通过签名函数,insert接收到结构体的指针,而delete只得到结构体。我建议阅读指针算法及其在每种情况下的使用
  • 其他不好的做法在 C 中是新的,因为你混合了 POO 和结构化编程
  • 这是变量名。
  • @Joseph,'new' 是 C++ 中的关键字。为避免混淆(如果您使用支持 C++ 的编译器,则会出现编译/运行时问题),请勿在针对另一种语言的程序中误用一种语言的关键字名称
  • 现在我明白了:您对其进行了编辑。以new 作为变量名的原始版本似乎是正确的。指针转换弊大于利。

标签: c insert binary-tree removeall


【解决方案1】:

删除只需要它执行的语句的指针。它没有将任何信息传递回调用函数。但是,如果需要,您的插入函数会分配,在这种情况下,必须将分配的指针传回给调用者。

【讨论】:

  • typedef struct node{ int element; struct node *left; struct node *right; }*tTree; 你能解释一下*tTree 部分吗?这种语法对我来说是新的
  • 我认为这是原因,但我不确定。所以,像删除一样只需要释放内存,它只传递指针是正确的。谢谢!
  • *tTree 很少见,最好的做法是 typedef struct { fields of structs }name_structs; name_structs *str;
  • 这和说的一样:typedef struct node *tTree。所以现在你可以使用 tTree 作为 struct node * 的别名。结构节点 * 变量 = tTree 变量
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2010-11-25
相关资源
最近更新 更多