Справедливо ли было бы обобщить, что сортировка имен не зависит от операций над множествами?
Пока имена не меняются, операции набора будут работать?
Операции, которые вы перечислили, подразделяются на следующие группы:
Прямые операции над множествами, не имеет значения, из какого они набора. Они действуют на весь набор одновременно:
extern void setUnion(Set set1, Set set2, Set result);
extern void setIntersection(Set set1, Set set2, Set result);
extern void clearSet(Set set);
Вы могли бы заняться этим, не беспокоясь о том, что может означать набор, но вам понадобятся некоторые значения, чтобы можно было их кодировать или использовать.
Операции с элементами набора, они манипулируют одним битом в наборе, и опять же не очень важно, что представляют собой биты:
extern void add2Set(Set set, int value);
extern void deleteFromSet(Set set, int value);
extern int isMember(Set set, int element);
Это хорошее место для начала.
Эти операции отображаются между именами и множеством, поэтому для работы нужно больше вещей:
extern int nameIsMember(Set set, char *);
extern void addName2Set(Set set, char *);
extern void deleteNameFromSet(Set set, char *);
Я не уверен, что означает extern void printSet(Set);
, печатает ли он имена из набора?
Хорошо, набор
unsigned int s[10];
, чтобы проверить немного, нам нужно преобразовать значение типа int в индекс типа int и бит внутри int. Самый простой способ - это индекс массива = (значение / 32), смещение в битах (значение% 32). Компилятор должен хорошо поработать над тем, чтобы сделать это эффективным, поэтому не беспокойтесь об эффективности.
Чтобы получить битовое значение в s: (s [(значение / 32)] & (1 << (значение% 32)) </p>
Итак, вы понимаете битовые операторы ?
~ not
& and
| or
^ xor
<< left shift
>> right shift
Это операции, которые вы будете использовать для установки, очистки и изменения битов в наборе.