在C中设置与链接列表的交集和差异

时间:2013-11-24 19:14:33

标签: c singly-linked-list set-intersection set-difference

我正在尝试获得两个集合的交集和差异,每个集合由此表单的单链表单表示

struct node{
    unsigned n;
    struct node *next;
};

我已经在之前的任务中编写了这个函数,这些任务计算列表中元素的数量,并确定某个元素是否包含在列表中。

int cardinality(struct node *s){
    struct node *tmp = s;
    int count = 0;

    while(tmp != NULL){
    tmp = tmp->next;
    count++;
    }

    return count;
}

int contains(struct node *s, int v){ /* returns 0 if in list, 1 if not in list */
    struct node *tmp = s;
    int contains = 1;

    while(tmp->next != NULL){
    if(tmp->n == v){
        contains = 0;
        break;
        } else{
        if(tmp == NULL) break;
        tmp = tmp->next;
    }
    }
    return contains;
}

现在我必须编写以下函数,但我不知道该怎么做。 我应该循环遍历一个列表,并通过第二个列表循环列表循环中的每个元素,以检查第二个列表中是否包含(差异)?对于这项任务而言似乎很复杂,必须有一种更简单的方法来做到这一点。 希望你能帮帮我

void intersection(struct node *s1, struct node *s2, struct node **result){

}

void difference(struct node *s1, struct node *s2, struct node **result){

}

2 个答案:

答案 0 :(得分:0)

实施下一步:

// Copy one node s, giving the copy a NULL next pointer.
struct node *copy_one(struct node *s);

// Add the given node s to an existing list.
void add(struct node *s, struct node **existing);

这些对于许多目的都有用,但在这里你将组成它们:

add(copy_one(s), &existing_list);

建立你的结果。

现在交叉算法是:

set result empty
for all elements e in s1
   if e->val is contained in s2
       add a copy of e to result

对于差异s1 - s2,它是

set result empty
for all elements e in s1
   if e is _not_ contained in s2
       add a copy of e to result

我会让你解决这个问题。我给你一个完整的答案并不好玩。

请注意,选择表示集合的链接列表可以很好地了解C和链接列表,但通常不是最佳选择,因为它会导致大集合的性能降低。

答案 1 :(得分:0)

  

我应该遍历一个列表以及列表循环中的每个元素   通过第二个列表来检查它是否是(差异)   包含在第二个?

如果你要将你的集合表示为未排序的链表,是的。还有更多 您可以用来实现集合操作的高效数据结构和算法 (例如排序的数组),但如果这是作业,你可能会遇到链表。

  

对于这项任务而言似乎过于复杂,必须有一种更简单的方法   此

这是C.你需要习惯于自己处理大量的低级细节,因为这种语言并没有提供内置数据结构和算法的方法。但是几个嵌套循环真的没什么大不了的。