假设有两个集合A和B分别用两个线性表LA和LB表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合A=A∪B
#include<stdio.h>
#include<malloc.h>
#include<process.h>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10
typedef struct{
int *elem;
int length;
int listsize;
}SqList;
int InitList(SqList *L){
(*L).elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if(! (*L).elem)
exit (0);
(*L).length = 0;
(*L).listsize = LIST_INIT_SIZE;
return 1;
}
int ListInsert(SqList *L,int i,int e){
int *newbase,*q,*p;
if(i<1||i>(*L).listsize)
return 0;
if((*L).length>=(*L).listsize){
newbase = (int *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(0);
(*L).elem = newbase;
(*L).listsize+=LISTINCREMENT;
}
q = (*L).elem+i-1;
for(p=(*L).elem+(*L).length-1;p>=q;--p)
*(p+1) = *p;
*q = e;
++(*L).length;
return 1;
}
int ListTraverse(SqList L,void (*vi)(int *)){
int *p;
int i;
p = L.elem;
for(i=1;i<=L.length;i++)
vi(p++);//?
printf("\n");
return 1;
}
int GetElem (SqList L,int i,int *e){
if(i<1||i>L.length)
exit(0);
*e = *(L.elem+i-1);
return 1;
}
int LocateElem(SqList L,int e,int (*compare)(int ,int )){
int *p;
int i = 1;
p = L.elem;
while(i<=L.length&&!compare(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
int equal(int c1, int c2){
if(c1==c2)
return 1;
else
return 0;
}
void Union(SqList *La,SqList Lb){
int e;
int La_len,Lb_len;
int i;
La_len = (*La).length;
Lb_len = (Lb).length;
for(i=1;i<=Lb_len;i++){
GetElem(Lb,i,&e);
if(!LocateElem(*La,e,equal))
ListInsert(La,++La_len,e);
}
}
void print(int *c){
printf("%d ",*c);
}
void main(){
SqList La,Lb;
int i,j;
i = InitList(&La);
if(i == 1)
for(j=1;j<=5;j++)
i = ListInsert(&La,j,j);
printf("La = ");
ListTraverse(La,print);
InitList(&Lb);
for(j=1;j<=5;j++)
i = ListInsert(&Lb,j,2*j);
printf("Lb =");
ListTraverse(Lb,print);
Union(&La,Lb);
printf("new La= " );
ListTraverse(La,print);
}