二进制搜索树,删除节点

时间:2013-04-05 22:01:17

标签: c binary-search-tree

如果您愿意,我正在编写一个读取“学生记录”的程序,然后根据数据将其分成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 :(得分:1)

更改

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

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

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

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

答案 1 :(得分:0)

  

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

这些错误意味着他们所说的。 deleteNode的第一个参数属于TreeNodePtr *类型,又称struct treeNode **,但您传递的是(*treePtr)->leftPtr,其类型为TreeNodePtr,即{{1} }}。你引用(* treePtr) - &gt; SID但是struct treeNode *没有这样的成员。

您还应该收到错误

struct treeNode

因为treePtr指向指针指向treePtr->exists = 1; ,但指针没有成员。为什么你的“删除”标志被称为“存在”?那是倒退。将其称为struct treeNode,或将其设置为0并将其初始化为1.前者更好。

你的deleted参数是什么?你从不使用它。

假设key包含名为TreeNode的{​​{1}}和SREC标记,这可能会有效:

R