计算机二级C语言上机考试——结构体与链表
- 格式:doc
- 大小:43.00 KB
- 文档页数:3
计算机等级考试二级C语言程序设计专项训练题——单链表一.程序填空题1.给定程序的主函数中,已给出由结构体构成的链表结点a、b、c,各结点的数据域中均存入字符,函数fun的功能是:将a、b、c 三个结点链接成一个单向链表,并输出链表结点中的数据。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!#include <stdio.h>typedef struct list{char data;struct list *next;}Q;void fun(Q *pa, Q *pb, Q *pc){Q *p;/**********found**********/pa->next=___1___;pb->next=pc;p=pa;while( p ){/**********found**********/printf(" %c",____2_____);/**********found**********/p=____3____;}printf("\n");}int main(){Q a, b, c;a.data='E';b.data='F';c.data='G'; c.next=NULL;fun( &a, &b, &c );return 0;}2.给定程序中,函数fun的功能是:统计出带有头结点的单向链表中结点的个数,存放在形参n所指的存储单元中。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!#include <stdio.h>#include <stdlib.h>#define N 8typedef struct list{int data;struct list *next;} SLIST;SLIST *creatlist(int *a);void outlist(SLIST *);void fun( SLIST *h, int *n){SLIST *p;/**********found**********/___1___=0;p=h->next;while(p){(*n)++;/**********found**********/p=p->___2___;}}int main(){SLIST *head;int a[N]={12,87,45,32,91,16,20,48}, num;head=creatlist(a);outlist(head);/**********found**********/fun(___3___, &num);printf("\nnumber=%d\n",num);return 0;}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("The list is NULL!\n");else{printf("\nHead ");do{printf("->%d",p->data);p=p->next;} while(p!=NULL);printf("->End\n");}}3.给定程序中,函数fun的功能是:计算出带头结点的单向链表中各结点数据域之和作为函数值返回。
国家二级C语言机试(结构体、共同体、位运算及文件操作)模拟试卷12(题后含答案及解析)题型有:1. 选择题选择题1.关于typedef的叙述中错误的是( )。
A.用typedef可以为各种类型起别名,但不能为变量起别名B.可以通过typedef增加新的类型C.用typedef定义新的类型名后,原有类型名仍有效D.可以用typedef将已存在的类型用一个新的名字来代表正确答案:B解析:C语言允许用typedef说明一种新类型名或为现有类型起个别名,而不是创建新类型,说明新类型名的语句一般形式为:typedef类型名标识符;在此,“类型名”必须是在此语句之前已有定义的类型标识符。
标识符是一个用户定义标识符,用作新的类型名。
typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。
知识模块:结构体及文件操作2.正确的结构体类型说明和变量定义是( )。
A.typedef struct f{int n;char c;}STR;STR t1,t2;B.struct STR;{int n;char C;};STR t1,t2;C.typedef stmct STR;{int n=0;char c=‘A’;}t1,t2;D.struct{int n;char c;}STR;STR t1,t2;正确答案:A解析:定义结构体类型的一般形式为:struct结构体名{成员列表};struct 结构体名后不能加“:”号。
但定义完之后要在句末加分号,所以选项B、C有误,选项D中定义无名称的结构体类型同时定义结构体变量形式应为“stmct t1,t2;”。
选项A为用户自定义类型,其为正确的定义形式。
知识模块:结构体及文件操作3.若typedef int*T;T a[5];则与a的定义相同的是( )。
A.int*a[5];B.int(*a)[5]C.int,*a;D.int a[5];正确答案:A解析:typedef的主要功能是为存在的类型指定一个新的别名,后面的代码中可以利用该新定义的别名定义变量,题目定义了整型指针类型T,而后利用T 定义了整型指针数组a,含有5个元素,选项A中定义了整型指针数组a,选项B定义了一个指向一维数组的指针a,选项C定义指针变量,而选项D为定义整型数组最常用的形式,数组a中可以存放5个数据元素。
结构体与共用体要点一、概述结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。
把不同类型的数据组合成一个有机的整体,可以用结构体解决。
结构体中的每一项数据,称为结构体“成员”(member)或“分量”。
声明结构体类型的一般形式:struct 结构体名{成员表列};声明各成员的形式:类型名成员名;例如:学生数据struct student{int num;char name[20];char sex;int age;float score;char addr[30];}; 注意不要忽略最后的分号student结构体类型占59个字节。
二、定义结构体类型变量的方法1.先声明结构体类型再定义变量名struct student student1, student2;要求指定为某一特定的结构体类型2.在声明类型的同时定义变量struct 结构体名{成员表列}变量名表列;例如:struct student{int num;char name[20];char sex;int age;float score;char addr[30];} student1, student2;3.直接定义结构体类型变量struct{成员表列}变量名表列;几点说明:(1)类型与变量是不同的概念;(2)结构体中的成员可单独使用,其作用与地位相当于普通变量;(3)成员也可以是一个结构体变量;(4)成员名与普通变量名相同,不代表同一对象。
三、结构体变量的引用(1)不能将结构体变量整体进行输入和输出,只能对各个成员分别进行输入和输出。
printf("%d,%s,%c,%d,%f,%s\n",student1);错误(2)引用成员的方式:结构体变量名.成员名student1.num=10010;当成员是另一个结构体变量时,应一级一级地引用成员。
仅在以下两种情况下,可以把结构体变量作为一个整体来访问。
数据结构:考点1:栈和队列的特点典型题例:(1)栈和队列的共同特点是(栈和队列的特点)A)都是先进先出B)都是先进后出C)只允许在端点处插入和删除元素D)没有共同点解析:栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和删除.二者的区别是:栈只允许在表的一端进行插入或删除操作,是一种"后进先出"的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种"先进先出"的线性表.所以没有共同点(2)下列关于栈叙述正确的是(栈)(11.3)A)栈顶元素最先能被删除B)栈顶元素最后才能被删除C)栈底元素永远不能被删除D)以上三种说法都不对(3)下列叙述中正确的是(栈)(10.9)A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化D)上述三种说法都不对(4)如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是(栈进出顺序)A)e3,e1,e4,e2 B)e2,e4,e3,e1C)e3,e4,e1,e2 D)任意顺序解析:由栈"后进先出"的特点可知:A)中e1不可能比e2先出,C)中e3不可能比e4先出,且e1不可能比e2先出,D)中栈是先进后出的,所以不可能是任意顺序.B)中出栈过程如图所示: (5)一个栈的初始状态为空。
首先将元素5,4,3,2,1依次入栈,然后退栈一次,再将元素A,B,C,D依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为【1】(栈)(10.9)(6) (1)一个队列的初始状态为空,先将元素A,B,C,D,E,F,5,4,3,2,1依次入队,然后再依次退队,则元素退队的顺序为。
(队列)(10.3)(7)设某循环列队的容量为50,如果头指针front=45(指向队头元素的前一位置),尾指针rear=10(指向队尾元素),则该循环队列中共有_____个元素。
1:某学生的记录由学号、8门课程成绩和平均分组成, 学号和8门课程的成绩已在主函数中给出,请编写函数fun,其功能是:求出该学生的平均分,并放入记录的ave成员中。
void fun(STREC *a){int i;a-〉ave=0.0;for(i=0;i〈N;i++)a-〉ave=a->ave+a->s[i];a-〉ave=a-〉ave/N;} 2:N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。
请编写函数fun,其功能是:求出平均分,并由函数值返回。
double fun(STREC *h) {double av=0。
0;STREC *p=h-〉next;while(p!=NULL){av=av+p-〉s; p=p-〉next;}return av/N;}3:学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:把分数最高的学生数据放在b所指的数组中。
注意:分数最高的学生可能不止一个,函数返回分数最高的学生的人数. int fun (STREC *a, STREC *b){int i,j=0,max=a[0].s;for(i=0;i<N;i++)if(max<a[i].s) max=a[i].s;for(i=0;i〈N;i++)if(max==a[i].s) b[j++]=a[i]; return j;}4:学生的记录由学号成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:函数返回该学号的学生数据,指定的学号在主函数中输入。
若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回。
STREC fun(STREC *a, char *b){int i;STREC str={"\0”,-1};if(strcmp(a[i].num,b)==0) str=a[i];return str; }5:学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:按分数降序排列学生的记录,高分在前,低分在后。
国家二级C语言机试(操作题)模拟试卷808(题后含答案及解析) 全部题型 2. 程序填空题 3. 程序修改题 4. 程序设计题程序填空题1.给定程序的主函数中,已给出由结构体构成的链表结点a、b、c,各结点的数据域中均存入字符,函数fun( )的作用是:将a、b、c三个结点链接成一个单向链表,并输出链表结点中的数据。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!试题程序:#include<stdio.h>typedef struct list{char data;struct list *next;}Q;void fun(Q *pa,Q *pb,Q *pc){Q *p;/* * * * * * found * * * * * */pa—>next=___1___;pb—>next=pc:p=pa;while(P){/* * * * * * found * * * * * */printf(″%c″,___2___);/* * * * * * found * * * * * */p=___3___;}printf(″\n″);}main( ){Q a,b,c;a.data=′E′:b.data=′F′;c.data=′G′:c.next=NULL;fun(&a,&b,&c);}正确答案:(1)pb (2)p—>data (3)p—>next解析:填空1:将三个结点连接起来,即将pa的指针域指向pb,pb的指针域指向pc。
填空2:输出链表结点中的数据,表示为p—>data。
填空3:指针后移,指向下一个结点,即p=p—>next。
知识模块:程序填空题程序修改题2.下列给定程序中,函数fun的功能是:计算整数n的阶乘。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include <stdlib.h>#include <stdio.h >double fun(int n){double result=1.0;while(n>1 &&n<170)/* * * * * * found * * * * * */result * =——n;/* * * * * * found * * * * * */return;}void main( ){int n:printf(″Enter an integer:″);scanf(″%d″,&n);printf(″\n%d!=%lg\n″,n ,fun(n));}正确答案:(1)result* =n——;(2)return result;解析:本题考查:复合赋值运算;通过return语句完成函数值的返回。
1:某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出,请编写函数fun,其功能是:求出该学生的平均分,并放入记录的ave成员中。
void fun(STREC *a){int i;a->ave=0.0;for(i=0;i<N;i++)a->ave=a->ave+a->s[i];a->ave=a->ave/N;}2:N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。
请编写函数fun,其功能是:求出平均分,并由函数值返回。
double fun(STREC *h) {double av=0.0;STREC *p=h->next;while(p!=NULL){ av=av+p->s;p=p->next;}returnav/N;}3:学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:把分数最高的学生数据放在b所指的数组中。
注意:分数最高的学生可能不止一个,函数返回分数最高的学生的人数。
int fun (STREC *a, STREC *b){int i,j=0,max=a[0].s;for(i=0;i<N;i++)if(max<a[i].s) max=a[i].s;for(i=0;i<N;i++)if(max==a[i].s) b[j++]=a[i];return j;}4:学生的记录由学号成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:函数返回该学号的学生数据,指定的学号在主函数中输入。
若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回。
STRECfun(STREC *a, char *b){int i;STREC str={"\0",-1};if(strcmp(a[i].num,b)==0) str=a[i];return str;}5:学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:按分数降序排列学生的记录,高分在前,低分在后。
void fun (STREC a[]){int i,j;STREC t;for(i=1;i<N;i++) /for(j=0;j<N-1;j++) if(a[j].s<a[j+1].s){t=a[j];a[j]=a[j+1];a[j+1]=t;}}6:学生的记录由学号和成绩组成。
N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。
double fun (STREC *a,STREC *b, int *n) {int i;double av=0.0;*n=0;for(i=0;i<N;i++)av=av+a[i].s;av=av/N;for(i=0;i<N;i++) if(av<=a[i].s) { b[*n]=a[i];*n=*n+1;}return av;}7:N名学生的成绩已在主函数中放入一个带有头节点的链表结构中,h指向链表的头节点请编写函数fun其功能是:找出学生的最高分,并由函数值返回。
double fun(STREC *h){double max=h->s;while(h!=NULL){ if(max<h->s) max=h->s; h=h->next;}return max;}8:学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,请编写函数fun,其功能是:把分数最低的学生数据放入b所指的数组中,int fun(STREC *a,STREC *b) {int i,j=0,n=0,min;min=a[0].s;for(i=0;i<N;i++) if(a[i].s<min)min=a[i].s; for(i=0;i<N;i++)if(a[i].s==min) { *(b+j)=a[i];j++;n++;} return n;}9:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,编写fun ,功能是:把低于平均分的学生数据放入b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。
double fun(STREC *a, STREC *b, int *n) {inti,j=0;double av=0.0; for(i=0;i<N;i++)av=av+a[i].s;av=av/N;for(i=0;i<N;i++) if(a[i].s<av) b[j++]=a[i];*n=j;return av;}10:学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回int fun (STREC *a, STREC *b, int l, int h ){int i,j=0;for(i=0;i<N;i++)if(a[i].s>=l&&a[i].s<=h) b[j++]=a[i];return j;}11:已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。
请编写函数fun,函数的功能是:找出成绩最低的学生记录,通过形参返回主函数fun(STU a[], STU *s){int i;*s=a[0];for(i=0;i<N;i++) if(s->s>a[i].s) *s=a[i];}12已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。
请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数fun(STU a[], STU *s) {int i;*s=a[0];for(i=0;i<N;i++) if(s->s<a[i].s) *s=a[i];}杂题1.编写函数fun,其功能是:根据以下公式求pi的值(要求精度0.0005,即某项小于0.0005时停止迭代).double s=1.0,s1=1.0;int n=1;while(s1>=eps) {s1=s1*n/(2*n+1); s=s+s1; n++;}return2*s;2请编写函数fun,函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0---p的数组元素平移到数组的最后。
int x,j,ch; for(x=0;x<=p;x++){ch=w[0];for(j=1;j<n;j++){w[j-1]=w[j];}w[n-1]=ch; }3请编写函数fun,该函数的功能是:移动字符串中的内容,移动的规则是把第1—m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。
int i,j; char t;for(i=1;i<=m;i++) {t=w[0]; for(j=1;w[j]!='\0';j++) w[j-1]=w[j];w[j-1]=t; }4请编写函数fun,该函数的功能是:删除一维数组中所有相同的数,使之只剩一个。
数组中的数已按从小到大的顺序排列,函数返回删除后数组中数据的个数。
int i,j=1; for(i=1;i<n;i++)if(a[j-1]!=a[i]) a[j++]=a[i];return j;5请编写函数fun,其功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)long n=0;int flag=1;if(*p=='-') {p++;flag= -1;}else if(*p=='+') p++;while(*p!='\0') {n=n*10+*p-'0'; p++; } return n*flag;6请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。
一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。
int i,j=0; for(i=0;s[i]!='\0';i++) if(s[i]!=' '&&(s[i+1]==' '||s[i+1]=='\0')) j++; return j7请编写函数fun,其功能是:计算并输出当x<0.97时,如下多项式的值,直到|Sn-Sn-1|<0.000001为止。
double fun(double x){double s1=1.0,p=1.0,sum=0.0,s0,t=1.0;int n=1;do{s0=s1;sum+=s0;t*=n;p*=(0.5-n+1)*x;s1=p/t;n++;}while(fabs(s1-s0)>=1e-6);return sum;}8请编写函数fun,其功能是:计算并输出给定数组(长度为9)中相邻两个元素的平均值的平方根之和。
double sum=0.0;int i,j=1;for(i=0;i<9;i++)if(j<=8){sum+=sqrt((x[i]+x[i+1])/2.0);j++; }return sum;9请编一个函数float fun,该函数的功能是对变量h中的值保留2位小数,并对第三位进行四舍五入long t; t=(h*1000+5)/10; return (float)t/10010. 请编写函数fun,该函数的功能是:判断字符串是否为回文,若是则函数返回1,主函数中输出"YES",否则返回0,主函数中输出"NO"。
回文是指顺读和倒读都一样的字符串。
例如,字符串LEVEL是回文,而字符串123312就不是回文。
int fun(char *str) {int i,n=0,fg=1;char *p=str;while(*p) {n++;p++;}for(i=0;i<n/2;i++) if(str[i]==str[n-1-i]) ;else { fg=0;break;}return fg;}11:编写函数fun:w是一个大于10的无符号整数,若w是n位(n>=2)的整数,则函数求出w的后n-1 位的数作为函数值返回。