二级C语言模拟题2018年(67) (总分100,考试时间90分钟)
一、程序填空题
1. 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序链接。函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一个。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 不得增行或删行,也不得更改程序的结构! 给定源程序:
#include<stdio.h> #include<stdlib.h> #define N 8
typedef struet list {int data;
struct list*next; }SLIST;
void fun(SLIST*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**********/ free(______);
/**********found**********/ q=p->______; } else {p=q;
/**********found**********/ q=q->______; } } } }
SLIST*creatlist(int*a) {SLIST*h,*p,*q;int i;
h=p=(SLIST*)malloc(sizeof(SLIST)); for(i=0;i<N;i++)
{q=(SLIST*)malloc(sizeof(SLIST)); q->data=a[i];p->next=q;p=q; }
p->next=0; return h; }
void outlist(SLIST*h) {SLIST*p; p=h->next;
if(p==NULL)printf(\"\\nThe list is NULL!\\n\"); else
{printf(\"\\nHead\");
do{printf(\"->%d\>data);p=p- >next;)while(p!=NULL); printf(\"->End\\n\"); } }
main()
{SLIST*head; int a[N]={1,2,2,3,4,4,4,5}; head=creatlist(a);
printf(\"\\nThe list before deleting:\\n\"); outlist(head); fun(head);
printf(\"\\nThe list after deleting:\\n\"); outlist(head); }
二、程序改错题
1. 给定程序中函数fun的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。
请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行和删行,也不得更改程序的结构! 给定源程序:
#include<stdio.h> #define N 20
void fun(int a[],int n] {int i,j,t,p;
for(j=0;j<n-1;j++){
/************found************/
p=j
for(i=j+1;i<n;i++) if(a[i]<a[p])
/************found************/ p=j;
t=a[p];a[p]=a[j];a[j]=t; } }
main() {
int a[N]={9,6,8,3,-1},i,m=5; printf(\"排序前的数据:\");
for(i=0;i<m;i++)printf(\"%d”,a[i]); printf(\"\\n\"); fun(a,m);
printf(\"排序后的数据:\");
for(i=0;i<m;i++)printf(\"%d\ printf(\"\\n\"); }
三、程序设计题
1. 请编写一个函数fun,它的功能是:求出1到m之间(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。例如,若传送给m的值为50,则程序输出: 7 11 14 21 22 28 33 35 42 44 49
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include<stdio.h> #define M 100
void fun(int m,int*a,int*n) { }
main()
{int aa[M],n,k; fun(50,aa,&n); for(k=0;k<n;k++)
if((k+1)%20==0)printf(\"\\n\"); else printf(\"%4d\ printf(\"\\n\"); }