/*BitSet.c*/
/*集合的位向量表示:函数实现*/
#include <stdio.h>
#include <stdlib.h>
#define superNum 20
#define sonNum 8
/*集合的位向量表示:类型和界面定义*/
typedef struct
{
int size; /*字符数组的长度*/
char * array; /*位向量空间。每一数组元素保存8位。*/
} BitSet;
/*空集合的创建*/
BitSet * createEmptySet (int n)
{ /*创建n位的位向量000...0*/
int i;
BitSet * s = (BitSet *)malloc(sizeof(BitSet));
if (s!=NULL)
{
s->size = (n + 7) / 8;
s->array = (char *)malloc(s->size * sizeof(char));
if (s->array != NULL)
{
for (i = 0; i < s->size; i++) s->array[i] = '\0';
return s;
}
}
return NULL;
}
/*将值为index的元素插入集合S*/
int insert (BitSet * s, int index)
{ /*将位向量中下标为index的位置为1*/
if (index >= 0 && index>>3 < s->size)
{s->array[index >> 3] |= (1 << (index & 07)); return 1; }
return 0;
}
/*将值为index的元素从集合S中删除*/
int delete(BitSet * s, int index)
{ /*将位向量中下标为index的位,置为0*/
if (index >= 0 && index >> 3 < s->size)
{s->array[index >> 3] &= ~(1 << (index & 07)); return 1;}
return 0;
}
/*判断整数index的元素是否属于集合S*/
int member(BitSet * s, int index)
{ /*检查位向量中下标为index的位置是否为1*/
if (index >= 0 && index >> 3 < s->size&&(s->array[index >> 3] & (1 << (index & 07))))
return 1;
return 0;
}
/*集合与集合的并*/
int union_set(BitSet *s0,BitSet *s1,BitSet *s2)
{
/*当三个位向量长度相等时返回1,置s2为s0与s1的并;否则返回0。*/
int i;
if (s0->size != s1->size|| s2->size != s1->size) return 0;
for (i = 0; i < s1->size; i++)
s2->array[i]=s0->array[i] | s1->array[i];
return 1;
}
/*集合与集合的交*/
int intersection(BitSet * s0, BitSet * s1, BitSet * s2) {
/*当三个位向量长度相等时返回1,置s2为s0与s1的交;否则返回0。*/
int i;
if (s0->size != s1->size|| s2->size != s1->size) return 0;
for (i = 0; i < s1->size; i++)
s2->array[i]=s0->array[i] & s1->array[i];
return 1;
}
/*集合与集合的差*/
int difference(BitSet * s0, BitSet * s1, BitSet * s2)
{
/*当三个位向量长度相等时返回1,置s2为s0与s1的差;否则返回0。*/
int i;
if (s0->size != s1->size|| s2->size != s1->size) return 0;
for (i = 0; i < s1->size; i++)
s2->array[i]=s0->array[i] & ~s1->array[i];
return 1;
}
void display(BitSet *s,int * super_set)
{
int i,j;
char ch;
printf("{");
for (i=0; i<s->size; i++)
for(j=0;j<8;j++)
{
ch=s->array[i]>>j;
if(ch%2!=0) printf("%d ",super_set[i*8+j]);
}
printf("}\n\n");
}
int main()
{
BitSet *s0,*s1,*s2,*s3,*s4;
int i=0,j=0;
int superset[superNum]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int subset[sonNum]={1,2,4,5,7,8,10,19};
int othersubset[4]={5,11,14,17};
/*空集合的创建*/
s0=createEmptySet (superNum);
s1=createEmptySet (superNum);
s2=createEmptySet (superNum);
s3=createEmptySet (superNum);
s4=createEmptySet (superNum);
//将subset集合存放到存储结构的数组array中
for(i=0;i<superNum;i++)
{
while(j<sonNum)
{
if(subset[j]==superset[i])
{
insert(s0, i);
break;
}
j++;
};
j=0;
}
printf("集合S0=");
display(s0,superset);
/*将值为index的元素从集合S中删除*/
printf("删除元素后,集合S0=");
delete(s0,3);
display(s0,superset);
/*判断整数index的元素是否属于集合S*/
if(member(s0, 11))
printf("判断11是该集合的元素\n");
else printf("判断11不是该集合的元素\n");
//创建另外一个集合s1
j=0;
for(i=0;i<superNum;i++)
{
while(j<4)
{
if(othersubset[j]==superset[i])
{
insert(s1, i);
break;
}
j++;
};
j=0;
}
printf("集合S1=");
display(s1,superset);
/*集合与集合的并*/
union_set (s0, s1, s2);
printf("s0,s1做并后,s2=");
display(s2,superset);
/*集合与集合的交*/
intersection(s0, s1, s3);
printf("s0,s1做交后,s3=");
display(s3,superset);
/*集合与集合的差*/
difference(s0, s1, s4);
printf("s0,s1做差后,s4=");
display(s4,superset);
return 0;
}
数据结构源码笔记(C语言描述)汇总: