7、集合

来源:互联网 发布:win10网络时间同步 编辑:程序博客网 时间:2024/05/29 00:31

1、集合的特性:无序性、唯一性
2、集合运算
这里写图片描述
3、set.h

#ifndef _SET_H#define _SET_H#include "../Link-单链表/single_list.h"typedef List Set;#define set_size(set) set->sizevoid set_init(Set *set, int (*match)(const void *key1, void *key2), void (*destroy)(void *data));int set_insert(Set *set, const void *data);int set_remove(Set *set, const 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_mumber(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); #endif

3、set.c

#include <stdio.h>#include "set.h"void set_init(Set *set, int (*match)(const void *key1, void *key2), void (*destroy)(void *data)){    list_init(set,destroy);    set->match = match;    return;}//集合中不存在该元素时,插入元素 (链表尾部插入) int set_insert(Set *set, const void *data){    if(set_is_mumber(set, data))    {        return 1;    }    return list_ins_next(set,list_tail(set), data); }int set_remove(Set *set, const void *data){    List_Elmt *element,*prev=NULL;    //找到时,element为该元素,prev是它前面的元素     for(element = list_head(set);element != NULL;element = element->next)    {        if(set->match(*data, list_data(element)))        {            break;        }        prev = element;    }    //没找到该元素     if(element ==NULL)        return -1;    return list_rem_next(set, prev, data);}//并集,先加入set1所有元素,在加入 set2和set1不同的元素 int set_union(Set *setu, const Set *set1, const Set *set2){    ListElmt *element;    void *data;    set_init(setu, set1->match, NULL);     for(element = list_head(set1);element != NULL;element = element->next)    {        data = list_data(element);        list_ins_next(setu, list_tail(setu), data);    }    for(element = list_head(set2);element != NULL;element = element->next)    {        if(set_is_mumber(set1, list_data(element)))        {            continue;        }        else{            data = list_data(element);            list_ins_next(setu, list_tail(setu), data);        }    }    return 0;}//交集,对set1每个元素判断是否在set2中也存在 ,加入两则相同的元素int set_intersection(Set *seti, const Set *set1, const Set *set2){    ListElmt *element;    void *data;    set_init(seti, set1->match, NULL);     for(element = list_head(set1);element != NULL;element = element->next)    {        if(set_is_mumber(set2, list_data(element)))        {            data = list_data(element);            list_ins_next(setu, list_tail(setu), data);        }    }    return 0;}//差集,对set1每个元素判断是否在set2中也存在 ,若不存在则加入 int set_difference(Set *setd, const Set *set1, const Set *set2){    ListElmt *element;    void *data;    set_init(seti, set1->match, NULL);     for(element = list_head(set1);element != NULL;element = element->next)    {        if(!set_is_mumber(set2, list_data(element)))        {            data = list_data(element);            list_ins_next(setd, list_tail(setd), data);        }       }    return 0;}//判断一个元素是不是集合成员 int set_is_mumber(const Set *set, const void *data){    ListElmt *element;    for(element = list_head(set1);element != NULL;element = element->next)    {        if(set->match(data, list_data(menber)))            return 1;    }    return 0;}//判断set1是不是set2的子集 int set_is_subset(const Set *set1, const Set *set2){    ListElmt *element;    //子集数目不会大于父集     if(set_size(set1) > set_size(set2))        return -1;     //如果set1中一个元素不属于set2,则不是set2的子集     for(element = list_head(set1);element != NULL;element = element->next)    {        if(!set_is_mumber(set2, list_data(menber)))            return 0;    }    return 1;}//集合相等,则元素数目相同,且互为子集 int set_is_equal(const Set *set1, const Set *set2){    ListElmt *element;    if(set1->size != set2->size)        return -1;    return set_is_subset(set1, set2);}
原创粉丝点击