簡體   English   中英

從C中的二進制搜索樹中刪除節點

[英]Delete a node from binary search tree in C

我正在嘗試從二進制搜索樹中刪除節點。 但是,當我要測試該功能時,在“情況3:兩個孩子”中會收到一條錯誤消息。

clist->name = temp->name;

此行導致錯誤消息。 它說:左操作數必須是一個l值。 我是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中復制數組,您真正想要做的是復制數組的元素-為此,您可以使用strcpy-

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

或由於大小不變,請使用稍微安全些的-

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

實際上,您在這里很幸運,您可以為名稱字符串使用指針(動態分配它們),這將使該分配成為有效的代碼(盡管仍然無法按需復制字符串內容,只是將一個指針與另一個指針覆蓋)並且允許代碼進行編譯,但是這會導致您內存泄漏並在節點之間共享指針-這本來很難調試的。

在這種情況下,賦值中的右手值可能會衰減為指針,但左手值卻不能(由於該數組靜態放置在結構中),因此編譯器會抱怨l值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM