第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; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第42练 单元9 链表《C语言程序设计》(高教版第2版)一课一练-第1页
1
第42练 单元9 链表《C语言程序设计》(高教版第2版)一课一练-第2页
2

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。