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语言实现(七)——树(下):集合与集合例题
- c语言实现通用数据结构(四):通用集合(HashSet)
- 数据结构之---C语言实现冒泡排序
- [数据结构]单链表C语言的简单实现
- 数据结构之---C语言实现斐波那契查找
- 一、数据结构基础之顺序表C语言实现
- C语言 数据结构中求解迷宫问题实现方法
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- 数据结构——顺序表(C语言实现)
- 数据结构课设-约瑟夫换C语言实现
- 数据结构之---C语言实现二叉排序树(BinarySortTree)
- 数据结构之---C语言实现二叉树的三叉链表存储表示
- 数据结构基础(3)---C语言实现单链表
- 数据结构与算法之单链表C语言实现
- 数据结构模版----单链表SimpleLinkList[带头结点&&面向对象设计思想](C语言实现)
- 数据结构之---C语言实现平衡二叉树(AVL树)
- 数据结构(Data structure):使用双向链表实现队列(C语言)
- 数据结构(严蔚敏)之一——顺序表之c语言实现
- 数据结构模版----单链表SimpleLinkList[不带头结点](C语言实现)
- 数据结构之---C语言实现直接插入排序