第42练 单元9 链表《C语言程序设计》(高教版第2版)一课一练
|
2份
|
9页
|
27人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元9的第42练,内容涵盖单元9“学生信息管理系统”的数据存储的9.2.4 链表。
《C语言程序设计》(高教版第2版)一课一练 第42练
单元9 “学生信息管理系统”的数据存储
9.2.4 链表
1、 单项选择题(本题共5小题)
1、下列关于数组和链表的描述中,正确的是( )
A. 数组插入元素时不需要移动其他元素,效率更高
B. 链表的存储空间是连续的,访问速度更快
C. 链表不需要预先确定存储长度,可动态分配空间
D. 数组的空间利用率一定比链表高
【答案】C
【解析】数组插入或删除元素时,后续元素需移动,效率低,A 错误;链表存储空间不连续,通过指针访问,B 错误;链表可动态分配节点空间,无需预先确定长度,C 正确;若数组定义过大造成内存浪费,空间利用率可能低于链表,D 错误。
2、单向链表的每个节点必须包含的组成部分是( )
A. 数据域和指针域
B. 头指针和数据域
C. 指针域和头指针
D. 仅数据域即可
【答案】A
【解析】单向链表的节点由存储数据的 “数据域” 和指向下一个节点的 “指针域” 组成,头指针是指向链表第一个节点的指针,不属于节点的组成部分,因此正确选项为 A。
3、使用头插入法构建单向链表时,节点的存储顺序与数据输入顺序的关系是( )
A. 完全一致
B. 完全相反
C. 随机顺序
D. 前半部分一致,后半部分相反
【答案】B
【解析】头插入法每次将新节点插入到链表表头,最先输入的数据会被后续插入的节点挤到链表尾部,最后输入的数据位于链表头部,因此节点存储顺序与输入顺序完全相反。
4、在 C 语言中,使用 malloc 函数为链表节点分配内存时,需要进行强制类型转换的原因是( )
A. malloc 函数返回 void类型,需转换为对应结构体指针类型
B. 为了提高内存分配的效率
C. 避免出现内存泄漏
D. 让编译器自动初始化节点数据
【答案】A
【解析】malloc 函数的返回值是 void类型(无类型指针),而链表节点通常是自定义结构体类型,因此需要将其强制转换为结构体指针类型,才能正确指向节点存储空间,A 正确;强制转换不影响分配效率、内存泄漏或初始化,B、C、D 错误。
5、下列用于遍历单向链表的循环条件中,正确的是( )
A. for (; p->next != NULL; p=p->next)
B. for (; p != NULL; p=p->next)
C. for (; p != 0; p=p->next)
D. for (; p->next; p=p->next)
【答案】B
【解析】遍历链表时需要访问每个节点,包括最后一个节点(其指针域为 NULL),因此循环条件应判断当前指针 p 是否不为 NULL,这样才能遍历到所有节点。选项 A、D 会遗漏最后一个节点,选项 C 中用 0 表示 NULL 不够规范,C 语言中通常用 NULL 表示空指针,因此正确选项为 B。
2、 判断题(本题共4题)
1、单向链表的头指针 head 初始值应设为 NULL,表示链表为空。( )
【答案】√
【解析】当链表为空时,没有任何节点,头指针不指向任何存储空间,因此初始值设为 NULL 是正确的。
2、使用头插入法构建的单向链表,节点的存储顺序与数据输入顺序完全一致。( )
【答案】×
【解析】头插入法每次将新节点插入到链表表头,最先输入的数据会被放到链表尾部,最后输入的数据在表头,因此存储顺序与输入顺序完全相反。
3、单向链表的最后一个节点的指针域必须设置为 NULL,标志链表的结束。( )
【答案】√
【解析】最后一个节点没有后续节点,将其指针域设为 NULL,遍历链表时以此作为终止判断条件,确保不会访问非法内存。
4、链表的存储空间是连续的,因此可以像数组一样通过下标直接访问节点。( )
【答案】×
【解析】链表的节点存储空间是动态分配的,不连续,只能通过指针依次访问节点,无法通过下标直接访问,这是链表与数组的核心区别之一。
3、 程序填空题(本题共1题)
1、题目描述:以下程序使用头插入法构建存储学生学号和姓名的单向链表,输入学号为 “#” 时结束输入,最后调用 display 函数遍历并打印所有学生信息,请补充缺失代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct Student {
char num[10];
char name[20];
(1)____; // 指针域,指向下一个学生节点
};
// 创建链表函数
struct Student* createList() {
struct Student *head = NULL;
struct Student *p;
char num[10];
printf("请输入学生学号(输入#结束):");
scanf("%s", num);
while (strcmp(num, "#") != 0) {
// 分配节点内存
p = (2)____malloc(sizeof(struct Student));
if (p == NULL) {
printf("内存分配失败!
");
exit(1);
}
// 复制学号到节点
strcpy(p->num, num);
printf("请输入学生姓名:");
scanf("%s", p->name);
// 头插入操作
(3)____;
head = p;
// 继续输入下一个学号
printf("请输入学生学号(输入#结束):");
scanf("%s", num);
}
return head;
}
// 遍历打印链表函数
void display(struct Student *head) {
struct Student *p = head;
printf("
班级学生信息如下:
");
// 遍历链表
for (; (4)____; p = p->next) {
printf("学号:%s,姓名:%s
", p->num, p->name);
}
}
int main() {
struct Student *list;
list = createList();
display(list);
return 0;
}
【答案】
(1) struct Student *next
(2) (struct Student*)
(3) p->next = head
(4) p != NULL
【解析】
(1)此处需要定义结构体的指针域,用于指向下一个 Student 类型的节点,因此声明为struct Student *next。
(2)malloc 函数返回 void类型,需强制转换为 struct Student类型,才能赋值给指针 p,因此填写(struct Student*)。
(3)头插入法中,需先将新节点的指针域指向当前链表的表头(即 head 指向的节点),这样才能将新节点与原链表连接,因此填写p->next = head。
(4)遍历链表时,循环条件需判断当前指针 p 是否不为 NULL,确保遍历到所有节点(包括最后一个节点),因此填写p != NULL。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元9的第42练,内容涵盖单元9“学生信息管理系统”的数据存储的9.2.4 链表。
《C语言程序设计》(高教版第2版)一课一练 第42练
单元9 “学生信息管理系统”的数据存储
9.2.4 链表
1、 单项选择题(本题共5小题)
1、下列关于数组和链表的描述中,正确的是( )
A. 数组插入元素时不需要移动其他元素,效率更高
B. 链表的存储空间是连续的,访问速度更快
C. 链表不需要预先确定存储长度,可动态分配空间
D. 数组的空间利用率一定比链表高
2、单向链表的每个节点必须包含的组成部分是( )
A. 数据域和指针域
B. 头指针和数据域
C. 指针域和头指针
D. 仅数据域即可
3、使用头插入法构建单向链表时,节点的存储顺序与数据输入顺序的关系是( )
A. 完全一致
B. 完全相反
C. 随机顺序
D. 前半部分一致,后半部分相反
4、在 C 语言中,使用 malloc 函数为链表节点分配内存时,需要进行强制类型转换的原因是( )
A. malloc 函数返回 void类型,需转换为对应结构体指针类型
B. 为了提高内存分配的效率
C. 避免出现内存泄漏
D. 让编译器自动初始化节点数据
5、下列用于遍历单向链表的循环条件中,正确的是( )
A. for (; p->next != NULL; p=p->next)
B. for (; p != NULL; p=p->next)
C. for (; p != 0; p=p->next)
D. for (; p->next; p=p->next)
2、 判断题(本题共4题)
1、单向链表的头指针 head 初始值应设为 NULL,表示链表为空。( )
2、使用头插入法构建的单向链表,节点的存储顺序与数据输入顺序完全一致。( )
3、单向链表的最后一个节点的指针域必须设置为 NULL,标志链表的结束。( )
4、链表的存储空间是连续的,因此可以像数组一样通过下标直接访问节点。( )
3、 程序填空题(本题共1题)
1、题目描述:以下程序使用头插入法构建存储学生学号和姓名的单向链表,输入学号为 “#” 时结束输入,最后调用 display 函数遍历并打印所有学生信息,请补充缺失代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct Student {
char num[10];
char name[20];
(1)____; // 指针域,指向下一个学生节点
};
// 创建链表函数
struct Student* createList() {
struct Student *head = NULL;
struct Student *p;
char num[10];
printf("请输入学生学号(输入#结束):");
scanf("%s", num);
while (strcmp(num, "#") != 0) {
// 分配节点内存
p = (2)____malloc(sizeof(struct Student));
if (p == NULL) {
printf("内存分配失败!
");
exit(1);
}
// 复制学号到节点
strcpy(p->num, num);
printf("请输入学生姓名:");
scanf("%s", p->name);
// 头插入操作
(3)____;
head = p;
// 继续输入下一个学号
printf("请输入学生学号(输入#结束):");
scanf("%s", num);
}
return head;
}
// 遍历打印链表函数
void display(struct Student *head) {
struct Student *p = head;
printf("
班级学生信息如下:
");
// 遍历链表
for (; (4)____; p = p->next) {
printf("学号:%s,姓名:%s
", p->num, p->name);
}
}
int main() {
struct Student *list;
list = createList();
display(list);
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$