11.6 综合自测
一、选择题
1.在16位的PC上使用C语言,若有以下定义:
struct data
{ int i;
char ch;
double f;
}b;
则结构变量b占用内存的字节数是( )。
A.1 B.2 C.8 D.11
2.设有以下说明和定义语句,则下面表达式中值为3的是( )。
struct s
{ int i;
struct s *i2;
};
static struct s a[3] ={1,&a[1],2,&a[2],3,&a[0]};
static struct s *ptr;
ptr=&a[1];
A.ptr->i++ B.ptr++->I C.*ptr->i D.++ptr->i
3.有以下程序:
main()
{ union {
unsigned int n;
unsigned char c;
}u1;
u1.c= 'A';
printf("% c\n",u1.n);
}
执行后输出结果是( )。
A.产生语法错误 B.随机值 C.A D.65
4.设有以下说明语句:
struct stu
{ int a;
float b;
}stutype;
则下面的叙述,正确的是( )。
A.struct是结构体类型名 B.structstu是用户定义的结构体变量名
C.stutype是用户定义的结构体变量名 D.a和b都是结构体变量名
5.以下程序输出的结果是( )。
#include <stdio.h>
typedef union
{ long i;
int k[5];
char c;
}DATE;
struct date
{ int cat;
DATE cow;
double dog;
}too;
DATE max;
main()
{ printf("% d\n",sizeof(struct date)+sizeof(max));
}
A.25 B.30 C.18 D.8
6.以下对结构体变量stu1中成员age的非法引用是( )。
struct student
{ int age;
int num;
}stu1,*p;
p=&stu1;
A.stu1.age B.student.age C.p->age D.(*p).age
7.下列程序中,结构体变量a所占内存字节数是( )。
union U
{ char st[4];
int i;
long l;
};
struct A
{ int c;
union U u;
}a;
A.4 B.5 C.6 D.8
8.设有以下说明语句:
struct ex {
int x;float y;char z;
}example;
则下面的叙述中,不正确的是( )。
A.struct是结构体类型的关键字 B.example是结构体类型名
C.x,y,z都是结构体成员名 D.structex是结构体类型名
9.若有下面的说明和定义:
struct test {
int ml;char m2;float m3;
union uu {
char ul[5];
int u2[2];
}ua;
}myaa;
则sizeof(structtest)的值是( )。
A.12 B.16 C.14 D.9
10.已知:
union
{ int i;
char c;
float a;
}test;
则sizeof(test)的值是( )。
A.4 B.5 C.6 D.7
11.以下对C语言中联合类型数据的正确叙述是( )。
A.一旦定义了一个联合变量后,即可引用该变量或该变量中的任意成员
B.一个联合变量中可以同时存放其所有成员
C.一个联合变量中不能同时存放其所有成员
D.联合类型数据可以出现在结构体类型定义中,但结构体类型数据不能出现在联合类型定义中
二、操作题
1.下列给定程序是建立一个带头节点的单向链表,并用随机函数为各节点赋值。函数fun()的功能是将单向链表节点(不包括头节点)数据域为偶数的值累加起来,并且作为函数值返回。
请改正函数fun()中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
}NODE;
int fun(NODE *h)
{ int sum=0;
NODE *p;
p=h->next;
/*****found*****/
while(p->next)
{ if(p->data% 2==0)
sum+ =p->data;
/*****found*****/
p=h->next;
}
return sum;
}
NODE *creatlink(int n)
{ NODE *h,*p,*s;
int i;
h=p=(NODE*)malloc(sizeof(NODE));
for(i=1;i<n;i++)
{ s=(NODE*)malloc(sizeof(NODE));
s->data=rand()% 16;
s->next=p->next;
p->next=s;
p=p->next;
}
p->next=NULL;
return h;
}
outlink(NODE *h)
{ NODE *p;
p=h->next;
printf("\n\nTHE LIST:\n\n HEAD");
while(p)
{ printf("->% d",p->data);
p=p->next;
}
printf("\n");
}
main()
{ NODE *head;
int sum;
head=creatlink(10);
outlink(head);
sum=fun(head);
printf("\nSUM=% d",sum);
}
2.下列给定程序中已建立了一个带头节点的单向链表,链表中的各节点按数据域递增有序链接。函数fun()的功能是:删除链表中数据域值相同的节点,使之只保留一个。
请在标号处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdio.h>
#include <stdlib.h>
#define N 8
typedef struct 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;
free(【1】);
q=p->【2】;
}
else
{ p=q;
q=q->【3】;
}
}
}
}
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",p->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);
}