2012-03-22 25 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); 

} 

任何帮助appriacted

回答

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 

它主要的工作原理是在做每添加到您的目的地列表节点一个迭代,直到两个源列表是空的。如果其中一个源列表为空,它将从另一个列表中选择下一个节点。

否则,它从当前指针具有最低值的列表中选择下一个节点。