/**********************
* 两个集合的交并集等 *
*要考虑输入重复的情况*
* 顺序表实现 *
*********************/
#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;
}