顺序表交集与归并
测试用例:
a[] = {3, 5, 6, 11};
b[] = {2, 6, 8, 9, 11, 15, 20};
输出结果为两个数组LA与LC,其中LA表示a[]
与b[]
的并集,LC表示a[]
与b[]
的归并。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXLISTSIZE 20
#define MAXLISTNUMBER 20
typedef int Status;
typedef int ElemType;
typedef struct {
int data[MAXLISTSIZE];
int length;
}List;
List La,Lb,Lc;
List CreateList(int temp[], List La, int n);
void Union(List La, List Lb);
int IsEqual(int a, int b);
List UnionND(List La, List Lb);
void BucketSort(List L);
int main(){
int temp_a[] = {3,5,8,11};
int temp_b[] = {2,6,8,9,11,15,20};
La = CreateList(temp_a, La, sizeof(temp_a)/sizeof(int));
Lb = CreateList(temp_b, Lb, sizeof(temp_b)/sizeof(int));
Union(La, Lb);
Lc = UnionND(La, Lb);
BucketSort(Lc);
return 0;
}
List CreateList(int temp[], List La, int n){
for(int i = 0; i < n; i++){
La.data[i] = temp[i];
La.length = i+1;
}
return La;
}
void Union(List La, List Lb){
int flag = 0;
for(int i = 0; i < Lb.length; i++){
for(int j = 0; j < La.length; j++){
if(IsEqual(Lb.data[i], La.data[j]))
flag = 1;
}
if(!flag){
La.data[La.length++] = Lb.data[i];
}
flag = 0;
}
printf("LA = (");
for(int k = 0; k < La.length; k++)printf("%d ",La.data[k]);
printf(")");
printf("\n");
}
int IsEqual(int a, int b){
if(a == b)return 1;
else return 0;
}
List UnionND(List La, List Lb){
for(int i = 0; i < Lb.length; i++){
La.data[La.length++] = Lb.data[i];
}
return La;
}
void BucketSort(List L){
int Bucket[MAXLISTNUMBER+1];
for(int i = 0; i < MAXLISTNUMBER+1; i++)
Bucket[i] = 0;
for(int j = 0; j < L.length; j++)
Bucket[L.data[j]]++;
printf("LC = (");
for(int k = 0; k < MAXLISTNUMBER+1; k++)
for(; Bucket[k] > 0; Bucket[k]--)
printf("%d ",k);
printf(")");
}
实验截图如下