|
一个朋友报了软考,看的一份试卷上有下题,我们两都没看懂,请哪位高手帮忙详细解释一下,不胜感激!!!
阅读下列函数说明和C代码,将应填入其中止处的字句,写在答卷的对应栏内。
[程序说明)
设有两个整型数组a[]和b[],其中数组a[]的前n个元素中按序存放着0,1,2,----,
n-l。现要求按数组a[]为序号重新调整数组b[]的前n个元素的存储顺序,便调整后的
b存放着调整前的b[a]。程序在调整时不使用工作数组。
如a[]={5,0,6,3,2,1,4} b[]{3,7,20,5,8,12,6}
则调整后b[]={12,3,6,5,20,7,8}
由于a[]中存储的是数列0,1,2,---,n-l的一个排列,则a[]中的值可分成满足以下
性质的若干组,某组的m个元素il.i2,i3,---,im有如下关系:a[il]=i2,a[i2]=i3,a[i3]
=i4,---,a[im]=i1。
数组a[]的这组值的意义是使数组b[]的元素b[il],b[i2],---,b[im]构成一个传递
环:
b[il]<-b[i2],b[i3]<-b[i3],---,b[im]<-b[il]
为了区别一个元素是否已处理过,程序中给它一个增量n,待全部完成后,再清除设置
的标记;
[程序]
#include<stdio•h>
inta[]={5,0,6,3,2,1,4};
intb[]={3,7,20,5,8,12,6};
void main()
{int i,j,aj,head,n;
n=sizeof(a)/sizeof(a[0]);
for(i=0;i<=n-l;i++)
{if(a>=nll(____)
continue;_____;
j=i;
aj=a[j];
while_____
{_______;
_______;
j=aj;
aj=a[j];
}
b[j]=head;
a[j]+=n;
}
for(i=0;i<n;i++)
if(a>=n) a-=n;
for(i=0;i<n;i++)
printf("%4d",b);
printf("\n");
} |
|