TEST/자료구조와 함께 배우는 알고리즘 입문(C언어)

<7> Q1. 자료구조와 함께 배우는 알고리즘 입문 (C언어)

도라몬즈 2021. 7. 7. 16:30
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int max;
    int num;
    int *set;
} IntSet;

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;
}

void Assign(IntSet *s1, const IntSet *s2)
{
    int i;
    int n = (s1->max < s2->num) ? s1->max : s2->num;
    for (i = 0; i < n; i++)
        s1->set[i] = s2->set[i];
    s1->num = n;
}

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++)
    {
        if (s1->set[i] == s2->set[j])
            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 *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;
}

IntSet *Difference(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])
                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;
    }
}

int IsFull(const IntSet *s)
{
    if (s->max - 1 == s->num)
        return 1;
    return 0;
}

void Clear(IntSet *s)
{
    while (s->num)
    {
        s->set[s->num - 1] = 0;
        s->num--;
    }
}

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

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

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

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

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

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

int main(void)
{
    IntSet a, b;
    Initialize(&a, 5);
    Initialize(&b, 5);
    for (int i = 0; i < 5; i++)
    {
        Add(&a, i);
        Add(&b, i + 1);
    }
    ToIntersection(&a, &b);
    printf("%d", a.set[0]);
    printf("%d", a.set[1]);
    printf("%d", a.set[2]);
    printf("%d", a.set[3]);

    return 0;
}

<코드 실행여부 모름>