#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct set {
void * data[100];
int count;
} set;
set s_integer, s_double, s_string;
void * el_alloc(size_t unit_size, int el_cnt);
int set_add(set * s, void * el, size_t unit_size, int el_cnt);
int set_delete(set * s, void * el, size_t unit_size, int el_cnt);
int set_find(set * s, void * el, size_t unit_size, int el_cnt);
int main( void ) {
int t, para_i, operation, val;
double para_d;
char para_s[100000];
while (1) {
scanf("%d", &t);
if (!t) break;
scanf("%d", &operation);
switch (t) {
case 1:
scanf("%d", ¶_i);
if (operation == 1) {
val = set_add(&s_integer, ¶_i, sizeof(int), 1);
if (val >= 0)
printf("%d\n", val);
else if (val == -2)
printf("%d is already exist!\n", para_i);
} else if (operation == 2) {
val = set_delete(&s_integer, ¶_i, sizeof(int), 1);
if (val < 0)
printf("%d is not exist!\n", para_i);
else
printf("%d\n", val);
} else {
val = set_find(&s_integer, ¶_i, sizeof(int), 1);
if (val < 0)
printf("%d is not exist!\n", para_i);
else
printf("%d\n", val);
}
break;
case 2:
scanf("%lf", ¶_d);
if (operation == 1) {
val = set_add(&s_double, ¶_d, sizeof(double), 1);
if (val >= 0)
printf("%d\n", val);
else if (val == -2)
printf("%.1lf is already exist!\n", para_d);
} else if (operation == 2) {
val = set_delete(&s_double, ¶_d, sizeof(double), 1);
if (val < 0)
printf("%.1lf is not exist!\n", para_d);
else
printf("%d\n", val);
} else {
val = set_find(&s_double, ¶_d, sizeof(double), 1);
if (val < 0)
printf("%.1lf is not exist!\n", para_d);
else
printf("%d\n", val);
}
break;
case 3:
scanf("%s", para_s);
if (operation == 1) {
val = set_add(&s_string, para_s, sizeof(char), strlen(para_s));
if (val >= 0)
printf("%d\n", val);
else if (val == -2)
printf("%s is already exist!\n", para_s);
} else if (operation == 2) {
val = set_delete(&s_string, para_s, sizeof(char), strlen(para_s));
if (val < 0)
printf("%s is not exist!\n", para_s);
else
printf("%d\n", val);
} else {
val = set_find(&s_string, para_s, sizeof(char), strlen(para_s));
if (val < 0)
printf("%s is not exist!\n", para_s);
else
printf("%d\n", val);
}
}
}
return 0;
}
void * el_alloc(size_t unit_size, int el_cnt) {
void * ret = malloc(unit_size * el_cnt);
return ret;
}
int set_add(set * s, void * el, size_t unit_size, int el_cnt) {
if (s -> count >= 100) {
printf("Full Set.\n");
return -1;
}
int pos = set_find(s, el, unit_size, el_cnt);
if (pos < 0) {
void * new_el = el_alloc(unit_size, el_cnt);
for (size_t i = 0; i < unit_size * el_cnt; ++i)
*((unsigned char *)(new_el + i)) = *((unsigned char *)(el + i));
s -> data[s -> count] = new_el;
return (s -> count)++;
}
else return -2;
}
int set_delete(set * s, void * el, size_t unit_size, int el_cnt) {
int pos = set_find(s, el, unit_size, el_cnt);
if (pos < 0) return -1;
void * p = s -> data[pos];
free(p);
s -> data[pos] = NULL;
return pos;
}
int set_find(set * s, void * el, size_t unit_size, int el_cnt) {
for (int i = 0; i < s -> count; ++i) {
if (!s -> data[i]) continue;
size_t j = 0;
while (j < unit_size * el_cnt &&
*((unsigned char *)(s -> data[i] + j)) == *((unsigned char *)(el + j)))
j += 1;
if (j == unit_size * el_cnt) return i;
}
return -1;
}
第一次用C写泛型
最新推荐文章于 2024-07-02 08:33:11 发布