【答案解析】借助于分块查找思想,在建立数据顺序表的同时,建立一索引表。数据表中按k个集合分块(元素个数不一定相等),索引表中有两个域,一是各集合最后一个元素在数据表中的位置(一维数组中的下标),二是集合的个数(k)。实现数据运算时,根据给定的二元组(i,x),首先在索引表中找到集合i的位置,然后在数据表中查找x。查到x,则查找成功,返回x在数据表中的位置,否则查找失败。若要插入,则将数据表中的数据后移,插入x,同时修改索引表。
typedef struct{ datatype data; }rectype;
typedef struct{
int a[]; //a数组容量够大,存储各集合最后一个数
据在数据表中的下标
int k; //集合个数
}index;
int SetSearch_Insert(rectype R[], index id, datatype x, int i){
//数据表R,查找第i个集合的元素x,若查找成功,返回其位置,
//否则将其插入第i个集合
if(i<1||i>id.k){printf("无第%d个集合/n",i); exit(0); }
if(i==1) first=0; //first指向第i个集合在数据表的首址
else first=id.a[i-1]+1;
last=id.a[i]; //last是第i个集合在数据表中的末址
for(j=first; j<last; j++) if(R[j]==x) return(j); //查找成功
for(j=id.a[id.k]; j>id.A[i]; j--){ //查找失败,将x插入数据表
R[j+1]; R[j]; //元素后移
R[j+1]=x; //将x插入到原第i个集合最后一个元素之后
for(j=i; j≤k; j++)id.a[j]++; //修改索引表中各集合最后一个元素的下标
}
由于各集合元素个数不等,各块长度不等且块间无序,索引表中用数组表示,数组中元素值是各集合最后一个元素在数据表中的下标。按本算法插入(2,11.2)和(1,5.3),数据表前后状态如下:
|
插入前
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
|
10.2
|
1.7
|
4.8
|
16.2
|
1.7
|
8.4
|
0.5
|
4.8
|
4.2
|
3.6
|
2.7
|
5.1
|
3.9
|
|
|
|
插入后
|
10.2
|
1.7
|
4.8
|
16.2
|
5.3
|
1.7
|
8.4
|
0.5
|
11.2
|
4.8
|
4.2
|
3.6
|
2.7
|
5.1
|
3.9
|
插入前,索引表中a数组的内容是3,6,12,插入后修改为4,8,14。