例:
假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A U B。这就要求对线性表作如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入之。上述操作过程可用下列算法描述之。
void union(List & La, List Lb){
// 将所有在线性表Lb中但不在La中的数据元素插入到La中
La_len = ListLength(La); // 求线性表La的长度
Lb_len = ListLength(Lb); // 求线性表La的长度
for(i = 1; i <= Lb_len; i++){
GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e
if(!LocateElem(La, e, equal)) ListInsert(La, ++La_len, e);
// La中不存在和e相同的数据元素,则插入之
}
} // union
分析:题目中只是说了有两个线性表,但没表明是有序的线性表。
实现代码如下:
#include
#include
int k;
int La_len, Lb_len;
void munion(int a[], int b[], int c[])
{
int i, j ;
i = j = k = 0;
while(i < La_len && j < Lb_len){
if(a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while(i < La_len)
c[k++] = a[i++];
while(j < Lb_len)
c[k++] = b[j++];
}
int
main(void)
{
int i = 0;
printf("please input the length of list a and b: \n");
scanf("%d %d", &La_len, &Lb_len);
int LA[La_len], LB[Lb_len], LC[La_len + Lb_len];
printf("please input the list a : \n");
while(1){
scanf("%d", &LA[i++]);
if(i == La_len)
break;
}
i = 0;
puts("List A:");
while(1){
printf("%d ", LA[i++]);
if(i == La_len)
break;
}
putchar('\n');
i = 0;
printf("please input the list b : \n");
while(1){
scanf("%d", &LB[i++]);
if(i == Lb_len)
break;
}
i = 0;
puts("List B:");
while(1){
printf("%d ", LB[i++]);
if(i == Lb_len)
break;
}
putchar('\n');
/*
* now merger list a and b
*/
munion(LA, LB, LC);
i = 0;
while(1){
printf("%d ", LC[i++]);
if(i == k)
break;
}
exit(0);
}