Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Динамич структуры, указатели в С#


Автор: GRIENDERS 15.5.2007, 19:15
В управляемом С++ есть вот такая фишка для создания бинарных деревьев, очередей, узлов и прочей лабуды


Код

struct Node
{
public:
    int value;
    Node* left;
    Node* right;
    Node(int value, Node* left, Node* right)
    {
        this->value = value;
        this->left = left;
        this->right = right;
    }
};


или так


   
Код

 Node *MainForm::search_insert(Node *Root, int val)
        {
            Node* pv = Root, *prev;
            bool found = false;
            while(pv && !found)
            {
                prev = pv;
                if (val == pv->value) found = true;
                else if (val < pv->value) pv = pv->left;
                else pv = pv->right;
            }
            if (found) return pv;
            Node* pnew = new Node(val, 0, 0);
            if (val < prev->value)
                prev->left = pnew;
            else
                prev->right = pnew;
            return pnew;
        }


или вот так


    
Код

void MainForm::DeleteTreeNode(const int &item)
    {
        Node *DNodePtr,
             *PNodePtr,
             *RNodePtr;
        if ((DNodePtr = FindNode(item,PNodePtr))==0)
        {
            return;
        }
        if (DNodePtr->right == 0)
            RNodePtr = DNodePtr->left;
        else if (DNodePtr->left == 0)
            RNodePtr = DNodePtr->right;
        else
        {
            Node *PofRNodePtr = DNodePtr;
            RNodePtr = DNodePtr->left;
            while (RNodePtr->right)
            {
                PofRNodePtr = RNodePtr;
                RNodePtr = RNodePtr->right;
            }
            if (PofRNodePtr == DNodePtr)
                RNodePtr->right = DNodePtr->right;
            else 
                PofRNodePtr->right = RNodePtr->left;
        }
        if (RNodePtr == 0)
            Root = RNodePtr;
        else if (DNodePtr->value < 
            PNodePtr->value)
            PNodePtr->left= RNodePtr;
        else PNodePtr->right = RNodePtr;
            delete DNodePtr;
    }


И в том же дуже...
Как это переделать на C#? Особенно 1-ый код.

Автор: Void 15.5.2007, 19:30
Код
class Node
{
    public int value;
    
    public Node left, right;
    
    public Node(int value, Node left, Node right)
    {
        this.value = value;
        this.left = left;
        this.right = right;
    }
}

В данном контексте можно спокойно приравнять указатели C++ и ссылки в C#. Любой класс в C#, напомню, является ссылочным типом.

Автор: GRIENDERS 15.5.2007, 20:50
А почему это не работает?
 
Код

struct Node
    {
        public int value;

        public Node left, right;

        public Node(int value, Node left, Node right)
        {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }

Автор: archeg 15.5.2007, 21:31
Цитата(GRIENDERS)

А почему это не работает?

Код


struct Node
    {
        public int value;

        public Node left, right;

        public Node(int value, Node left, Node right)
        {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }



Цитата(Void @  15.5.2007,  19:30 Найти цитируемый пост)
Любой класс в C#, напомню, является ссылочным типом. 

Класс, но не структура. struct  - valuable тип а не reference

Впрочем в С# есть очень много класов - списки, очередя, словари, и самому писать их необязательно (List<>, Queue<>, Dictionary<> и др ....)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)