97 lines
1 KiB
C
97 lines
1 KiB
C
|
|
#include <stdbool.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
#define N (256)
|
|
|
|
#define M (255)
|
|
|
|
struct boolist {
|
|
int data[8][256];
|
|
} list = {};
|
|
|
|
void add(int e)
|
|
{
|
|
printf("insert(e = %i);\n", e);
|
|
|
|
assert(!list.data[0][e]);
|
|
|
|
for (int k = 0; k < 8 && !list.data[k][e >> k]++; k++);
|
|
}
|
|
|
|
void discard(int e)
|
|
{
|
|
printf("discard(e = %i);\n", e);
|
|
|
|
assert(list.data[0][e]);
|
|
|
|
for (int k = 0; k < 8 && !--list.data[k][e >> k]; k++);
|
|
}
|
|
|
|
void print()
|
|
{
|
|
puts("print():");
|
|
|
|
void walk(int k, int i)
|
|
{
|
|
if (k >= 0)
|
|
{
|
|
int* a = &list.data[k][i >> k];
|
|
|
|
if (a[0]) walk(k - 1, i);
|
|
|
|
if (a[1]) walk(k - 1, i + (1 << k));
|
|
}
|
|
else
|
|
{
|
|
printf(" " "%i\n", i);
|
|
}
|
|
}
|
|
|
|
walk(7, 0);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
print();
|
|
|
|
add(42);
|
|
|
|
print();
|
|
|
|
add(101);
|
|
|
|
print();
|
|
|
|
discard(42);
|
|
|
|
print();
|
|
|
|
add(34);
|
|
|
|
print();
|
|
|
|
add(35);
|
|
|
|
print();
|
|
|
|
add(36);
|
|
|
|
print();
|
|
|
|
discard(35);
|
|
|
|
print();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|