首页 文章

二进制搜索树,删除节点

提问于
浏览
0

我正在编写一个程序,如果你愿意,它会读入“学生记录”,然后根据数据将其分成4个二进制搜索树 . 我试图删除一个节点,但不是实际删除它,我只想在结构中设置一个标志,它基本上让我知道它已被“删除” . 这是我的代码,它给了我几个错误:

void deleteNode( TreeNodePtr *treePtr, SREC R, unsigned long key)/*ADD HOW*/
 {
    printf("I got into the delete function.\n");

     /*empty*/
    if(*treePtr != NULL)
    {
        if(R.SID<(*treePtr)->SID)/*Not empty*/
        {
            printf("less than\n");
            deleteNode((*treePtr)->leftPtr, R, key);
        }
        else if(R.SID>(*treePtr)->SID)
        {
            printf("more than.\n");
            deleteNode((*treePtr)->rightPtr, R, key);
        }
        else
        {
            treePtr->exists = 1;
            printf("Are we deleted yet?\n");
        }
    }
    else
    {
         fprintf(stderr,"Could not locate student with ID.\n");
    }
 }

错误是:注意:预期'struct treeNode **'但参数类型为'struct treeNode *'错误:'struct treeNode'没有名为'SID'的成员 . 我确信我只是遗漏了一些小东西,但我不知道它是什么 . 有任何想法吗?

2 回答

  • 0

    更改

    deleteNode((*treePtr)->leftPtr, R, key);
    

    deleteNode(&(*treePtr)->leftPtr, R, key);
    

    同样的权利 . 如果你真的希望函数采用 ** ,这是值得怀疑的 . 当你没有实际删除时, * 也可以正常工作 .

    对于第二个错误,您很可能在 struct treeNode 中有 SREC 类型的成员 . 您必须中缀该成员名称,例如 (*treePtr)->R.SID .

  • 1

    错误是:注意:预期'struct treeNode **'但参数类型为'struct treeNode *'错误:'struct treeNode'没有名为'SID'的成员

    这些错误意味着他们所说的 . deleteNode 的第一个参数是 TreeNodePtr * 类型,又名 struct treeNode ** ,但是你传递 (*treePtr)->leftPtr ,类型为 TreeNodePtr ,又名 struct treeNode * . 你引用(* treePtr) - > SID但是没有 struct treeNode 这样的成员 .

    您也应该收到错误

    treePtr->exists = 1;
    

    因为treePtr指向一个指向 struct treeNode 的指针,但是指针却向后倾斜't have members. And why is your 570199 flag called 570200 ? That' . 将其称为 deleted ,或将其设置为0并将其初始化为1.前者更好 .

    你的 key 参数是什么?你永远不会使用它 .

    假设 TreeNode 包含一个名为 RSREC 和一个 deleted 标志,这可能会有效:

    void markDeleted(TreeNode* pnode, SREC R)
    {
        if (pnode == NULL)
        {
            fprintf(stderr,"Could not locate student with ID.\n");
        }
        else if (R.SID < pnode->R.SID)
        {
            /* search left branch */
            markDeleted(pnode->leftPtr, R);
        }
        else if (R.SID > pnode->R.SID)
        {
            /* search right branch */
            markDeleted(pnode->rightPtr, R);
        }
        else
        {
            /* match */
            pnode->deleted = 1;
        }
    }
    

相关问题