2012-03-22 5 views
0

2つのリンクリストがあります。新しいセットのデプリケート値を削除して表示できるように、両方のセットの要素をnewSetにコピーします。これまではすべてが間違っているように見えますが、セットをコピーしません。2リンクリストの要素を新しいリンクリストにコピーするには

struct Node *Union(struct Node *Link1, struct Node *Link2) 
{ 

    struct Node * set1 = Link1; 

    struct Node * set2 = Link2; 

    //Creat a new set 
    struct Node * newSet = (struct Node *) malloc(sizeof(struct Node)); 

    while(set1 != NULL && set2 != NULL) 
    { 

     //copy sets to newSet 
     newSet->data = set1->data; 
     newSet->data = set2->data; 
     newSet->next = Union(set1->next, set2->next); 
    } 

    return (newSet); 

} 

すべてのヘルプは

答えて

1

をappriactedあなたの主な問題は、あなたがしてリストの両方と事前両方ポインタの頭でそれを上書きし、新しい値のノードを割り当てることです。つまり、2番目のノードを1つずつ失うことになります。探索空間がバイナリチョップまたはマルチウェイツリートラバーサルのような再帰のための高速な(理想的な候補者は、捨てることを低下させないため、また

は、二つのリストを連結することは、本当に再帰に適してではありません各再帰呼び出しで大量の検索スペース)。両方のソースリストまで、それは基本的にあなたの送信先リストに追加ノードごとに1回の反復を実行して動作します

def union (link1, link2): 
    set1 = link1, set2 = link2 
    headnode = NULL, tailnode = NULL 

    # Continue until both lists empty. 

    while set1 is not NULL and set2 is not NULL: 
     # Create new node and set next pointer to NULL. 

     newnode = alloc_node() 
     newnode->next = NULL 

     # Select which set will provide the next node. 

     if set1 is NULL: 
      newnode->data = set2->data, set2 = set2->next 
     else if set2 is NULL: 
      newnode->data = set1->data, set1 = set1->next 
     else if set2->data is less than set1->data: 
      newnode->data = set2->data, set2 = set2->next 
     else: 
      newnode->data = set1->data, set1 = set1->next 

     # Add to end of (possibly empty) list. 

     if headnode is NULL: 
      headnode = newnode, tailnode = newnode 
     else: 
      tailnode->next = newnode, tailnode = newnode 

    return headnode 

:あなたのような、(ソート昇順を想定して、それの宿題以来の擬似コードを使用して)何かを反復的にそれを行うことができます空です。ソースリストの1つが空の場合、他のリストから次のノードを選択します。

それ以外の場合は、現在のポインタの値が最も小さいリストから次のノードを選択します。

関連する問題