33,008
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
/**只用修改这里*******************************/
#define ASIZE 10
int a[ASIZE]={43,6,14,8,4,223,7,109,343,33};
#define BSIZE 20
int b[BSIZE]={-176, 7, 437, 33, 164, -33, -393, 285,
-279, -290, 217, -325, -316, 51, -377, -195,
318, -141, -277, -18};
#define CSIZE 25
int c[CSIZE]={47,-439, -327, 294, 316, -167, 312, -60, -112,
-35, 211, -180, 131, -245, -207, -284, 33,
-271, 486, -184, 120, -465, 179, 7, -156};
/*******************************只用修改这里**/
struct node{
int *a;
int len;
};
struct list{
struct node* book;
int len,size;
};
void init_list(struct list *ls,int size){
ls->book=(struct node*)malloc(sizeof(struct node)*size);
ls->size=size;
ls->len=0;
}
void del_list(struct list *ls){
free(ls->book);
}
void insert_to_list(struct list *ls,int *a,int len){
if(ls->len==ls->size){
printf("can not insert information, because the list is full...\n");return;
}
ls->book[ls->len].a=a;
ls->book[ls->len].len=len;
ls->len++;
}
int compar(const void *a,const void *b){
int *x=(int*)a;
int *y=(int*)b;
if(*x>*y) return 1;
if(*x==*y) return 0;
return -1;
}
void fun(struct list *ls){
int i,j,k,t,t2,x,c;
int *ta,*pb,*pe;
int **p;
int flg=1;
k=ls->len;
/* 数组排序 */
for(i=0;i<k;i++){
qsort(ls->book[i].a,ls->book[i].len,sizeof(int),compar);
}
/* 生成保存结果缓冲区 */
t2=-1;
for(i=0;i<k;i++){
if(t2<ls->book[i].len||t2==-1) t2=ls->book[i].len;
}
ta=(int*)malloc(sizeof(int)*t2);
/* 准备 */
p=(int**)malloc(sizeof(int*)*k);
pb=(int*)malloc(sizeof(int)*k);
pe=(int*)malloc(sizeof(int)*k);
for(i=0;i<k;i++){
p[i]=ls->book[i].a;
pe[i]=ls->book[i].len;
}
memset(pb,0,sizeof(int)*k);
/* 求交集 */
t=0;
//选一个最大的数并记录位置
x=p[0][pb[0]];j=0;
for(i=1;i<k;i++){
if(p[i][pb[i]]>x){
j=i;x=p[i][pb[i]];
}
if(pb[i]==pe[i]) flg=0;
}
while(flg){
c=1;
for(i=0;i<k;i++){
if(i==j) continue;
while(pb[i]<pe[i]){
if(p[i][pb[i]]>=x) break;
pb[i]++;
}
if(p[i][pb[i]]==x) c++;
}
//记录一个交集元素
if(c==k){
ta[t++]=x;
for(i=0;i<k;i++) pb[i]++;
}
//选一个最大的数并记录位置
x=p[0][pb[0]];j=0;
for(i=1;i<k;i++){
if(p[i][pb[i]]>x){
j=i;x=p[i][pb[i]];
}
if(pb[i]==pe[i]) flg=0;
}
}
/* 打印结果 */
if(t==0) printf("φ\n");
else{
for(i=0;i<t;i++) printf("%d, ",ta[i]);
printf("\n");
}
free(ta);free(p);free(pe);
}
int main(){
/* 创建一个保存数组信息的结构体 */
struct list ls;
init_list(&ls,4);
/* 将数组信息填写进结构体内 */
insert_to_list(&ls,c,CSIZE);
insert_to_list(&ls,a,ASIZE);
insert_to_list(&ls,b,BSIZE);
/* 求多个数组的交集 */
fun(&ls);
del_list(&ls);return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**只用修改这里*******************************/
#define ASIZE 10
int a[ASIZE]={43,6,14,8,4,223,7,109,343,33};
#define BSIZE 20
int b[BSIZE]={-176, 412, 437, 33, 164, -33, -393, 285,
-279, -290, 217, -325, -316, 51, -377, -195,
318, -141, -277, -18};
#define CSIZE 25
int c[CSIZE]={47,-439, -327, 294, 316, -167, 312, -60, -112,
-35, 211, -180, 131, -245, -207, -284, 33,
-271, 486, -184, 120, -465, 179, 461, -156};
/*******************************只用修改这里**/
struct node{
int *a;
int len;
};
struct list{
struct node* book;
int len,size;
};
void init_list(struct list *ls,int size){
ls->book=(struct node*)malloc(sizeof(struct node)*size);
ls->size=size;
ls->len=0;
}
void del_list(struct list *ls){
free(ls->book);
}
void insert_to_list(struct list *ls,int *a,int len){
if(ls->len==ls->size){
printf("can not insert information, because the list is full...\n");return;
}
ls->book[ls->len].a=a;
ls->book[ls->len].len=len;
ls->len++;
}
int compar(const void *a,const void *b){
int *x=(int*)a;
int *y=(int*)b;
if(*x>*y) return 1;
if(*x==*y) return 0;
return -1;
}
int compar2(const void *a,const void *b){
struct node *x=(struct node*)a;
struct node *y=(struct node*)b;
if(x->len>y->len) return 1;
if(x->len==y->len) return 0;
return -1;
}
void fun(struct list *ls){
int i,j,k,t,t2;
char flg;
int *ta,*tb;
/* 数组排序 */
for(i=0;i<ls->len;i++){
qsort(ls->book[i].a,ls->book[i].len,sizeof(int),compar);
}
/* 数组长度排序 */
for(i=0;i<ls->len;i++){
qsort(ls->book,ls->len,sizeof(struct node),compar2);
}
ta=(int*)malloc(sizeof(int)*ls->book[0].len);
tb=(int*)malloc(sizeof(int)*ls->book[0].len);
t2=ls->book[0].len;
memcpy(ta,ls->book[0].a,sizeof(int)*t2);
/* 求交集 */
flg=0;
for(i=1;i<ls->len;i++){
t=0;j=0;k=0;
while(j<t2&&k<ls->book[i].len){
if(flg==0){
if(ta[j]==ls->book[i].a[k]){
tb[t]=ta[j];j++;k++;t++;
}else if(ta[j]<ls->book[i].a[k]) j++;
else k++;
}else{
if(tb[j]==ls->book[i].a[k]){
ta[t++]=tb[j];j++;k++;
}else if(tb[j]<ls->book[i].a[k]) j++;
else k++;
}
}
if(t==0){
printf("φ\n");free(ta);free(tb);return;
}
t2=t;
if(flg==0) flg=1;
else flg=0;
}
/* 打印结果 */
if(flg==0){
for(i=0;i<t2;i++) printf("%d, ",ta[i]);printf("\n");
}else{
for(i=0;i<t2;i++) printf("%d, ",ta[i]);printf("\n");
}
free(ta);free(tb);
}
int main(){
/* 创建一个保存数组信息的结构体 */
struct list ls;
init_list(&ls,4);
/* 将数组信息填写进结构体内 */
insert_to_list(&ls,c,CSIZE);
insert_to_list(&ls,a,ASIZE);
insert_to_list(&ls,b,BSIZE);
/* 求多个数组的交集 */
fun(&ls);
del_list(&ls);return 0;
}
#include <algorithm>
#include <iostream>
using std::set_intersection;
using std::sort;
using std::cout;
using std::endl;
#define ASIZE 10
int a[ASIZE]={43,6,14,8,4,223,7,109,343,33};
#define BSIZE 20
int b[BSIZE]={-176, 7, 437, 33, 164, -33, -393, 285,
-279, -290, 217, -325, -316, 51, -377, -195,
318, -141, -277, -18};
#define CSIZE 25
int c[CSIZE]={47,-439, -327, 294, 316, -167, 312, -60, -112,
-35, 211, -180, 131, -245, -207, -284, 33,
-271, 486, -184, 120, -465, 179, 7, -156};
int result[CSIZE];
void sortIt()
{
sort(a, a+ASIZE);
sort(b, b+BSIZE);
sort(c, c+CSIZE);
}
int merge()
{
int *pBegin=result, *pEnd=result+CSIZE;
pEnd=set_intersection(a, a+ASIZE, b, b+BSIZE, pBegin);
pEnd=set_intersection(pBegin, pEnd, c, c+CSIZE, pBegin); //这样不知道安全不安全
return pEnd-pBegin;
}
int main()
{
sortIt();
int resSize = merge();
for(int i=0; i<resSize; ++i)
{
cout<<result[i]<<' ';
}
cout<<endl;
}