国家二级C语言机试(操作题)模拟试卷358
程序填空题
1.给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为:10、8、6、4、2。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANKI.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
#define N 5
typedef struct node {
int data;
struct node *next;
} NODE;
void fun (NODE *h)
{NODE *p,*q *r;
p = h—> ____1____ ;
if (p==—2 ) return;
q = p—>next;
p—>next = NULL;
while (q)
{ r = q—>next; q—>next = p;
}
h—>next= p;
NODE *creatlist (int a [ ] )
{NODE *h,*p,*q; int i;
h = (NODE *) malloc (sizeof (NODE)) ;
h—>next= NULL;
{ q= (NODE *) malloc (sizeof (NODE)) ;
q—>data=a [i] ;
q—>next = NULL;
if (h—>next == NULL) h—>next =p = q;
else {p—>next = q; p = q; }
return h;
}
void outlist (NODE *h)
{NODE *p;
p =h—>next;
if (p==NULL) printf(\\
(1) next
(2)0或NULL
(3)r
解析:函数fun的功能是将带头结点的单向链表逆置。
第一空:“p=h—>____1____;”对结点p进行初始化,由审题分析可知,p初始化为链表的第二个结点,即p—>next,故第一空处应为“next”。
第二空:“if(p==____2____)return; ”如果链表只有一个结点,无需逆置,即第二空处为“0”或“\\\\0”或“NULL”。
第三空:循环内完成结点的指针指向前一个结点,“Fq—>next; ”r已经指向q的下一个结点,“q—>next=p; ”将q结点指向链表的前一个结点,“p=q; ”是将p结点往后移动一个结点位置,第三空处是q结点往后移动一个结点位置,即第三空处为“r”。
程序修改题
2.给定程序MODI1.C中函数fun的功能是:计算s所指字符串中含有t所指字符串的数日,并作为函数值返回。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#define N 80
int fun (char *s f char *t)
{ int n;
char *p ,*r;
n=0;
while (*s)
{p=s;
/*********found**********/
r=p;
while (*r)
else break;
/*********found**********/
if(*r=0)
n++;
s++;
}
return n;
}
main ()
{ char a [N] ,b [NJ ; int m;
printf(\\
(1)r=t;
(2)if(* r==0)
解析:函数的功能是计算字符串中含有某子串的数目。
(1)根据“while(*r)if(*r==*p){r++;p++;}”可知该循环是比较r和p指向的字符串是否相等,本题的要求是计算字符串中含有某子串的数目,p指向的源字符串s,所以r应指向的是字符串t,故第一标识下应改成“r=t;”。
(2)根据题意第二标识下“if(*r=0)”应该是判断r是否指向字符串尾,在C语言中,等于是用“==”标识,因此第二标识下应改成“if(*r==0)”。
程序设计题
3.请编写函数fun,函数的功能是:将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。
例如,字符串数组中的M个字符串为
AAAA
BBBBBBB
CC
则合并后的字符串的内容应是:AAAABBBBBBBCC。
提示:strcat(a,b)的功能是将字符串b复制到字符串a的串尾上,成为一个新串。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#define M 3
#define N 20
void fun(char a[M] [N],char *b)
{
main ()
{ char w[M] [N] ={ \\
1 int i,j,k=0;
2 for(i=0;i<M;i++)
3 { for(j=0; j<N;j++)
4 if(* (* (a+i)+j))
5 //如果不指向行的尾
6 { b[k]=* (* (a+i)+j);
7 //将行中的值赋值给数组b
8 k++;)//数组下标加1____9____ else//如果指向尾,则跳出这一行
10 break;
11 b[k]=’\\\\0’;}//数组加尾符
解析:(1)二维字符数组第i行j列元素a[i][j],就是指针形式的“*(*(a+i)+j)”。因此,如果字符“*(*(a+i)+j)”是串的结束符,则说明该字符串已经结束。
(2)当一维字符数组存放完字符串中各字符后,必须在一维字符数组的尾字符处加一个结束符“’\\\\0’”,才能把字符数组变成字符串。否则,字符数组就只能是非字符串的一般字符数组。
本文档预览:3600字符,共3572字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载