2017-10-25 15 views
0

マージI持っ2つの片方向リンクリストのヘッドノード無し(ヘッドノードなし)2つの片方向リンクリスト

LIST 1:[X1-> X2 - > .....-> XN]

LIST 2:[Y1-> Y2 - > ......-> YM]

マージ後:

IF(N <メートル)

LIST 1:[X1-> y1-> x2-> y2-> .....-> xn-> yn-> Y(N + 1) - > ....-> YM]他

LIST 1:[X1-> Y1-> x2-> Y2 - > .....- > XM-> YM-> X(M + 1) - > ....-> XN]

ここに私のマージ機能です:

void merge(NODE *list1, NODE *list2) 
{ 
    NODE *ptr1 = list1; 
    NODE *ptr2 = list2; 

    while(1) 
    { 
     if(ptr2 == NULL) 
      break; 

     if(ptr1->next == NULL) 
     { 
      ptr1->next = ptr2; 
      display(list1); 

      while(list2 != NULL) 
       list2 = list2->next; 

      break; 
     } 

     list2 = list2->next; 

     ptr2->next = ptr1->next; 
     ptr1->next = ptr2; 

     ptr2 = list2; 
     ptr1 = (ptr1->next)->next; 

     display(list1); 
    } 
} 

しかし、主な機能でそれを実行した後、LIST 2は、空であったはずですが、そうではありません。

LIST 1:[1-> 2-> 3]

LIST 2:たとえば

[5-> 6> 7]

マージ後:

リスト1:[1-> 5-> 2-> 6-> 3-> 7]

リスト2:[5-> 2-> 6-> 3-> 7]空)

説明してください!

編集:

サンプル出力:

---------- [リスト1] ----------

入力してください要素(-123が終了する):1

[一覧:1]

入力要素(-123は終了する):2

[LIST:1 2]

要素(終了し-123)を入力:-123

---------- [リスト2] ------ ----

要素を入力し(-123が終了する):5

[一覧:5]

要素を入力し(-123は終了する):6

[LIST:5,6]

要素(終了し-123)を入力:7

[LIST:5 6 7]:8

要素(終了する-123)を入力し

[LIST:5 6 7 8]

要素(終了する-123)を入力:-123

[LIST:1 5 2]

[LIST:1 5 2 6 7 8]

---------- [MFCリスト] ----------

[LIST:1 5 2 6 7 8]

[LIST:5 2 6 7 8]

+5

してください[編集]あなたの質問と[MCVE]を提供する –

+0

あなたは "リスト2"が空でなければならないと思いますか? – UnholySheep

答えて

1

LIST2を空にするための理由はありません:

リスト2は、文字通りリスト、最初の要素へ単にポインタでありませんマージ後は完全リストの2番目の要素になります。

メモリには、最初の要素を指すポインタlist1と2番目の要素を指すポインタlist2を持つ単一のリスト[1->5->2-> 6-> 3-> 7]があります。したがって

、あなたはlist2を印刷するとき、それは5つの

+0

しかし、whileループの各反復で次のノードを指すようにリスト2をインクリメントしました。最後の反復後にNULLを指していませんか? –

+0

ポインタは値によってマージ関数に渡されますが、基本的には、コピーを取り出してインクリメントして、関数スコープ外のポインタには影響しません。 – Adalcar

+0

返信兄弟ありがとう! :) –

0

ポインタから始まるリストを印刷する一方、あなたのlist1それは、フォーム1を開始リストを印刷します印刷のポインタです。彼らは物事を指すだけです。リンクされたリストの真ん中を指すポインタを持つことは完全に有効です。このようにして、1つのリストを別のリストのサブセットにすることができます。コメントで指摘されているように、これはマージ関数からの奇妙な動作ではありません。

Howver、これをやりたければ: "リスト2を空にする"ためには、呼び出しの後で逆参照することができます。このように:あなたが関数内でそれをしたい場合は

merge(list1, list2); 
list2 = NULL; 

、あなたは、ポインタへのポインタを使用できます。

void merge(NODE **list1, NODE **list2) 
{ 
    NODE *ptr1 = *list1; 
    NODE *ptr2 = *list2;  
// Do stuff 
    if(blabla) 
     **list1 = NULL; 
    else 
     **list2 = NULL; 
} 

をし、このようにマージ呼び出す:

merge(&list1, &list1) 
+0

提案をありがとう!私はあなたの努力に感謝します:) –

+0

2つの答えを受け入れることができますか? –

+0

一つだけ。 – klutt

関連する問題