【发布时间】:2013-12-09 09:20:17
【问题描述】:
我正在尝试获取两个集合的交集和差异,每个集合都由这种形式的单链表表示
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){
}
【问题讨论】:
-
这两个函数为什么无效?对我来说,使用返回值而不是丑陋的第三个参数来报告结果似乎更合乎逻辑。
-
@wildplasser 实际上,要设置列表,您可以使用
assign函数,因此如果有人想用intersection的结果覆盖列表,则可以是assign(&list, intersection(a, b))。这些函数基本上做了两个任务:计算一些集合操作和破坏性分配。 -
不,该方法对于任务来说并不太复杂。您确实必须遍历一个列表,然后查找第二个列表中的每个项目。您可以为
intersection和difference编写一个通用例程,它需要一个额外的布尔参数来指示是保留匹配项还是拒绝。那么intersection和difference只是包装器。 -
好消息是:如果对列表进行排序,操作真的很简单。顺便说一句:OP 没有说是否允许更改两个“源”列表。
标签: c singly-linked-list set-intersection set-difference