1、国家二级 C语言机试(操作题)模拟试卷 156及答案与解析 一、程序填空题 1 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序链接。函数 fun的功能是:删除链表中数据域值相同的结点,使之只保留一个。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! #inolude #iticlude #define N 8 typedef struct list int data; struct list *next; SLIST; void fun (SLIS
2、T *h) SLIST *P, *q; p=h-next; if(P!=NULL) q=p-next; while(q!=NULL) if(P-data=q-data) P-next=q-next; *found* fEee(_1_ ); *found* q=p-_2_; else p=q; *found* q=q-_3_; SLIST *treatlist(int*a) SLIST *h, *P, *q; int i; h=p=(SLIST*)malloc(sizeof(SLIST); for(i=0; idata=ai; P-next=q; p=q; P-next=0; return h;
3、 void outlist (SLIST *h) SLIST *P; p=h-next; if(p=NULL) printf(“ nThe list is NULL! n“); else printf(“ nHead“); do(printf(“- d“, p-data); p=p-next ; while(p!=NULL); printf(“-End n“); main() SLIST *head; int aN=f 1, 2, 2, 3, 4, 4, 4, 5; head=creatlist(a); printf(“ nThe list before deleting: n“); outl
4、ist(head); fun(head); printf(“ nThe list after deleting: n“); outlist(head); 二、程序修改题 2 给定程序 MODI1 C中函数 fun的功能是:用选择法对数组中的 n个元素按从小到大的顺序进行排序。 请修改程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行和删行,也不得更改程序的结构 ! #include #define N 20 void fun(int a, 2nt n) int i, j, t, p; for(j=0; j #define M 100 void fun(int m, i
5、nt *a, int *n) main() int aaM, n, k; void NONO(); fun(50, aa, &n); for (k=0; kdma=q-dam)”成立则应该删除其中一个结点, “p-next=q-next; ”p指向 q的下一个结点,那么 q结点就可以删除了,因此第一空处应该为 “free(q); ”。 第二空:在第一空处, q指向的结点已经被删除,如果要继续循环搜索数据域值相同的结点,那么 q需要重新指向 p的下一个结点,因此第二空处应该为 “q=p-next; ”。 第三空:如果 “if(p-data=q-data)”不成立,那么 p和 q都向结点尾移动一个
6、结点位置,因此第三空处应该是 “q=q-next: ”。 二、程序修改题 2 【正确答案】 (1)p=j; (2)p=i; 【试题解析】 程序利用选择法实现数组中的 n个元素从小到大的排序。 (1)第一个标识下面 “p=j”根据 C语言的语法,不难发现语句结束缺少分号,因此改为 “p=j; ”。 (2)第二个标识下面的 “p=j; ”上两句是以 i作为循环和判断条件,其中语句“for(i=j; in; i+)”和 “if(aiap)”是将第 p个元素 与剩下的所有元素从第 j个以后到最后一个进行循环比较,所以改为 “p=i; ”。 三、程序设计题 3 【正确答案】 int i, j=0; *n=0; for(i=1; i=m; i+) if(i 7=0 i 11=0) aj=i; j+; *n=j; 【试题解析】 该题是求某范围内能被 7或 11整除的数。该程序的解题思路可以分解为以下几步:判断是否被 7整除 判断或者是否被 11整除 按要求返回计算结果。