两个集合的交并集等

/**********************
 * 两个集合的交并集等 *
 *要考虑输入重复的情况*
 *   顺序表实现       *
 *********************/
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 100
#define INCREASESIZE 10
typedef struct 
{
 int  * elem;
 int length;
 int listsize;
}S;
int init (S &A)      //初始化
{
 A.elem = ( int  *) malloc(LISTSIZE * sizeof(int ));
 if(!A.elem) return 0;
 A.listsize = LISTSIZE;
 A.length = 0 ;
 return 1;
}
void input (S &A ,int num)   //输入
{
	int i,x;
for( i = 0 ; i < num ; i ++)
{
	scanf("%d",&x);
   A.elem[A.length++]=x;
}
}
int insert(S &A, int i , int val)  //插入
{
    int * p,*q,*newbase;
if(i < 0 || i > A.length+1) return 0;
if(A.length == A.listsize)
{
  newbase = ( int *)realloc(A.elem ,(LISTSIZE +INCREASESIZE)* sizeof(int ));
  if(!newbase) return 0;
   A.listsize += INCREASESIZE;
   A.elem = newbase;
}
 q = &(A.elem[i - 1]);
 for( p = &(A.elem[A.length-1]); p >= q ; p --)  *(p+1)=*p;
  *q =val;
  A.length ++;
return 1;
}
int del(S &A , int i,int &e)     //删除
{
    int *q,*p;
if(i < 0 || i > A.length) return 0;
q = &(A.elem[i - 1]);
e= *q;
p = A.elem +A.length -1 ;
for(q ++; q <= p; q ++  )   *(q-1)=*q;
--A.length;
return 1;
}
void selectsort (S a,int n)     //选择排序
{
	int i,j,min,temp;
 for( i  = 0 ; i  < n-1 ; i ++)
 {	
	 min = i;
	 for (j = i + 1; j < n ; j ++)
		 if(a[j]< a[min])
		   min = j;
		 if(min != i)
		 {
		  temp = a[i];
		  a[i] = a[min];
		  a[min] = temp;
		 }
 }
}
void removal(S &A)     //删除重复
{
    int i,j,e;
for( i = 0 ; i < A.length ; i ++)
     for(j = 0 ; j < A.length ; j ++)
     {
         if(i == j ) continue;
         if(A.elem[i] == A.elem[j])
         {
         del(A,j,e);
         if(j == A.length - 1) break;
         j = 0;
         }
     }
}
void Union(S &A,S &B,S &C)   //并集
{
    int i,j;
for ( i = 0 ; i < A.length ; i ++)
    C.elem[C.length ++] = A.elem[i];
  for(i = 0 ; i < B.length ; i ++)
  {
      for(j = 0 ; j < C.length; j ++)
       if( B.elem[i] == C.elem[j]) break;
       if(B.elem[i] != C.elem[j]) 
           C.elem[C.length ++] = B.elem[i];
  }
  for( i = 0 ; i < C.length ; i ++ )
      printf("%d ",C.elem[i]);
  putchar('\n');
}
void mixed( S A,S B,S &D)  //交集
{
	int i,j;
for(i = 0; i < A.length ; i ++)
    for(j = 0 ;j < B.length ; j ++)
        if( A.elem[i]  == B.elem[j])
		{
            D.elem[D.length ++] = A.elem[i];
			break;
		}
  for( i = 0 ; i < D.length ; i ++ )
      printf("%d ",D.elem[i]);
  putchar('\n');

}
void complent(S A,S B,S D,S & E) //差集
{
	int i,j;
for( i = 0 ; i < A.length ; i ++ )
{    
for( j = 0 ; j < D.length; j ++ )
	
        if( A.elem[i] == D.elem[j] ) break;
        if(A.elem[i] != D.elem[j])
            E.elem[E.length ++] = A.elem[i];
	}
for( i = 0 ; i < E.length ; i ++ )
      printf("%d ",E.elem[i]);
}
void eor(S A,S B,S D,S &F)  //异或
{
complent(A,B,D,F);
F.length = 0;
complent(B,A,D,F);
putchar('\n');
}
void sort(S A) //冒泡排序
{
 int i,j,temp;
 for(i =0 ; i < A.length-1 ; i ++)
     for(j = 0 ; j < A.length - i -1 ; j ++)
         if(A.elem[j]> A.elem[j +1])
         {
         temp= A.elem[j];
         A.elem[j] = A.elem[j+1];
         A.elem[j+1]  = temp;
         }
}
int halfsearch(S A ,int val)  //折半查找
{
sort(A);
int i,j,mid;
i = 0 ; j = A.length-1 ; 
while( i <= j)
{
   mid= (i +j)/2;
   if( val < A.elem[mid]) j = mid-1;
   else if(val > A.elem[mid]) i = mid+1;
   else return mid;
}
return -1;
}
int main()
{
    S A,B,C,D,E,F;  //C并集 D交集 E差集 F 异或
    int i,val,e,num;
    init (A);
    init (B);
    init (C);
    init (D);
    init (E);
    init (F);
	printf("please input A num:");
	scanf("%d",&num);
	input(A,num);
	printf("please input B num:");
	scanf("%d",&num);
	input(B,num);
    removal(A);
    removal(B);       //去重
    printf("please input you want insert option and val:");
    scanf("%d%d",&i,&val);
    insert(A,i,val);
	for( i = 0 ; i < A.length ; i ++ )
      printf("%d ",A.elem[i]);
  putchar('\n');
    printf("plese input you want del option:");
    scanf("%d",&i);
	del(A,i,e);
	for( i = 0 ; i < A.length ; i ++ )
      printf("%d ",A.elem[i]);
    putchar('\n');
    printf("this %d is del!",e);  
	putchar('\n');
	printf(" A U B :");
    Union(A,B,C);     //并集
     printf(" A n B :");
    mixed(A,B,D);     //交集
	printf("A -B :");
    complent(A,B,D,E);  //差集
	putchar('\n');
	printf("A-B U B-A:");
    eor(A,B,D,F);       //异或
    printf("please input you want search val:");
    scanf("%d",&val);
    if(halfsearch(A,val) != -1)
        printf("sort after option is %d",halfsearch(A,val)+1);
    else 
        printf("no this val!");
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值