国家二级C语言机试(操作题)模拟试卷718
程序填空题
1.给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为:10、8、6、4、2。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
1 #include<stdio.h>
2 #include<stdlib.h>
3 #define N 5
4 typedef struct node {
5 int data;
6 struct node *next;
7 } NODE;
8 void fun(NODE *h)
9 { NODE *p,*q,*r;
10 /**********found**********/
11 p=h->__1__;
12 /**********found**********/
13 if(p==__2__)return;
14 q=p->next;
15 p->next=NULL;
16 while(q)
17 { r=q->next;q->next=p;
18 /**********found**********/
19 p=q;q=__3__;
20 }
21 h->next=p;
22 }
23 NODE *treatliSt(int a[])
24 { NODE *h,*p,*q;int i;
25 h=(NODE *)malloc(sizeof(NODE));
26 h->hext=NULL;
27 for(2=0;i<N;i++)
28 {q=(NODE *)malloc(sizeof(NODE));
29 q->data=a[i];
30 q->next=NULL;
31 if(h->next==NULL)h->next=p=q;
32 else{p->next=q;p=q;}
33 }
34 return h;
35 }
36 void outlist(NODE *h)
37 {NODE *p;
38 p=h->next;
39 if(p==NULL)printf(’’The list is NULL!\n’’);
40 else
41 {printf(’’\nHead’’);
42 do
43 {printf(’’->%d’’,p->data);p=p->next;}
44 while(p!=NULL);
45 printf(’’->End\n’’);
46 }
47 }
48 main()
49 {NODE *head;
50 int a[N]={2,4,6,8,10};
51 head=creatlist(a);
52 printf(’’\nThe original list:\n’’);
53 outlist(head);
54 fun(head);
55 printf(’’\nThe list after inverting:\n’’);
56 outlist(head);
57 }
(1)next
(2)0或NULL
(3)r
解析:函数fun的功能是将带头结点的单向链表逆置。第一空:“p=h->__1__;”对结点p进行初始化,由审题分析可知,p初始化为链表的第二个结点,即p->next,故第一空处应为“next”。第二空:“if(p==__2___)return;”如果链表只有一个结点,无需逆置,即第二空处为“0”或“\0”或“NULL”。第三空:循环内完成结点的指针指向前一个结点,“r=q->next;”r已经指向q的下一个结点,“q->next=p;”将q结点指向链表的前一个结点,“p=q;”是将p结点往后移动一个结点位置,第三空处是q结点往后移动一个结点位置,即第三空处为“r”。
程序修改题
2.给定程序MODI1.C中函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
1 #include<stdio.h>
2 #include<string.h>
3 #define N 80
4 int fun(char *s,char *t)
5 { int n;
6 char *p,*r;
7 n=0;
8 while(*s)
9 {p=s;
10 /**********found**********/
11 r=p;
12 while(*r)
13 if(*r=*p) {r++;p++;}
14 else break;
15 /**********found**********/
16 if(*r=0)
17 n++;
18 s++;
19 }
20 return n;
21 }
22 main()
23 { char a[N],b[N];int m;
24 printf(’’\nPlease enter string a:’’);gets(a);
25 printf(’’\nPlease,enter substring b:’’);gets(b);
26 m=fun(a,b);
27 printf(’’\nThe resuit is :m=%d\n’’,m);
28 }
(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
本文档预览:3600字符,共5227字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载