[12]

ucf·2020년 10월 19일
0

알고리즘&자료구조

목록 보기
13/13

배열로 집합 만들기

"IntSet.h"

#ifndef ___IntSet
#define ___IntSet

typedef struct{
        int max; // 집합의 크기
        int num; // 집합의 원소 개수
        int *set; // 집합 본체의 배열
}IntSet;

//집합 초기화
int Initialize(IntSet *s,int max);

//s에 n이 있는지
int IsMember(const IntSet *S,int n);

//s에 n을 추가
void Add(IntSet *s,int n);

//s에 n을 삭제 
void Remove(IntSet *s, int n);

//s의 최대원소개수 반환
int Capacity(const IntSet *s);

//s의 원소개수
int Size(const IntSet *s);

//집합 s2를 s1에 대입
void Assign(IntSet *s1, const IntSet *s2);

집합 s1과 s2가 같은지
int Equal(const IntSet *s1, const IntSet *s2);

//집합 s2와 s3의 합집합을 s1에 대입
IntSet *Union(IntSet *s1, const IntSet *s2, const IntSet *s3);

//집합 s2와 s3의 교집합을 s1에 대입
IntSet *Intersection(IntSet *s1, const IntSet *s2, const IntSet *s3);

//s2에서 s3을 뺀 차집합을 s1에 대입
IntSet *Difference(IntSet *s1, const IntSet *s2, const IntSet *s3);

// s의 모든원소 출력
void Print(const IntSet *s);

// s의 모든원소 출력(줄바꿈 추가)
void PrintLn(const IntSet *s);

//집합 종료
void Terminate(IntSet *s);
#endif

"IntSet.c"


#include<stdlio.h>
#include<stdlib.h>
#include "IntSet.h"

int Initialize(IntSet s, int max){
        s->num=0;
        if((s->set = calloc(max,sizeof(int))) == NULL){
                s->max=0;
                return -1;
        }
        s->max = max;
        return 0;
}

int IsMember(const IntSet *s, int n){
        int i;
        for(i=0; i<s->num; i++)
                if(s->set[i] ==n) return i
        return -1;
}

void Add(IntSet *s, int n){
        if(s->num < s->max && IsMember(s,n) == -1)
                s->set[s->num++] = n;
}

void Remove(IntSet *s, int n){
        int idx;
        if((idx = IsMember(s,n)) != -1){
                s->set[idx] = s->set[--s->num];
        }
}

int Capacity(const IntSet *s){
        return s->max;
}

int Size(const IntSet *s){
        return s->num;
}

IntSet *Intersection(IntSet *s1, const IntSet *s2, const IntSet *s3){
        int i,j;
        s1->num=0;
        for(i=0; i<s2->num; i++)
                for(j=0; j<s3->num; j++)
                        if(s2->set[i] == s3->set[j])
                                Add(s1,s2->set[i]);
        return s1;
}

int Equal(const IntSet *s1, const IntSet *s2){
        int i,j;
        if(Size(s1) != Size(s2))
                return 0;
        for(i=0; i<s1->num; i++){
                for(j=0; j<s2->num; j++)
                        if(s1->set[i] == s2->set[i]) break;
                        if(j==s2->num) return 0;
        }
        return 1;
}

IntSet *Union(IntSet *s1, const IntSet *s2, const IntSet *s3){
        int i;
        Assign(s1,s2);
        for(i=0; i<s3->num; i++)
                Add(s1,s3->set[i]);
        return s1;
}

IntSet *Difference(IntSet *s1, const IntSet *s2, const IntSet *s3){
        int i,j;
        s->num = 0;
        for(i=0; i<s2->num; i++){
                for(j=0; j<s3->num; j++)
                        if(s2->set[i] == s3->set[j]) break;
                if(j==s3->num) Add(s1,s2->set[i]);
        }
        return s1;
}

void Print(const IntSet *s){
        int i;
        printf("{");
        for(i=0; i<s->num; i++)
                printf("%d", s->set[i]);
        printf("}");
}

void PrintLn(const IntSet *s){
        print(s);
        putchar('\n');
}

void Terminate(IntSet *s){
        if(s->set != NULL){
                free(s->set);
                s->max = s->num =0;
        }
}
		
profile
즐기자!

0개의 댓글