阅读下列函数说明和C函数,将应填入▁处的字句写在答题纸的对应栏内。
[函数5说明]
函数DeleteNode(Bitree *r,int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为:
typedef struct Tnode{
int data; /*结点的键值*/
struct Tnode *Lchild,*Rchild; / * 指向左、右子树的指针 * /
}*Bitree;
在二叉查找树上删除一个结点时,要考虑三种情况:
①若待删除的结点p是叶子结点,则直接删除该结点;
②若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p;
③若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述①、②情况之一。[函数5]
int DeleteNode(Bitree *r,int e){
Bitree p=* r,pp,s,c;
while( (1) ){/ * 从树根结点出发查找键值为e的结点 * /
pp=p;
if(e<p->data) p=p->Lchild;
else p=p->Rchild
}
if(! p)return-1;/ * 查找失败 * /
if(p->Lchild && p->Rchild){/ * 处理情况③ * /
s= (2) ;pp=p;
while( (3) ){pp=s;s=s->Rchild;}
p->dara=s->data;P=s;
}
/ * 处理情况①、② * /
if( (4) )c=p->Lchild;
else c=p->Rchild
if(p==*r) *r=c;
阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。
【说明】
函数GetDateld(DATE date)的功能是计算并返回指定合法日期date是其所在年份的第几天。例如,date表示2008年1月25日时,函数的返回值为25,date表示2008年3月3日时,函数返回值为63。
函数Kday_Date(int theyear,int k)的功能是计算并返回指定合法年份theyear(theyear≥1900)的第k天(1≤k≤365)所对应的日期。例如,2008年的第60天是2008年2月29日,2009年的第60天是2009年3月
1日。
函数isLeapYear(int y)的功能是判断Y代表的年份是否为闰年,是则返回1,否则返回0。
DATE类型定义如下:
typedef struct{
int year,month,day;
}DATE;
【C函数1】
int GetDateId(DATE date)
{
Const int days_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i,date_id=date.day;
for(i=0;i<____(1)____;i++)
date_id+=days_month[i];
if( ____(2)____&&isLeapYear(date.year))date_id++;
return date_id;
}
【C函数2】
____(3)____Kday_Date(int theyear,int k)
{
int i;
DATE date;
int days_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31);
assert(k>=1&&k<=365&&theyear>=1900);/*不
试题2
阅读下列函数说明和C代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
函数说明
函数sort(iraa[],int n)的功能是对数组a中的a[0]~a[n-1]这n个元素进行排序。排序过程如下:第一趟对所有的偶数下标p,比较a[p]和a[p+1],若a[p]>a[p+1],则将两者交换;第二趟对所有的奇数下标q,比较a[q]和a[q+1),若a[q]>a[q+1),则将两者交换;第三趟对偶数下标,第四趟对奇数下标,……,依次类推,直至整个数组元素有序排列为止。
函数
void sort(iht a[],iht n)
{
int i,j,t,tag=1;
for(j=0;j<n;j++){
for(i= (1) ;i<n-1; (2) ){
if (a[i]>a[i+1])t=a[1];a[i]=a[i+1);a[i+1]=t;tag=0;}
}
tag++;
if( (3) ) break;
}
}
对包含十个元素的数组a采用上述方法排序时,元素间的比较次数最少为 (4) 次,最多为 (5) 次。
我来回答: