S1E45:单链表1 课后作业

测试题:
0. 相比起数组来说,单链表具有哪些优势呢?

答:长度非固定,可以申请添加长度

答案:对于数组来说,随机插入或者删除其中间的某一个元素,都是需要大量的移动操作,而单链表则完全没有这个问题。
数组插入图示:

单链表插入图示:


1. 相比起单链表来说,数组又具有哪些优势呢?$

答:简单明了

答案:对于单链表来说,随机访问中间的某一个元素,都是需要大量的跳转操作(从第一个元素开始,然后通过指针一个一个往后跳,最后抵达目标位置),而数组则完全没有这个问题(直接通过下标索引值一步到位地访问)。.E


2. 现在要求编写一个记账小程序,那么你应该考虑使用数组还是单链表来存放数据呢?依据是什么?

答:使用单链表,依据是记账是可持续的,存储长度需要可调节

答案:应该使用单链表比较合适,因为记账小程序要求随时可以从中间位置插入数据,并且具有写入操作多(每天记一记),读取操作少(月底看下总结)的特点,所以选择单链表来实现会更合适。
 

3. 请问下面代码存在什么问题?

struct A
{struct B b;
};struct B
{struct A a;
}

答:无限嵌套,死循环

答案:还是无限递归。
解析:在 A 结构体声明中定义 B 结构体,但在 B 结构体中又定义 A 结构体。
这就相当于当某人问你和你女朋友什么时候结婚,你们的回复都是“她/他说什么时候就什么时候,我绝对不会告诉你什么时候”酱紫……

4. 本节视频最后的代码演示中小甲鱼在写 releaseLibrary 函数的时候犯了一个比较明显的错误,你能找出来并改正吗?

答:看不出来(错误

答案:

解析:
从逻辑上来说这是矛盾的:既然 library 指向的堆空间已经释放了,那么 library->next 理论上就是一个不存在的值,又何来 library = library->next; 呢?
应该这么改:

void releaseLibrary(struct Book *library)
{struct Book *temp;while (library != NULL){temp = library;library = library->next;free(temp);}
}

5. 请问下面代码中,为什么 addBook(struct Book **library) 函数要使用两个星号(**)?

#include <stdio.h>
#include <stdlib.h>struct Book
{char title[128];char author[40];struct Book *next;
};void addBook(struct Book **library)
{struct Book *book;book = (struct Book *)malloc(sizeof(struct Book));if (book == NULL){printf("内存分配失败了!\n");exit(1);}strcpy(book->title, "《零基础入门学习C语言》");strcpy(book->author, "小甲鱼");*library = book;book->next = NULL;
}int main(void)
{struct Book *library = NULL;addBook(&library);return 0;
}

答:不理解(错误

答案:这就是传值和传地的区别啦。
上面代码的内存存储结构如下:

但是,如果你把代码改成下面这样(一个星号):

#include <stdio.h>
#include <stdlib.h>struct Book
{char title[128];char author[40];struct Book *next;
};void addBook(struct Book *library)
{struct Book *book;book = (struct Book *)malloc(sizeof(struct Book));if (book == NULL){printf("内存分配失败了!\n");exit(1);}strcpy(book->title, "《零基础入门学习C语言》");strcpy(book->author, "小甲鱼");*library = book;book->next = NULL;
}int main(void)
{struct Book *library = NULL;addBook(library);return 0;
}

那么,内存的存储结构就会变成:

看出区别来了吗?
addBook(library) 传递的是 library 指针的值,也就是把 NULL 传过去了;而 addBook(&library) 传递的是 library 指针的地址,自然,传过去的是指针的地址,那么要接住它就必须使用指向指针的指针(两个星号)啦~H

动动手:
0. 还记得上一节课后作业吗?
我们帮社区大妈编写了一个打疫苗的登记程序^o^Q
不过,那个只是实验品,因为它只能接受 3 个数据(小李、老王和法外狂徒张三)
这次,我们要求使用单链表来动态存储登记的数据(从堆中申请的空间记得在程序结束前要释放哦~)v
程序实现效果:

答:参考答案解答

#include <stdio.h>
#include <stdlib.h>struct Date
{int year;int month;int day;
};struct Record
{char name[16];int age;struct Date first;struct Date second;struct Record *next;};void getInput(struct Record *record)
{char ch;printf("请问姓名是:");scanf("%s",record->name);printf("请问年龄是:");scanf("%d",&record->age);printf("请问是否接种过疫苗(Y/N):");getchar();if(getchar() != 'Y'){record->first.year = 0;printf("请尽快接种疫苗!\n"); 	}else{printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");scanf("%d-%d-%d",&record->first.year,&record->first.month,&record->first.day);printf("请问是否接种第二针疫苗(Y/N):");	getchar();if(getchar() != 'Y'){record->first.year = 0;printf("请尽快接种第二针疫苗!\n"); }else{printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");scanf("%d-%d-%d",&record->second.year,&record->second.month,&record->second.day);}}printf("\n");
}void printRecord(struct Record *head)
{struct Record *record;record = head;while(record != NULL){printf("姓名:%s",record->name);printf("年龄:%d\n",record->age);if(record->first.year == 1){printf("第一针疫苗接种日期:%d-%d-%d\n",record->first.year,record->first.month,record->first.day);if(record->second.year == 1){printf("第一针疫苗接种日期:%d-%d-%d\n",record->second.year,record->second.month,record->second.day);}else{printf("未接种第二针疫苗!\n"); }}else{printf("未接种疫苗!\n"); } record = record->next;}
}void addRecord(struct Record **head)
{struct Record *record, *temp;record = (struct Recoed *)malloc(sizeof(struct Record));if(record == NULL){printf("内存分配失败\n");exit(1); }getInput(record);if(*head != NULL){temp = *head;*head = record;record->next = temp;}else{*head = record;record->next = NULL;}}void releaseRecord(struct Record *head)
{struct Record *temp;while(head != NULL){temp = head;head = head->next;free(temp);}}int main(void)
{struct Record *record;int i,ch;while(1){printf("是否需要录入(Y/N):");do{ch = getchar();}while(ch != 'Y' && ch !='N');if(ch == 'Y'){addRecord(&record);}else{break;}}printf("请问是否需要打印已录入数据(Y/N):");do{ch = getchar();} while (ch != 'Y' && ch != 'N');if (ch == 'Y'){printRecord(record);}releaseRecord(record);return 0;}

答案:

#include <stdio.h>
#include <stdlib.h>struct Date
{int year;int month;int day;
};struct Record
{char name[16];int age;struct Date first;struct Date second;struct Record *next;
};
void getInput(struct Record *record);
void printRecord(struct Record *head);
void addRecord(struct Record **head);
void releaseRecord(struct Record *head);void getInput(struct Record *record)
{printf("请问姓名是:");scanf("%s", record->name);printf("请问年龄是:");scanf("%d", &record->age);printf("请问是否接种过疫苗(Y/N):");getchar();if (getchar() != 'Y'){record->first.year = 0;printf("请尽快接种疫苗!\n");}else{printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");scanf("%d-%d-%d", &record->first.year, &record->first.month, &record->first.day);printf("请问是否接种第二针疫苗(Y/N):");getchar();if (getchar() != 'Y'){record->second.year = 0;printf("请尽快接种第二针疫苗!\n");}else{printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");scanf("%d-%d-%d", &record->second.year, &record->second.month, &record->second.day);}}putchar('\n');
}void printRecord(struct Record *head)
{struct Record *record;record = head;while (record != NULL){printf("姓名:%s,年龄:%d\n", (*record).name, (*record).age);if (record->first.year == 0){printf("未接种疫苗!\n\n");}else{printf("第一针疫苗接种日期:%d-%d-%d,", (*record).first.year, (*record).first.month, (*record).first.day);}if ((*record).first.year != 0 && (*record).second.year == 0){printf("未接种第二针疫苗!\n\n");}else if((*record).first.year != 0){printf("第二针疫苗接种日期:%d-%d-%d\n\n", (*record).second.year, (*record).second.month, (*record).second.day);}record = record -> next;}
}void addRecord(struct Record **head)
{struct Record *record, *temp;record = (struct Record *)malloc(sizeof(struct Record));if (record == NULL){printf("内存分配失败!\n");exit(1);}getInput(record);if (*head != NULL){temp = *head;*head = record;record->next = temp;}else{*head = record;record->next = NULL;}
}void releaseRecord(struct Record *head)
{struct Record *temp;while (head != NULL){temp = head;head = head->next;free(temp);}
}int main(void)
{struct Record *head = NULL;int ch;while (1){printf("请问是否需要录入(Y/N):");do{ch = getchar();} while (ch != 'Y' && ch != 'N');if (ch == 'Y'){addRecord(&head);}else{break;}}printf("请问是否需要打印已录入数据(Y/N):");do{ch = getchar();} while (ch != 'Y' && ch != 'N');if (ch == 'Y'){printRecord(head);}releaseRecord(head);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络攻击攻击之-远程命令执行/RCE告警运营分析篇

在各种网络安全产品的告警中,远程命令执行是一种非常常见的告警。本文将从远程命令执行的定义,远程命令执行利用的流量数据包示例,远程命令执行的suricata规则,远程命令执行的告分析警研判,远程命令执行的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的远程…

深入解析RPC技术:原理、实现与应用

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;允许一个程序&#xff08;客户端&#xff09;在本地调用另一个程序&#xff08;服务器&#xff09;中的函数或方法&#xff0c;并获取返回结果&#xff0c;就像调用…

C++:STL简介和容器string用法篇

一、STL简介 STL是C中的标准模板库&#xff08;Standard Template Library&#xff09;的缩写。它是C标准库的一部分&#xff0c;提供了一系列的数据结构和算法模板&#xff0c;包括各种容器、算法、迭代器、仿函数等&#xff0c;用于简化和加速C程序的开发过程。STL的设计理念…

shell脚本开发基础

shell脚本开发基础 什么是linux内置命令&#xff1f;什么是外置命令 内置命令&#xff1a;在系统启动时就加载入内存&#xff0c;常驻内存&#xff0c;执行效率更高&#xff0c;但是占用资源&#xff0c;cd 外置命令&#xff1a;系统需要从硬盘中读取程序文件&#xff0c;再读…

第八篇【传奇开心果系列】Python微项目技术点案例示例:以微项目开发为案例,深度解读Dearpygui 编写图形化界面桌面程序的优势

传奇开心果博文系列 系列博文目录Python微项目技术点案例示例系列 博文目录前言一、开发图形化界面桌面程序的优势介绍二、跨平台特性示例代码和解析三、高性能特性示例代码和解析四、简单易用特性示例代码和解析五、扩展性强示例代码和解析六、现代化设计示例代码和解析七、知…

什么是云渗透测试?

推荐阅读&#xff1a; 什么是安全态势&#xff1f; 什么是人肉搜索 什么是恶意软件&#xff1f; 什么是数字取证&#xff1f; 什么是语音网络钓鱼&#xff1f; 什么是网络安全中的社会工程&#xff1f; 什么是网络安全中的威胁情报&#xff1f; 什么是端点检测和响应 (…

linux 阿里云服务器安装ImageMagick和php扩展imagick

操作系统版本 Alibaba Cloud Linux 3.2104 LTS 64位 # 1.安装ImageMagick yum install -y ImageMagick ImageMagick-devel # 没有pecl要先安装pecl 和头文件 sudo yum install php-devel # 2.pecl 安装扩展 pecl install imagick #寻找所有php.ini文件 find / -name php.…

静态随机存储器(SRAM)

目录 介绍 基本的 SRAM 存储单元阵列 1. SRAM 存储单元 2. SRAM 阵列 3. SRAM 阵列的读写操作 4. SRAM 阵列的扩展 5. SRAM 阵列的应用 6. SRAM 阵列的优缺点 基本的 SRAM 逻辑结构 1. 存储单元 2. 存储单元阵列 3. 译码器 4. 读写电路 5. 控制逻辑 6. SRAM 逻辑…

【前端之ES6语法】

前端之ES6语法 1. ES6简介2. ES6新特性3.ES6不支持&#xff0c;使用babel3.1 参考文献 4.let和const命令5. 模版字符串6.函数之默认值、剩余参数7. 函数之扩展运算符、箭头函数8.箭头函数this指向和注意事项9.解构赋值10.对象扩展11.Symbol类型12.Set集合类型13.Map数据类型14.…

React自定义Componment和State深层次理解-07

本节主要从底层原理上分析下React开发相关的内容和注意事项&#xff0c;本节会围绕使用展开&#xff0c;而非源码讲解。 Componment详解 什么是组件 在 MVVM架构出现之前&#xff0c;组件主要分为两种。 狭义上的组件&#xff0c;又称为 UI 组件&#xff0c;比如 Tabs 组件、…

Java计算日期相差天数的几种方法

Java计算日期相差天数的几种方法 &#x1f5d3;️ Java计算日期相差天数的几种方法摘要引言一、使用java.util.Date和java.util.Calendar&#x1f4c5;1. 使用java.util.Date示例代码 2. 使用java.util.Calendar示例代码 二、使用java.time.LocalDate&#x1f4c6;示例代码 三、…

微信小程序文本框输入显示已经输入的字数

我们遇到这样的需求&#xff0c;就是微信小程序的输入框下面需要显示输入的字数&#xff1a; 我们通常会使用bindinput事件&#xff0c;让显示的字数等于value的长度&#xff0c;看下面的图&#xff1a; 但在实践中&#xff0c;真机测试中&#xff0c;我们会发现以下问题: 这个…

IP编址、进制转换、IP地址分类、变长子网掩码VLSM、无类域间路由CIDR

前言 网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 IP编址 每个网段上都有两…

Java的类路径究竟是什么?

回答 问了chatgpt这个问题&#xff0c;首先类路径的定义是&#xff1a; 是指一组路径&#xff0c;这些路径告诉Java虚拟机&#xff08;JVM&#xff09;和类加载器在哪里可以找到应用程序所需的类和资源文件。说白了就是在运行java程序的时候需要先将java源代码编译成class文件…

基础IO用户缓冲区 、inode、硬软链接【Linux】

文章目录 用户缓冲区磁盘磁盘分区EXT2文件系统的存储方案 inode软链接硬链接 用户缓冲区 代码一&#xff1a; 1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h> 4 int main()5 {6 const char * fstr &…

基于FIDO2和USBKEY硬件的SSH认证

在 8.2&#xff08;最新为 8.3&#xff09;版本中&#xff0c;OpenSSH 提供了对 FIDO 和 UAF 的支持。从此用户就可以用硬件 USBKEY 证书进行 SSH 原生认证。这样可以实现简捷、有效和安全的 SSH 认证。本文我们就就少一下 FIDO2 以及 OpenSSH 对其的支持&#xff0c;并尝试一下…

【调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件】

调试笔记-系列文章目录 调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件 文章目录 调试笔记-系列文章目录调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、调…

日志的介绍及简单实现

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 日志是什么&#xff1f; 为什么需要日志&#xff1f; 实现一个简单日志 时间戳 clock_gettime time & localtime 可变模板参数(使用C语言)&#xff0c;va_start & va_end & vsprintf 宏 __LINE__…

Digital Image Processing System(DIPS)

数字图像处理系统 Digital Image Processing System&#xff08;DIPS&#xff09; 早前版本&#xff1a; ​​​​​​​DIPS_YTPC OCR-CSDN博客

数据结构和算法|排序算法系列(二)|冒泡排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.3 冒泡排序 我觉得冒泡排序非常有意思&#xff0c;也非常简单&#xff0c;就是不停地交换相邻的元素即可&#…