数据结构源码笔记(C语言):集合的位向量表示

/*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语言描述)汇总:

数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

数据结构源码笔记(C语言):直接插入排序

数据结构源码笔记(C语言):直接选择排序

数据结构源码笔记(C语言):置换-选择算法

数据结构源码笔记(C语言):Huffman树字符编码

数据结构源码笔记(C语言):Josephus问题之顺序表

数据结构源码笔记(C语言):Josephus问题之循环链接表

数据结构源码笔记(C语言):多项式合并

数据结构源码笔记(C语言):二叉树之叶子结点旋转销毁

数据结构源码笔记(C语言):哈夫曼树

数据结构源码笔记(C语言):集合的位向量表示

数据结构源码笔记(C语言):链接队列

数据结构源码笔记(C语言):链接栈

数据结构源码笔记(C语言):线性表的单链表示

数据结构源码笔记(C语言):线性表的顺序表示

数据结构源码笔记(C语言):栈的基本操作

数据结构源码笔记(C语言):中缀表达式

数据结构源码笔记(C语言):希尔插入排序

数据结构源码笔记(C语言):索引文件建立和查找

数据结构源码笔记(C语言):冒泡排序

数据结构源码笔记(C语言):快速排序

数据结构源码笔记(C语言):可变长度字符串的快速排序

数据结构源码笔记(C语言):基数排序

数据结构源码笔记(C语言):二路归并排序

数据结构源码笔记(C语言):堆排序

数据结构源码笔记(C语言):二叉树搜索树Kruskal

数据结构源码笔记(C语言):二叉搜索树Prim

数据结构源码笔记(C语言):最短路径弗洛伊德算法

数据结构源码笔记(C语言):深度、广度优先生成树

数据结构源码笔记(C语言):邻接矩阵转化邻接表

数据结构源码笔记(C语言):统计字符串中出现的字符及其次数

数据结构源码笔记(C语言):顺序查找

数据结构源码笔记(C语言):哈希表的相关运算算法

数据结构源码笔记(C语言):分块法查找

数据结构源码笔记(C语言):二分查找

数据结构源码笔记(C语言):二叉树遍历

数据结构源码笔记(C语言):二叉平衡树的相关操作算法

数据结构源码笔记(C语言):二叉排序树的基本操作算法

数据结构源码笔记(C语言):B树的相关运算算法

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值