3

答えを探してみましたが、自分のものと一致するものが見つからないようです。私は学校用のテンプレート リンク リストを作成していますが、多くのエラーが発生しています。しかし、私は現時点で 1 つだけを助けたいと思っています。リンクされたリストの最後に要素を追加することになっていますが、次のようになります。

append(ListNode)

最初は、「よし、新しいノードを作成し、後ろに挿入する...」と思いましたが、読み返してみると、2 つのリンクされたリストを連結する別の関数を作成する必要があります。したがって、リンクされたリストに既に作成された要素を追加する必要があると思います。そうすれば、連結を行うときに、append を使用して 2 つを接続できます。または、少なくとも...これは私が考えているだけです..

だから最初に、私はした:

template<typename NODETYPE> 
bool List<NODETYPE>::append(NODETYPE &value)
{
    ListNode<NODETYPE> *newPtr = getNewNode(value); //creates new node

    if(isEmpty()) //checks if list is empty
    {
        firstPtr = lastPtr = newPtr;
        return true;
    }
    else //inserts new node at end of list
    {
        ListNode<NODETYPE> *tempPtr = lastPtr;

        tempPtr->nextPtr=newPtr;
        lastPtr = newPtr;
        return true;
    }
}

しかし、これは新しいノードを追加するだけなので、使用できません。作成済みのノードをアタッチする方法はありますか? たとえば、別のリンクされたリストを前のリストに追加しますか?

私の concat (検索した他のものとは異なり) は、リンクされたリストを 1 つだけ使用します。前のリンクされたリスト オブジェクトが関数を呼び出してから、リストをアタッチします。

concat(&List)

だから私はすべて混乱しています。どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

1

まず、append メソッドのシグネチャを変更して、ListNode*それが単一のノードであるかリンクされたリスト全体であるかに関係なく、渡されて追加されるようにする必要があります。その後、コードは次のようになります。

template<typename NODETYPE> 
bool List<NODETYPE>::append(ListNode<NODETYPE>* newPtr)
{
    //ListNode<NODETYPE> *newPtr = getNewNode(value); //creates new node

    if(isEmpty()) //checks if list is empty
    {
        firstPtr = lastPtr = newPtr;
        return true;
    }
    else //inserts new node at end of list
    {
        ListNode<NODETYPE> *tempPtr = lastPtr;

        tempPtr->nextPtr=newPtr;
        lastPtr = newPtr;
        while(lastPtr->nextPtr != NULL)
            lastPtr = lastPtr->nextPtr;
        return true;
    }
}

私はそれをコンパイルしていないので、いくつかのエラーがあるかもしれませんが、あなたはアイデアを得るでしょう.

于 2012-09-20T04:31:02.393 に答える
0

リストを適切に連結するための正確な手順は、特定の実装の詳細によって異なります。最も単純なケースは、単一リンクリストです。この場合、2番目のヘッドを古いテールにリンクするだけです。テールポインタがある場合は、それを更新することを忘れないでください。二重にリンクされたリストの場合は、2番目のヘッドを古いテールにもリンクする必要があります。また、センチナルノードを使用している場合は、それにも注意することを忘れないでください。

編集:これを無視して、私は混乱し、あなたが標準リストを使おうとしているのではないかと思いました。

C ++では、std::listはセンチネルノードとの二重リンクリストであり、連結が重要になります。さらに、とにかく内部を台無しにすることは想定されていません。標準のコンテナを使用する場合は、パブリックAPIに準拠する必要があります。そうしないと、BadStuffが発生します。幸いなことに、連結用のライブラリ関数があると確信しています。

于 2012-09-20T04:26:15.000 に答える
0

list2を連結してlist、list1と言うには、list2の先頭をlist1の最後のノードに接続し、lastPtrを次のように更新する必要があります。

//apart from checking for basic sanity like empty list and things 
// suppose argument passed is ListNode list2
        ListNode<NODETYPE> *tempPtr = lastPtr;

        tempPtr->nextPtr=list2;
        tempPtr = list2;
        while(tempPtr->next != NULL) {
              tempPtr = tempPtr->next;
        }
         lastPtr = tempPtr;

        return true;
于 2012-09-20T04:28:24.117 に答える