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;就像调用…

栈和队列的区别

栈和队列是两种常用的数据结构&#xff0c;它们在数据的存取方式、适用场景和基本操作上有显著的区别。以下是它们的详细区别&#xff1a; 1. 存取方式 栈&#xff08;Stack&#xff09;&#xff1a; 后进先出&#xff08;LIFO, Last In First Out&#xff09;&#xff1a;最…

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

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

人形机器人建模与控制(二) - 高级运动学和动态建模

L2: Advanced Kinematic and Dynamic Modeling 这里写目录标题 L2: Advanced Kinematic and Dynamic Modeling1. Introduction2. Kinematic Modeling运动学方程速度的雅可比矩阵雅可比矩阵的两种形式分析雅可比矩阵&#xff08;Analytical Jacobian&#xff09;几何雅可比矩阵&…

【波点音乐看广告】

import uiautomator2 as u2 import time from datetime import datetime import xml.etree.ElementTree as ET import re import os 连接设备 d u2.connect() os.system(‘adb shell chmod 775 /data/local/tmp/atx-agent’) os.system(‘adb shell /data/local/tmp/atx-age…

2024年5月系统架构设计师综合知识真题

1.操作系统:先来先服务调度算法 2.操作系统:多道程序设计&#xff0c;利用率 3.操作系统:状态流转错误的&#xff0c;等待态到运行态 4.数据库:2NF 每一个非主属性完全依赖主键 5.数据库:笛卡尔积m*n 6.数据库:不属于事务的特点&#xff0c;并发性 7.数据库:交集表达式:R-(R-S)…

linux设置不记录历史命令

我们知道Linux历史命令是被保存在内存和各用户家目录下.bash_history文件中&#xff0c;当退出或者登录shell时&#xff0c;其会自动保存或读取。 [rootlogstash ~]# cat .bash_history | tail -n 10 man read touch read.sh chmod 755 read.sh clear vi read.sh sh read.sh…

shell脚本开发基础

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

Fortran: fypp预处理工具

Fortran fypp预处理工具 Fypp基于Python的预处理器工具&#xff0c;不限于语言。利用Python语言&#xff0c;可以批量生成源码 示例 M_logger.fpp module M_loggeruse stdlib_loggeruse stdlib_error contains#:for x,y in [(info,log_information),(debug,log_debug),(warn…

第八篇【传奇开心果系列】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.…

临时存储和永久存储的区别

大家都知道&#xff0c;我们一般在页面传参的时候一般会用到两种方式&#xff01;一种是路径拼接页面传参&#xff0c;还有一种呢&#xff01;就是我们比较常用的存储&#xff0c;通过接口返回过来的数据&#xff0c;我们将它存起来&#xff0c;到其他页面在取出来是很方便的。…

静态随机存储器(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.…

保存ssh的资讯,快速访问linux server的sshpass

安装 sudo apt-get install -y openssh-server sudo apt-get install -y sshpass 假设server的user和密码都是hao&#xff0c;然后server的ip是192.168.0.106 在.bashrc里写入 alias sshnano"sshpass -p hao ssh hao192.168.0.106" #第一次要先运行 ssh hao192…

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;我们会发现以下问题: 这个…