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;
}
<코드 실행여부 모름>