【问题标题】:Delete a node from binary search tree in C从C中的二叉搜索树中删除一个节点
【发布时间】:2015-11-06 00:52:13
【问题描述】:

我正在尝试从二叉搜索树中删除一个节点。但是当我想测试该功能时,我会在“案例 3:两个孩子”中收到一条错误消息。

clist->name = temp->name;

此行会导致错误消息。它说:左操作数必须是左值。我是 C 和二叉搜索树的新手。我不知道,为什么这条线不起作用。我在互联网上找到了很多关于如何实现删除功能的想法。所有这些方法都使用这行代码。

以下是完整的功能。

(greaterThan、lessThan、toLowerCase 是我实现的辅助函数。它们肯定工作正常)

struct student {
    int ID;
    char name[20];
    struct student *left;
    struct student *right;
};

struct student * minValueNode(struct student* node) {
    struct student* current = node;
    while (current->left != NULL)
        current = current->left;

    return current;
}

struct student * bst_delete (struct student *clist, char* token, struct student **parent)
{

  if (clist == NULL)
      return clist;

  char* clistName = clist->name;
  char* tok = token;
  toLowerCase(clistName);
  toLowerCase(tok);

  if (lessThan(tok, clistName))
      clist->left = bst_delete(clist->left, token, &clist->left);

  else if (greaterThan(tok, clistName))
      clist->right = bst_delete(clist->right, token, &clist->right);

  else
  {
      //Case 1: No children
      if (clist->left == NULL && clist->right == NULL) {
          free(clist);
          clist = NULL;
      }
      //Case 2: One Child
      if (clist->left == NULL) {
          struct student *temp = clist;
          clist = clist->right;
          free(temp);
      } else if (clist->right == NULL) {
          struct student *temp = clist;
          clist = clist->left;
          free(temp);
      }
      //Case 3: Two Children
      else {
          struct student *temp = minValueNode(clist->right);
          clist->name = temp->name;
          clist->right = bst_delete(clist->right, temp->right, &clist->right);
      }

  }
  return clist;
}

如果有人能告诉我为什么这条线不起作用,那就太好了。以及如何解决此错误。

谢谢!

【问题讨论】:

    标签: c binary-search-tree lvalue lvalue-to-rvalue


    【解决方案1】:

    你不能通过直接赋值在 c 中复制一个数组,你真正想做的是复制数组的元素 - 因为你可以使用 strcpy -

    strcpy(clist->name, temp->name);
    

    或者由于大小是恒定的,使用稍微安全一点的-

    strncpy(clist->name, temp->name, 20);
    

    实际上你在这里很幸运,你可以为你的名字字符串使用指针(动态分配它们),这会使赋值有效的代码(尽管仍然没有按照你的意愿复制字符串内容,只是用其他)并允许代码编译,但会导致内存泄漏和节点之间共享指针 - 这将更难调试。

    在这种情况下,赋值中的右侧值可能会衰减为指针,但左侧值不能(因为该数组静态放置在结构内),因此编译器会抱怨左值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2016-02-18
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多