-1

構造に作用する目的でリンクされた構造をトラバースする場合 (つまり、簡単な例として単純なリンク リストにノードを挿入する場合)、構造にダブル ポインターをプッシュすることによって最適なアルゴリズムを取得します。単一の参照が使用されている場合、null ルートおよび/またはテール挿入の 1 つ以上の特殊なケースを記述する必要があります。

node_type **dp = &root;

while(*dp && /insertion point not reached/)
dp=&(*dp)->next;

ループから抜け出すと、*dp がリストへの挿入ポイントになります。オブジェクトのリンクへの参照を保持しています。この参照は、ルート、構造体の最後にある null オブジェクト、またはその他のノードに対するものである可能性があります。構造がより複雑になるにつれて、特殊なケースの必要性が指数関数的に増加する傾向があるため、二重参照の必要性がより顕著になります。

Visual Basic で二重参照を実装するにはどうすればよいですか?

注: リンクされたリストのビットは例としてのみ機能します... 私は知っています: その単純な問題を回避する方法はたくさんあります。

4

2 に答える 2

1

C# を許してください、私の VB.NET はかなり錆びています。C#/VB.NET で二重参照を安全に行う唯一の方法はref、メソッドへのパラメーターを使用することです。

using System;

namespace Test
{
    class Program
    {
        private static void Main(string[] args)
        {
            // Create an example root node. This example still works when root
            // is null.
            Node root = new Node() { next = new Node() };

            // Setup a Node that contains a pointer to root. This variable will
            // not be destroyed by iteration and rp.next will always be root
            // after iteration, even if root started as null.
            Node rp = new Node() { next = root };

            // Initialize the iterator to the root pointer.
            Node dp = rp;

            // Define a new node to be inserted for this example.
            Node nn1 = new Node();
            Node nn2 = new Node();

            // Iterate by calling DoWork until a null reference is returned.
            // Note that a reference to dp.next is passed to the method. This
            // allows the method to change what dp.next points to. The node to
            // insert is also given to the method. You could easily change this
            // second parameter to be an action that works on the desired node.
            while(null != (dp = DoWork(ref dp.next, nn1))) { }
            dp = rp;
            while(null != (dp = DoWork(ref dp.next, nn2))) { }

            // Force root to be assigned. If root did not start as null this
            // line is unnecessary.
            root = rp.next;
        }

        private static Node DoWork(ref Node node, Node nn)
        {
            // Logic to determine if the insertion point is not reached. For
            // this example the new node is always inserted just before the tail.
            bool logic = null != node && null != node.next;

            // Check node and logic. Return the node to continue iterating.
            if(null != node && logic)
            {
                return node;
            }

            // Insertion logic here. For the example the new node is inserted
            // into the linked list.
            nn.next = node;
            node = nn;

            // Return null to signify that iteration has completed.
            return null;
        }
    }

    [System.Diagnostics.DebuggerDisplay("{id} - {next}")]
    class Node
    {
        private static int sID;

        public int id;
        public Node next;

        public Node()
        {
            id = ++sID;
        }
    }
}
于 2013-05-02T19:49:57.090 に答える
-1

調査の結果、答えは次のようなものであると結論付けました。回答: 簡単です。運転しないでください。

ガベージ コレクション言語 (例: Visual Basic) では、収集された変数とそれへの参照を区別できません。二重参照が必要ですか? もちろんするよ!ガベージコレクションされた言語で取得する方法はありますか? いいえ... そんなことができたら、ガベージコレクターが壊れてしまいます。

まあ、魔法の答えがあることを願っていました...コーヒーをたくさん飲みますか?Visual Basic には "二重参照" のような動物は存在しないという事実を受け入れ、それを回避する方法を見つける必要があります。

スミス

于 2013-05-04T18:40:33.820 に答える