代码之家  ›  专栏  ›  技术社区  ›  Idan

C-参考问题中的链表和红/黑树?

  •  0
  • Idan  · 技术社区  · 16 年前

    我对C很陌生,我想了解一些基本的东西。

    我想实现一个rbtree和一个链表,所以我创建:

    public class RBTreeNode
    {
            // PROPERTIES
            public RBTreeNode left;
            public RBTreeNode right;
            public RBTreeNode parent;
            public String Color;
            public Int Key;
    } 
    
    List<RBTreeNode> deleteList = new List<RBTreeNode>();
    

    在我的程序运行期间,我遍历树,获取一些节点(取决于值),并将它们添加到删除列表中。

    我无法决定的是,如果我有Rbtreenode X,我会这样做。 左=空。我想发生的事情是使x的左子代无效(不影响x.Left RbTreeNode,但我认为这里会发生的是,实际上x.Left将变为空,但x.Left RbTreeNode对象也将变为空。这不是我想要的。(如果复制到删除列表,它将变为空,这是错误的)

    我希望能够用指针做同样的事情。 在C++中,我可能会这样做:

    public class RBTreeNode
    {
            // PROPERTIES
            public RBTreeNode* left;
            public RBTreeNode* right;
            public RBTreeNode* parent;
            public std::string Color;
            public int Key;
    } 
    

    例如:

    RBTreeNode* tenp = X->left;
    X->left = null; //(i think in c# it will turn temp here to null to - of course without   pointers)
    temp->right = &X;
    

    有什么建议/解释吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Jon Skeet    16 年前

    不,你没事。 X.left 只是一个变量。将它设置为空,只需将该变量的值设置为空,它对它以前引用的对象不做任何操作。

    真的没有这样的概念 对象 在C中为空。

    我有一篇关于 value and reference types in C# 你会发现有用的。

        2
  •  0
  •   user262976    16 年前

    属性是引用,因此基础内容不会被更改。您可以使用一个临时变量,类似于C++版本(除了当然没有指针)。