0

リンク リストのマージ実装があります。Node* headList 型の 2 つのパラメーターを受け取ります。これは、ポインターと a および a で構成される構造体をNode含むクラスです。私が抱えている問題は、私の実装がノードを適切にリンクしていないか、単に間違っていることです。必要なことは、リスト 1 がリスト 2 とリスト 3 のノードの組み合わせになることです。ポインター操作でこれを行う必要があり、新しいメモリ割り当ては必要ないため、list2 と list3 が変更されます。これが私が今持っているものです:typename T dataNode* nextlist1.merge(list2, list3);

template <typename T>
void List<T>::merge(List& list1, List& list2) {

typename List<T>::Node* list1Ptr = list1.head;
typename List<T>::Node* list2Ptr = list2.head;

for(;;) {
    if (list1Ptr == NULL && list2Ptr != NULL) {
        list1Ptr = list2Ptr->next;
        head = list1.head;
        break;
    }
    else if (list2Ptr == NULL && list1Ptr != NULL) {
        list2Ptr = list1Ptr->next;
        head = list1.head;
        break;
    }
    else if (list1Ptr == NULL && list2Ptr == NULL) {
        head = list1.head;
        break;
    }
    else if (list1Ptr != NULL && list2Ptr != NULL) {

        if (list1Ptr->data > list2Ptr->data){
            typename List<T>::Node* temp;
            temp = list2Ptr->next;
            list1Ptr->next = list1Ptr;
            list2Ptr = temp;
        }
        else if (list1Ptr->data < list2Ptr->data) {
            typename List<T>::Node* temp;
            temp = list1Ptr->next;
            list1Ptr->next = list2Ptr;
            list1Ptr = temp;
        }
        else if (list1Ptr->data == list2Ptr->data) {
            list1Ptr = list1Ptr->next;
        }
    }
}
}

ノードに含まれるデータは、提供されたクラス型であり、必要なオーバーロードされた適切な演算子がすべて含まれています。main がスコープ外になり、残りの部分に対してデストラクタが呼び出されるまで、コード全体は問題なく実行されますDebug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

どうすればいいのか本当によくわかりません。何度も引き出してみましたが、すべてが理にかなっているように思えます。誰かが私を正しい方向に導くためのヒントを持っているなら、私はそれを大いに感謝します. 見てくれてありがとう!

4

2 に答える 2

1

まず、ここに何か問題があります。

    if (list1Ptr == NULL && list2Ptr != NULL) {
        list1Ptr = list2Ptr;
        head = list1.head;
        break;
    }

list1 のトラバースが完了したら、list1 の最後のノードが list2 を指すようにします。 list1Ptr = list2Ptr;
それは何もしていません。ローカル変数の値を変更しているだけです。
この部分も同じです:

    else if (list2Ptr == NULL && list1Ptr != NULL) {
        list2Ptr = list1Ptr;
        head = list1.head;
        break;
    }

これは悪いことです:
list1Ptr->data > list2Ptr->data && list1Ptr != NULL && list2Ptr != NULL
list1Ptr が NULL になった場合、NULL->data にアクセスしようとすると、必ず問題が発生します (通常、式は左から右に実行されるため)。
また:

        else if (list1Ptr->data > list2Ptr->data && list1Ptr != NULL 
             && list2Ptr != NULL) {
        typename List<T>::Node* temp = list2Ptr;
        list2Ptr = list2Ptr->next;
        temp->next = list1Ptr;
        }

ここにも本当に問題があります。最初に list2ptr を一時的に保存します。次に、list2ptr を list2 の次のノードに移動します。しかし、なぜ作るのtemp->next = list1ptrですか?
あなたはその部分を考え直すべきです。次のelseブロックも同様です。
一番。
編集:
さて、さらに何ができるか見てみましょう:
これは、使用することをお勧めする疑似コードです:

func(list1,list2):
ptr1 = list1.head
ptr2 = list2.head
declare pointer curr
if(ptr1!= NULL and ptr2!=NULL){
    if(ptr1->data < prt2->data)
    {curr = ptr1
    ptr1 = ptr1->next
    head = curr
    }
    else{
    curr = ptr2
    ptr1 = ptr2->next
    head = curr}}
else{
    head = whichever one is not NULL, or NULL if both of them are and return
    }
while(ptr1 != NULL and ptr2!=NULL){
    if(ptr1->data < ptr2->data){
    curr->next = ptr1
    curr = ptr1
    ptr1 = ptr1->next
    continue}
    else{
    curr->next = ptr2
    curr = ptr2
    ptr2 = ptr2->next
    continue}
}
if(ptr1 == NULL)
    curr->next = ptr2
else
    curr->next = ptr1
于 2013-10-27T18:22:16.557 に答える
1

これは期待どおりに機能しません:

list1Ptr->data > list2Ptr->data && list1Ptr != NULL 
             && list2Ptr != NULL

逆参照する前に、ポインターが NULL かどうかを確認する必要があります。そうしないと、未定義の動作が発生します。(つまり、何でも起こり得るということです。非常に悪いことです。) また、NULL の代わりに nullptr を使用する必要があります。

ただし、他の条件ですべての NULL ケースを確認したため、これはエラー メッセージの原因ではありません。

あなたの問題はおそらく asalic が示唆したとおりです。コメントが必要な場合は、残りのコードを見せてください。

于 2013-10-27T18:08:39.397 に答える