0

2 つのリンクされたリスト L1 と L2 を比較し、等しい要素を比較するアルゴリズムがあります。L2 から削除しながら、それらを 3 番目のリスト L3 に入れます。これがアルゴリズムが行うべきことのすべてであるかどうかはわかりませんが、たとえば「p1prec」などのいくつかの概念を理解していません。アルゴリズムの合理的な設計、全体像を知りたい。指示を一つ一つ調べて感覚を掴もうとすると、覚えようとしているような気がします。同様のアルゴリズムを設計する方法についてのアドバイスも大歓迎です。アルゴリズムは次のとおりです。

    Equal(L1,L2)

    head[L3] = NIL            //L3 is empty
    if head[L2] = NIL         //if there are no elements in L2 return NIL
       return L3
    p1 = head[L1]             //p1 points the head of L1
    p1prec = nil              //p1prec is supposed to be precedent I guess.
    while p1 =/= nil
          p2 = head[L2]       //p2 points head of L2
          p2prec = nil        //p2prec is precedent of p2; first cycle is nil
          while p2 =/= nil and key[p1] =/= key[p2]
                p2prec = p2          // pass p2 and p2prec through L2 until
                p2 = next[p2]        // key[p1] = key[p2]
          if p2 =/= nil        // if two elements are found equal
                next[p1prec] = next[p1]          // im not sure what this does
                insert(L3,p1)                    // insert the element in L3
                p1 = next[p1prec]                //neither this,
                next[p2prec] = next[p2]  //connects the p2prec with nextp2 because p2
                free(p2)                         //is going to be deleted
          p1prec = p1      //moves through L1, if no element of p2 is found          
          p1 = next[p1]                         //equal with first element of p1
4

2 に答える 2

1

あなたの目標はこの問題を解決する方法を理解することだと思うので、各行が何をするかを説明する代わりに、基本的なアルゴリズムを説明しようと思います。

L1 と L2 の 2 つのリストがあります。

基本的に、L1 の各要素を L2 の各要素でチェックします。L1current と L2current をチェックする値とします。

L2 要素を削除するときは、次の要素と prec をリンクする必要があるため、L2Prec も必要です。

You start with L1current = L1 and L2current = L2;
While ( L1current is not NULL)
{
    L2current = L2; // you set the L2Current to the begging of L2 list.
    While ( L2current is not NULL) // you run untill the end.
    {
        You check if L1current == L2current;
        {
            // If they are equal
            You add the L2 element to L3;
            You connect L2prec with L2next;
            You delete L2current;
        }
        Else
        {
                L2current = L2next;
        }
    }
       L1current = L1next; // after you are done with the first element of L1 you
                          // move to the next one.
}
于 2013-10-22T16:39:09.133 に答える