您的位置:首页 > 理论基础 > 数据结构算法

C语言实现数据结构之集合

2018-01-08 22:53 429 查看

博客中所有源代码:Github托管项目地址

集合的介绍

集合是相关联的无序组合,且每个成员再集合中仅出现一次。集合的正式写法是再两边加上大括号。因此,如果S是一个包含成员1,2和3的集合,则集合S应写作S={1, 2, 3}.当然,由于集合是无序的,因此也可以写作S={3,2,1}。

集合头文件:set.h

#ifndef SET_H
#define SET_H

#include <stdlib.h>
#include "list.h"

typedef List Set;

void set_init(Set *set, int (*match)(const void *key1, const vodi *key2), void (*destory)(void *data));

int set_insert(Set *set, const void *data);
int set_remove(Set *set, void **data);

int set_union(Set *setu, const Set *set1, const Set *set2);
int set_intersection(Set *seti, const Set *set1, const Set *set2);
int set_difference(Set *setd, const Set *set1, const Set *set2);

int set_is_member(const Set *set, const void *data);
int set_is_subset(const Set *set1, const Set *set2);
int set_is_equal(const Set *set1, const Set *set2);

#define set_size(set) ((set)->size)
#define set_destory list_destory

#endif

功能分析与实现

1.函数set_init用来初始化一个集合以便其他操作能够执行。

2.函数set_destory用来销毁一个集合。

3.set_insert将一个成员插入集合中。

4.set_remove通过使用list_next遍历集合,根据match所指定的函数确定需要一处的成员然后将其从集合中移除。

5.set_union操作将建立一个集合,是set1和set2的并集。

6.set_intersection操作将建立一个集合,是set1和set2的交集。

7.set_defference操作将建立一个集合,是set1和set2的差集。

8.set_is_member用来判断某个成员书否在这个集合中出现过。

9.set_is_subset操作用来判断集合eset1是否是set2的子集。

10.set_is_equal操作用来判断集合set1是否同等于set2.

11.set_size用来计算集合中的成员个数。

集合主文件set.c

#include <stdlib.h>
#include <string.h>

#include "list.h"
#include "set.h"

void set_init(Set *set, int (*match)(const void *key1, const vodi *key2), void (*destory)(void *data))
{
list_init(set, destory);
set_>match = match;

return;
}

int set_insert(Set *set, const void *data)
{
if (set_is_member(set, data))
return 1;

return list_ins_next(set, list_tail(set), data);
}

int set_remove(Set *set, void **data)
{
ListElmt *member, *prev;

prev = NULL;

for (member = list_head(set); member != NULL; member = list_next(member))
{
if (set->match(*data, list_data(member)))
break;
prev = member;
}

if (member == NULL)
return -1;

return list_rem_next(set, prev, data);
}

int set_union(Set *setu, const Set *set1, const Set *set2)
{
ListElmt *member;
void *data;

set_init(setu, set1->match, NULL);

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_destory(setu);
return -1;
}
}

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_destory(setu);
return -1;
}
}
}

return 0;
}

int set_intersection(Set *seti, const Set *set1, const Set *set2)
{
ListElmt *member;
void *data;

set_init(seti, set1->match, NULL);

for (member = list_head(set1); member != NULL; member = list_next(member))
{
data = list_data(member);
if (set_is_member(ste2, list_data(member)))
{
data = list_data(member);

if (list_ins_next(seti, list_tail(seti), data) != 0)
{
set_destory(seti);
return -1;
}
}
}

return 0;
}

int set_difference(Set *setd, const Set *set1, const Set *set2);
{
ListElmt *member;
vodi *data;

set_init(setd, set1->match, NULL);

for (member = list_head(set1); member != NULL; member = list_next(member))
{
if (!set_is_member(ste2, list_data(member)))
{
data = list_data(member);

if (list_ins_next(setd, list_tail(setd), data) != 0)
{
set_destory(setd);
return -1;
}
}
}

return 0;
}

int set_is_member(const Set *set, const void *data)
{
ListElmt *member;

for (member = list_head(set1); member != NULL; member = list_next(member))
{
if (set->match(data, list_data(member)))
return 1;
}

return 0;
}

int set_is_subset(const Set *set1, const Set *set2)
{
ListElmt *member;

if (set_size(set1)> set_size(set2))
return 0;

for (member = list_head(set1); member != NULL; member = list_next(member))
{
if (!set_is_member(set2, list_data(member)))
return 0;
}

return -1;
}

int set_is_equal(const Set *set1, const Set *set2)
{
if (set_size(set1) != set_size(set2))
return 0;

return set_is_subset(set1, set2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C 数据结构 集合