}a,b,c,*p,*q;
且变量a和b之间已有如图所示的链表结构:
a b
data next data next
┌─────┐ ┌─────┐
│ 5 | ------→ │ 9 | │
└─────┘ └─────┘
c
data next
┌─────┐
│ 7 | │
└─────┘
↑q
指针p指向变量a,q指向变量c。则能够把c插入到a和b之间并形成新的链表的语句组是______。
A)a.next=c; c.next=b;
B)p.next=q; q.next=p.next;
C)p->next=&c; q->next=p->next;
D)(*p).next=q; (*q).next=&b;
【答案】D。
【解析】本题考的是指针的运用。
答案为D,即先将元素a的指针指向q指针所指向的元素即c,然后将c的指针指向b元素,采取的是直接取元素地址的方式。
55. 设有以下说明语句
typedef struct
{ int n;
char ch[8];
}PER;
则下面叙述中正确的是______。
A)PER是结构体变量名
B)PER是结构体类型名
C)typedef struct是结构体类型
D)struct是结构体类型名
【答案】B。
【解析】本题考的是用typedef定义新的类型名。
C语言允许在程序中用typedef来定义新的类型名来代替已有的类型名。题目中将一个结构体类型定义为PER,以后就可以用PER来定义变量了。
56. 有以下程序
struct STU
{char num[10]; float score[3]; }
main()
{struct STU s[3]={{"20021",90,95,85},
{"20022",95,80,75},
{"20023",100,95,90}},*p=s;
int i; float sum=0;
for(i=0;i<3;i++)
sum=sum+p->score[i];
printf("%6.2f\n",sum);
}
程序运行后的输出结果是______。
A)260.00
B)270.00
C)280.00
D)285.00
【答案】B。
【解析】本题的考查点是结构体数组。
通过for循环计算第一个学生的总分,又因为sum定义的是实型变量,所以最后结果应为实型数据。
57. 设有如下定义:
struct sk
{int a;
float b;
}data;
int *p;
若要使p指向data中的a域,正确的赋值语句是______。
A)p=&a;
B)p=data.a;
C)p=&data.a;
D)*p=data.a
【答案】C。
【解析】本题的考查点是指向结构体变量的指针。
将data.a的起始地址赋给指针变量p,也就是使p指向data.a。
58. 有以下程序
#include <stdlib.h>
struct NODE
{int num; struct NODE *next; }
main()
{struct NODE *p,*q,*r;
p=(struct NODE *)malloc(sizeof(struct NODE));
q=(struct NODE *)malloc(sizeof(struct NODE));
r=(struct NODE *)malloc(sizeof(struct NODE));
p->num=10;q->num=20;r->num=30;
p->next=q;q->next=r;
printf("%d\n",p->num+q->next->num);
}
程序运行后的输出结果是______。
A)10 B)20 C)30 D)40
【答案】D。
【解析】本题的考查点是用指针处理链表。
p->num即为10,q->next->num即为r->num,为30,所以p->num+q->next->num=10+30=40。
59. 若有以下说明和定义:
typedef int *INTEGER;
INTEGER p,*q;
以下叙述正确的是______。
A)p是int型变量
B)p是基类型为int的指针变量
C)q是基类型为int的指针变量
D)程序中可用INTEGER代替int类型名
【答案】B。
【解析】本题的考查点是别名。
p是基类型为int的指针变量;
*q是基类型为int的指针变量;
程序中可用*INTEGER代替int类型名。
60. 设有如下说明
typedef struct
{int n;char c;double x;}STD;
则以下选项中 ,能正确定义结构体数组并赋初值的语句是______。
A)STD tt[2]={{1,'A',62},{2,'B',75}};
B)STD tt[2]={1,"A",62,2,"",75};
C)struct tt[2]={{1,'A'},{2,'B'}};
D)struct tt[2]={{1,"A",62.5},{2,"B",75.0}};
【答案】A。
【解析】本题的考查点是类型定义typedef的使用。
该题定义了一个新结构体类型STD,包含三个结构体成员:整型变量n、字符型变量C)双精度型变量x。用STD来定义变量或数组的使用方法是新结构体类型名加上变量名或数组名,因此选项C)D不正确;字符常量是由一对单引号括起来的单个字符,而字符串常量是一对双引号括起来的字符序列,所以选项B不正确。
61. 有以下程序
main()
{ union{ unsigned int n;
unsigned char c;
}ul;
ul.c='A';
printf("%c\n",ul.n);
}
执行后输出结果是______。
A)产生语法错
B)随机值
C)A
D)65
【答案】C。
【解析】本题的考查点是共用体类型数据的特点。
共用体类型数据的结构特点是几个不同的变量共占同一段内存,即共用体变量的地址和它的各成员的地址都是同一地址,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。所以该程序中有效的赋值语句是ul.c='A';,最终打印出来的是字符A。
62. 若要说明一个类型名STP,使得定义语句STP s;等价于char *s;,以下选项中正确的是______。
A)typedef STP char *s;
B)typedef *char STP;
C)typedef STP *char;
D)typedef char* STP ;
【答案】D。
【解析】本题的考查点是类型定义typedef。
C语言用类型定义把已有的类型标识符定义成新的类型标识符,经类型定义后,新的类型标识符即可当做原标识符使用。它的一般形式为:
typedef 原类型标识符 新类型标识符
定义一个新的类型名的方法是:
1)先按定义变量(对字符指针类型方法相同)的方法写出定义体(如:char *s;);
2)将变量名换成新类型名(如:将s换成STP);
3)在最前面加上typedef(如:typedef char *STP;)。
63. 设有如下定义:
struct ss
{ char name[10];
int age;
char sex;
} std[3],*p=std;
下面各输入语句中错误的是______。
A)scanf("%d",&(*p).age);
B)scanf("%s",&std.name);
C)scanf("%c",&std[0].sex);
D)scanf("%c",&(p->sex));
【答案】B。
【解析】本题的考查点是结构体数组的引用。
在C语言中,结构体变量的引用有三种等价方式:
1)结构体变量.成员名;
2)(*p).成员名;
3)p->成员名。
其中(*p)表示p指向的结构体变量。结构体数组的引用方法和结构体变量的引用类似,根据格式输入函数scanf()的特点,地址表列是由若干个地址组成的表列。题目中的 *p=std;表示p指向结构体数组std,选项A)D正确;C语言中规定第一个元素的地址即为该数组的首地址,所以选项C也正确。
64.有以下结构体说明和变量定义,如下图所示,指针p、q、r分别指向一个链表中的三个连续结点。
struct node
{ int data;
struct node *next;
}*p,*q,*r;
data next data next data next
┌─┬─┐ ┌─┬─┐ ┌─┬─┐
─→│ │ ┼→│ │ ┼→│ │ ┼→
└─┴─┘ └─┴─┘ └─┴─┘
↑p ↑q ↑r
现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下错误的程序段是______。
A)r->next=q;q->next=r->next;p->next=r;
B)q->next=r->next;p->next=r;r->next=q;
C)p->next=r;q->next=r->next;r->next=p;
D)q->next=r->next;r->next=q;p->next=r;
【答案】A。
【解析】本题的考查点是指向结构体变量的指针以及用指针处理链表。
一个结构体变量的指针就是该变量所占据的内存字段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组的元素。
在C语言中,q->next相当于(*q).next。即:q所指向的是结构体变量中的next成员。
链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它根据需要开辟内存单元。链表中的各元素在内存中可以不是连续存放的。所以必须利用指针变量才能实现。即:一个结点中应包括一个指针变量,
用它存放下一结点的地址。
r->next=q表示让q指向新开辟的结点,r指向链表中最后一个结点,把r所指的结点连接在q所指的结点后面。同样,p->next=r表示让r指向新开辟的结点,p指向链表中最后一个结点,把p所指的结点连接在r所指的结点后面。那么在A中,执行r->next=q后,r->next指向了q。此时第2句相当于q->next=q;所以q的下一个结点指向了自己,而不是指向原来r的下一个结点。
二、填空题
1.以下程序中函数fun的功能是:构成一个如图所示的带头结点的单向链表,在结点数据域中放入了具有两个字符的字符串。函数disp的功能是显示输出该单链表中所有结点中的字符串。请填空完成函数disp。
#include <stdio.h>
typedef struct node /* 链表结点结构 */
{ char sub[3];
struct node *next;
} Node;
Node fun(char s) /* 建立链表 */
{ ?? }
void disp(Node *h)
{ Node *p;
p=h->next;
)
bbs.99jianzhu.com内容:建筑图纸、PDF/word 流程,表格,案例,最新,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。