数据结构学习之集合(二)

2014-11-24 08:38:10 · 作者: · 浏览: 1
ListElmt *member, *prev; //注意prev,用于记录被删除元素前面的那一元素位置,为后续删除作好准备
/* Find the member to remove */
prev = NULL;
for( member = list_head(set); member != NULL; member = list_next(member) )
{
if( set->match(list_data(member), *data) )
{
break;
}
prev = member;
}
/* Return if the member was not found */
if( member == NULL )
return -1;
/* remove the member */
return list_rem_next(set, prev, data);
}
(5) set_union
集合的并操作,它实现的思想是,首先先将集合set1的元素全部拷贝至集合setu中,按照集合特性,以及并操作的特点,集合set2中的元素也应存至setu中,但是需要注意元素的重复性问题,所以在拷贝set2中的元素之前需要做个判断,即判断set2中的元素是否已经存在于set1中,如果存在则不添加,否则需要添加,具体过程参见如下代码:
[cpp]
/* set_union */
int set_union(Set *setu, const Set *set1, const Set *set2)
{
void *data;
ListElmt *member;
/* initialize the set for the union */
set_init( setu, set1->match, NULL );
/* Insert the members of the first set */
for( member = list_head(set1); member != NULL; member = list_next(member) )
{
data = list_data(member);
if( list_ins_next(setu, list_tail(setu), data) != 0 )
{
set_destroy(setu);
return -1;
}
}
/* Insert the members of the second set. */
for( member = list_head(set2); member != NULL; member = list_next(member) )
{
if( set_is_member(set1, list_data(member)) )
{
continue;
}
else
{
data = list_data(member);
if( list_ins_next(setu, list_tail(setu), data) != 0 )
{
set_destroy(setu);
return -1;
}
}
}
return 0;
}
(6) set_difference
集合的差操作,它实现的思路是,集合setd保存的是差操作的结果,即set1-set2,所以根据差的定义,setd中要保存的是集合set1中的元素,并且set1中的这些元素必须是非集合set2的成员。具体代码如下:
[cpp]
/* set_difference */
int set_difference(Set *setd, const Set *set1, const Set *set2)
{
ListElmt *member;
void *data;
/* Initialize the set for the difference */
set_init(setd, set1->match, NULL);
/* Insert the members from set1 not in set2 */
for( member = list_head(set1); member != NULL; member = list_next(member) )
{
if( !set_is_member(set2, list_data(member)) )
{
data = list_data(member);
if( list_ins_next(setd, list_tail(setd), data) != 0 )
{
set_destroy(setd);
return -1;
}
}
}
return 0;
}
(7) set_intersection
集合的交操作,它实现的思路是,遍历set1中的每个成员,然后判断set1中的每个成员是否也属于集合set2,如果是则满足条件,在集合seti中记录,下面为具体的实现代码:
[cpp]
/* set_intersection */
int set_intersection(Set *seti, const Set *set1, const Set *set2)
{
ListElmt *member;
void *data;
/* initialize the set for the intersection */
set_init(seti, set1->match, NULL);
/* Insert the members present in both sets */
for( member = list_head(set1); member != NULL; member = list_next(member) )
{
if( set_is_member(set2, list_data(member)) )
{
data = list_data(member);
if( list_ins_next(seti, list_tail(seti), data) != 0 )
{
set_destroy(seti);
return -1;
}