第 2 章 线性表(学生健康登记表实现)
1. 示例代码
1) status.h
/* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H
#define STATUS_H/* 函数结果状态码 */
#define TRUE 1 /* 返回值为真 */
#define FALSE 0 /* 返回值为假 */
#define RET_OK 0 /* 返回值正确 */
#define INFEASIABLE 2 /* 返回值未知 */
#define ERR_MEMORY 3 /* 访问内存错 */
#define ERR_NULL_PTR 4 /* 空指针错误 */
#define ERR_MEMORY_ALLOCATE 5 /* 内存分配错 */
#define ERR_NULL_STACK 6 /* 栈元素为空 */
#define ERR_PARA 7 /* 函数参数错 */
#define ERR_OPEN_FILE 8 /* 打开文件错 */
#define ERR_NULL_QUEUE 9 /* 队列为空错 */
#define ERR_FULL_QUEUE 10 /* 队列为满错 */
typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如 RET_OK 等 */
typedef int Bollean; /* Boolean 是布尔类型,其值是 TRUE 或 FALSE */#endif // !STATUS_H
2) singleLinkList.h
/* 线性表的单链表存储结构头文件 */#ifndef SINGLELINKLIST_H
#define SINGLELINKLIST_H#include "status.h"#define NAMELEN 20 /* 姓名最大长度 */
#define CLASSLEN 10 /* 班级名最大长度 */
#define HEALTHLEN 10 /* 健康状态字符长度 */
#define N 4 /* 学生个数 */typedef struct {char name[NAMELEN];long studentId;char sex;int age;char className[CLASSLEN];int healthState;
} StudentInfo;typedef StudentInfo ElemType;typedef struct LNode {ElemType data;struct LNode *next;
} *LinkList;/* 辅助函数,创建一个新的节点 */
LinkList MakeNewLNode(ElemType e);/* 操作结果:构造一个空的线性表 L */
Status InitList(LinkList *L);/* 初始条件:线性表 L 已存在。操作结果:销毁线性表 L */
Status DestroyList(LinkList *L);/* 初始条件:线性表 L 已存在。操作结果:将 L 重置为空表 */
Status ClearList(LinkList L);/* 初始条件:线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE */
Status ListEmpty(LinkList L);/* 初始条件:线性表 L 已存在。操作结果:返回 L 中数据元素个数 */
int ListLength(LinkList L);/* 算法 2.8,L 为带头结点的单链表的头指针。当第 i 个元素存在时, 其值赋给 e 并返回 OK,否则返回 ERROR */
Status GetElem(LinkList L, int i, ElemType *e);/* 初始条件: 线性表 L 已存在, compare() 是数据元素判定函数(满足为 1,否则为 0)操作结果: 返回 L 中第 1 个与 e 满足关系 compare() 的数据元素的位序。若这样的数据元素不存在,则返回值为 0 */
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType));/* 算法 2.9,在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e */
Status ListInsert(LinkList L, int i, ElemType e);/* 算法 2.10,在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返回其值 */
Status ListDelete(LinkList L, int i, ElemType* e);/* 按学号非降序插入 */
void InsertAscend(LinkList L, ElemType e);#endif
3) singleLinkList.c
/* 线性表的单链表存储结构源文件实现 */#include "singleLinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>/* 辅助函数,创建一个新的节点 */
LinkList MakeNewLNode(ElemType e)
{LinkList newLNode = (LinkList)malloc(sizeof(struct LNode));if (!newLNode) {printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);return NULL;}newLNode->data = e;newLNode->next = NULL;return newLNode;
}/* 操作结果:构造一个空的线性表 L */
Status InitList(LinkList *L)
{*L = (LinkList)malloc(sizeof(struct LNode));if (!(*L)) {printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);return ERR_MEMORY_ALLOCATE;}(*L)->next = NULL;return RET_OK;
}/* 初始条件:线性表 L 已存在。操作结果:销毁线性表 L */
Status DestroyList(LinkList *L)
{LinkList q;while (*L) {q = (*L)->next;free(*L);*L = q;}return RET_OK;
}/* 初始条件:线性表 L 已存在。操作结果:将 L 重置为空表 */
Status ClearList(LinkList L)
{LinkList p, q;p = L->next;while (p) {q = p->next;free(p);p = q;}L->next = NULL;return RET_OK;
}/* 初始条件:线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE */
Status ListEmpty(LinkList L)
{if (L->next) {return FALSE;}return TRUE;
}/* 初始条件:线性表 L 已存在。操作结果:返回 L 中数据元素个数 */
int ListLength(LinkList L)
{int count = 0;LinkList p = L->next;while (p) {++count;p = p->next;}return count;
}/* 算法 2.8,L 为带头结点的单链表的头指针。当第 i 个元素存在时, 其值赋给 e 并返回 RET_OK,否则返回 ERROR */
Status GetElem(LinkList L, int i, ElemType *e)
{int j = 1;LinkList p = L->next;while (p && j < i) {p = p->next;++j;}if (!p || j > i) { /* j > i 适用于 i < 1 时,如 i = 0 */printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);return ERR_PARA;}*e = p->data;return RET_OK;
}/* 初始条件: 线性表 L 已存在, compare() 是数据元素判定函数(满足为 1,否则为 0)操作结果: 返回 L 中第 1 个与 e 满足关系 compare() 的数据元素的位序。若这样的数据元素不存在,则返回值为 0 */
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{int i = 0;LinkList p = L->next;while (p) {++i;if (compare(p->data, e)) {return i;}p = p->next;}return 0;
}/* 算法 2.9,在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e */
Status ListInsert(LinkList L, int i, ElemType e)
{int j = 0;LinkList p = L;while (p && j < i - 1) {++j;p = p->next;}if (!p || j > i - 1) { /* 超出表长或者 i < 1 */printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);return ERR_PARA;}LinkList newLNode = MakeNewLNode(e);if (!newLNode) {printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);return ERR_MEMORY_ALLOCATE;}newLNode->next = p->next;p->next = newLNode;return RET_OK;
}/* 算法 2.10,在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返回其值 */
Status ListDelete(LinkList L, int i, ElemType *e)
{int j = 0;LinkList p = L;while (p->next && j < i - 1) {++j;p = p->next;}if (!p->next || j > i - 1) { /* 理论上 j 最多只能等于 i - 1, 但此处当参数不合法时可用, 建议单独判断参数合法性 */printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);return ERR_PARA;}LinkList q = p->next;p->next = q->next;*e = q->data;free(q);return RET_OK;
}/* 初始条件:线性表 L 已存在操作结果:依次对 L 的每个数据元素调用函数 vi()。一旦 vi() 失败,则操作失败 */
Status ListTraverse(LinkList L, void(*vi)(ElemType))
{LinkList p = L->next;while (p) {vi(p->data);p = p->next;}return RET_OK;
}/* 按学号非降序插入 */
void InsertAscend(LinkList L, ElemType e)
{LinkList q = L, p = L->next;while (p && e.studentId > p->data.studentId) {q = p;p = p->next;}q->next = MakeNewLNode(e);q->next->next = p;
}
4) studentHealthRecord.h
/* 学生健康登记表定义头文件 */#ifndef STUDENTSHEALTHRECORD_H
#define STUDENTSHEALTHRECORD_H#include "status.h"
#include "singleLinkList.h"
#include <stdio.h>/* 打印学生信息 */
void PrintStuentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType e);/* 读入学生信息 */
void ReadIn(char healthState[][HEALTHLEN], int arrayLen, ElemType *e);/* 将学生信息写入指定文件 */
void WriteToFile(ElemType e, FILE *fp);/* 由 fp 指定文件读取学生信息到 e */
Status ReadFromFile(ElemType *e, FILE *fp);/* 查找表中学号为 studentId 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByStudentId(LinkList L, long studentId, LinkList *p, LinkList *q);/* 查找表中姓名为 name 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByName(LinkList L, char name[], LinkList *p, LinkList *q);/* 删除表中学号为 studentId 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByStudentId(LinkList L, long studentId);/* 删除表中姓名为 name 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByName(LinkList L, char name[]);/* 修改学生信息 */
void ModifyStudentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType *e);/* 显示操作选项 */
void ShowMenu(void);#endif // !STUDENTSHEALTHRECORD_H
5) studentHealthRecord.c
/* 学生健康登记表实现源文件 */#include "studentHealthRecord.h"
#include <string.h>
#include <stdlib.h>/* 打印学生信息 */
void PrintStuentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType e)
{if (e.healthState > arrayLen - 1) {printf("Error: Parameter out of bounds!\n");return;}printf("%-10s%-10ld", e.name, e.studentId);if (e.sex == 'm') {printf(" Man");}else {printf(" Female");}printf("%10d%10s%10s\n", e.age, e.className, healthState[e.healthState]);
}/* 读入学生信息 */
void ReadIn(char healthState[][HEALTHLEN], int arrayLen, ElemType *e)
{printf("Please input name(No more than %d characters): ", NAMELEN);scanf_s("%s", e->name, (unsigned int)sizeof(e->name));getchar();printf("Please input the student ID: ");scanf_s("%ld", &e->studentId);getchar();printf("Please input the gender: ");scanf_s("%c", &e->sex, 1);getchar();printf("Please input the age: ");scanf_s("%d", &e->age);getchar();printf("Please input the class name: ");scanf_s("%s", e->className, (unsigned int)sizeof(e->className));getchar();printf("Please input the health state(");for (int i = 0; i < arrayLen; ++i) {printf("%d: %s ", i, healthState[i]);}printf("): ");scanf_s("%d", &e->healthState);getchar();
}/* 将学生信息写入指定文件 */
void WriteToFile(ElemType e, FILE *fp)
{fwrite(&e, sizeof(StudentInfo), 1, fp);
}/* 由 fp 指定文件读取学生信息到 e */
Status ReadFromFile(ElemType *e, FILE *fp)
{size_t ret = fread(e, sizeof(StudentInfo), 1, fp);return (ret == 1) ? 1 : 0;
}/* 查找表中学号为 studentId 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByStudentId(LinkList L, long studentId, LinkList *p, LinkList *q)
{*p = L;while (*p) {*q = (*p)->next;if (*q && (*q)->data.studentId > studentId) {break;}if (*q && (*q)->data.studentId == studentId) {return TRUE;}*p = *q;}return FALSE;
}/* 查找表中姓名为 name 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByName(LinkList L, char name[], LinkList *p, LinkList *q)
{*p = L;while (*p) {*q = (*p)->next;if (*q && !strcmp((*q)->data.name, name)) {return TRUE;}*p = *q;}return FALSE;
}/* 删除表中学号为 studentId 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByStudentId(LinkList L, long studentId)
{LinkList p, q;if (FindByStudentId(L, studentId, &p, &q)) {p->next = q->next;free(q);return TRUE;}return FALSE;
}/* 删除表中姓名为 name 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByName(LinkList L, char name[])
{LinkList p, q;if (FindByName(L, name, &p, &q)) {p->next = q->next;free(q);return TRUE;}return FALSE;
}/* 修改学生信息 */
void ModifyStudentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType *e)
{PrintStuentInfo(healthState, arrayLen, *e);printf("Please input the content you want to modify, or click Enter to cancel\n");char str[100];printf("Please input name(No more than %d characters): ", NAMELEN);if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {strcpy_s(e->name, sizeof(e->name), str); /* 第二个参数为目标缓冲区大小 */}printf("Please input student ID: ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->studentId = atol(str);}printf("Please input gender(m: Man f: Female): ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->sex = str[0];}printf("Please input age: ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->age = atoi(str);}printf("Please input class name(No more than %d characters): ", CLASSLEN);if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {strcpy_s(e->className, sizeof(e->className), str);}printf("Please input the health state(");for (int i = 0; i < arrayLen; ++i) {printf("%d: %s ", i, healthState[i]);}printf("): ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->healthState = atoi(str);}
}void ShowMenu(void)
{printf("1: 将结构体数组 student 中的记录按学号非降序插入链表\n");printf("2: 将文件中的记录按学号非降序插入链表\n");printf("3: 键盘输入新记录,并将其按学号非降序插入链表\n");printf("4: 删除链表中第一个有给定学号的记录\n");printf("5: 删除链表中第一个有给定姓名的记录\n");printf("6: 修改链表中第一个有给定学号的记录\n");printf("7: 修改链表中第一个有给定姓名的记录\n");printf("8: 查找链表中第一个有给定学号的记录\n");printf("9: 查找链表中第一个有给定姓名的记录\n");printf("10: 显示所有记录\n");printf("11: 将链表中的所有记录存入文件\n");printf("12: 结束\n");printf(" 请选择操作命令: ");
}
6) main.c
/* 入口程序源文件 */#include "studentHealthRecord.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>int main(void)
{char healthState[3][10] = { "Health", "Normal", "Unhealth" };StudentInfo student[N] = {{ "王小林", 790631, 'm', 18, "计91", 0 },{ "陈红", 790632, 'f', 20, "计91", 1 },{ "刘建平", 790633, 'm', 21, "计91", 0 },{ "张立立", 790634, 'm', 17, "计91", 2 }};bool flag = true;int choose;LinkList studentList;InitList(&studentList);ElemType e;char fileName[30];long studentId;char name[30];LinkList p, q;while (flag) {ShowMenu();scanf_s("%d", &choose);switch (choose) {case 1:for (int i = 0; i < N; ++i) {InsertAscend(studentList, student[i]);}break;case 2: printf("Please input file name: ");scanf_s("%s", fileName, (unsigned int)sizeof(fileName));FILE* fp;errno_t err_ret = fopen_s(&fp, fileName, "rb");if ( err_ret != 0) {printf("Open file failed!\n");}else {while (ReadFromFile(&e, fp)) {InsertAscend(studentList, e);}fclose(fp);}break;case 3: ReadIn(healthState, 3, &e);InsertAscend(studentList, e);break;case 4: printf("Please input the student ID to delete: ");scanf_s("%ld", &studentId);if (!DeleteByStudentId(studentList, studentId)) {printf("Error: No record of student ID of %ld.\n", studentId);}break;case 5:printf("Please input the name of the student of record to be deleted: ");scanf_s("%s", name, (unsigned int)sizeof(name));if (!DeleteByName(studentList, name)) {printf("Error: No record of student name of %s.", name);}break;case 6:printf("Please input the student ID of the record to be modified: ");scanf_s("%ld", &studentId);getchar();if (!FindByStudentId(studentList, studentId, &p, &q)) {printf("No record of the student Id of %ld\n", studentId);}else {ModifyStudentInfo(healthState, 3, &q->data);if (q->data.studentId != studentId) {p->next = q->next;InsertAscend(studentList, q->data);free(q);}}break;case 7:printf("Please input the name of the student of record to be deleted: ");scanf_s("%s", name, (unsigned int)sizeof(name));if (!FindByName(studentList, name, &p, &q)) {printf("No record of name of student %s.\n", name);}else {studentId = q->data.studentId;ModifyStudentInfo(healthState, 3, &q->data);if (q->data.studentId != studentId) {p->next = q->next;InsertAscend(studentList, q->data);free(q);}}break;case 8:printf("Please input the student ID of the record to be found: ");scanf_s("%ld", &studentId);if (!FindByStudentId(studentList, studentId, &p, &q)) {printf("No record of the student ID of %ld\n", studentId);}else {PrintStuentInfo(healthState, 3, q->data);}break;case 9:printf("Please input the name of the student of the record to be found: ");scanf_s("%s", name, (unsigned int)sizeof(name));if (!FindByName(studentList, name, &p, &q)) {printf("No record of the student name of %s.\n", name);}else {PrintStuentInfo(healthState, 3, q->data);}break;case 10:p = studentList->next;while (p) {PrintStuentInfo(healthState, 3, p->data);p = p->next;}break;case 11:printf("Please input the file name: ");scanf_s("%s", fileName, (unsigned int)sizeof(fileName));err_ret = fopen_s(&fp, fileName, "wb+");if (err_ret != 0) {printf("Open file failed!\n");}else {LinkList p = studentList->next;while (p) {WriteToFile(p->data, fp);p = p->next;}}fclose(fp);break;case 12:flag = false;}}int ret = DestroyList(&studentList);if (ret != RET_OK) {printf("Error: Destroy list failed!\n");}return 0;
}
2. 输出示例

相关文章:
第 2 章 线性表(学生健康登记表实现)
1. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #define INFEASI…...
第三周晨考自测(3.0)
1.获取元素的偏移量 offsetLeft和offsetTop 分别获取的是元素元素左边的偏移量和上边的偏移量 语法:元素对象.offsetLeft /元素对象.offsetTop 返回值:就是该元素对应的偏移量,是一个具体的数字 offsetLeft:该元素相对于参考…...
C++ 结构体
前文 C中的结构体是一种非常有用的数据类型,它允许我们将不同的变量组合在一起,形成一个自定义的数据结构。 结构体在C中的应用非常广泛,它可以用来表示和管理各种实体、对象或数据的属性。比如,在一个学生管理系统中,…...
如何使用聊天GPT自定义说明
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 OpenAI ChatGPT正在席卷全球。一周又一周,更新不断提高您可以使用这种最先进的语言模型做什么的标准。 在这里,我们深入研究了OpenAI最近在ChatGPT自定义指令上发布的公告。此功能最初以测试版…...
mac pyenv无法切换python版本问题
看是zsh还是bash echo $SHELLzsh 配置到~/.zshrc 文件 vim ~/.zshrcexport PYENV_ROOT"$HOME/.pyenv" command -v pyenv >/dev/null || export PATH"$PYENV_ROOT/bin:$PATH" 执行 source ~/.zshrc bash vim ~/.bashrc export PYENV_R…...
API接口接入电商平台案例,采集淘宝天猫拼多多1688京东LAZADA数据按关键字搜索商品示例
按关键字搜索商品数据API接口可以让用户轻松地在海量商品中找到自己需要的商品。这个接口包括多种搜索方式,例如利用关键字搜索商品名称、商品描述、商品分类、商家信息等。同时,还可以通过不同的排序方式进行筛选,例如销量排行、价格排行、评…...
持安-大连万达集团零信任项目入选中国信通院2023零信任优秀案例
2023年8月25日,以“链接云端,可信而安”为主题的“2023首届SecGo云和软件安全大会”在京隆重召开。会上,中国信息通信研究院重磅揭晓了“安全守卫者计划”优秀案例评选结果。 零信任办公安全技术创新企业持安科技,与用户大连万达…...
python28种极坐标绘图函数总结
文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 📊python35种绘图函数总结,3D、统计、流场,实用性拉满 matplotlib中的画图函数,大部分情况下只要声明坐标映射是polar,就都可以画出对应的极坐标图。但…...
C#编程基础(万字详解,这一篇就够了)
C#及其开发环境简介 C#概述 C#的编程功能 C#与.Net的关系 .Net C# C#的集成开发环境 Windows上编写C#程序 Linux/Mac OS上编写C#程序 运行第一个HelloWorld程序 C#基本语法 程序实例 C#基本语法 using关键字 class关键字 注释 成员变量 成员函数 实例化一个类…...
SpringBoot中自定义注解
目录 SpringBoot中自定义注解 关于注解的解释 元注解 Documented Target Retention Inherited Native 自定义注解 自定义注解与SpringBoot全局异常处理完成参数校验 约束验证器 自定义全局异常处理器 自定义注解完成数据脱敏 定义脱敏策略枚举 自定义注解 实行脱…...
《TCP/IP网络编程》阅读笔记--地址族和数据序列
目录 1--IP地址和端口号 2--地址信息的表示 3--网络字节序与地址变换 4--网络地址的初始化与分配 5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类: ① IPv4 表示 4 字节地址族; ② IPv6 表示 16 字节地址族; IPv4 标准的 4 …...
【C++】可变参数模板
2023年9月9日,周六下午 这个还是挺难学的,我学了好几天... 在这里我会举大量的示例程序,这样可以有一个更好的理解, 不定期更新。 目录 推荐文章: 示例程序一:拼接字符串 示例程序二:求整…...
WPF Flyout风格动画消息弹出消息提示框
WPF Flyout风格动画消息弹出消息提示框 效果如图: XAML: <Window x:Class"你的名称控件.FlyoutNotication"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xam…...
Spring Boot 集成 Redis
Spring-data-redis 在 Spring 中整合 Redis jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池 lettuce : 采用netty,实例可以再多个线程中进行共享,不存在…...
Java线程之间通信方式
目录 1 线程之间的通信方式主要有以下几种2 共享变量3 锁机制4 条件变量5 信号量6 管道 1 线程之间的通信方式主要有以下几种 在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执…...
【LeetCode-中等题】367. 有效的完全平方数
文章目录 题目方法一:二分查找 题目 方法一:二分查找 找 1 - num 之间的 mid, 开方是整数 就找得到 mid, 不是整数自然找不到mid class Solution { // 二分查找 ;找 1 - num 之间的mid 开方是整数 就找得到 不是…...
英语单词(二)
1.int:整形 2.char:字符型 3.scanner:接受输入,扫描器 4.integer:整数,整形 5.type:类型 6.string:字符串类型 7.double:双精度浮点型...
Django 用相对路径方式引用自定义模块 或 文件
Django的文件夹结构 projectName/websiteName/appName manage.py 所在路径为:D:/projectA/website1/manage.py views.py 所在路径为:D:/projectA/website1/app1/views.py D:/projectA/website1/app1/module1.py 如果要引用自定义模块,引用…...
企业架构LNMP学习笔记22
防盗链原理和实现。 域名A的资源文件,经常被域名B直接调用访问。 而用户经常访问域名B,看到的资源(图片等)以为是域名B的,实际则是域名A的。 但是域名A没有获得任何收益,却要给域名B来源的访问消耗服务器…...
uniapp和小程序设置tabBar和显示与隐藏tabBar
(1)设置tabBar: uni.setTabberItem({ }); wx.setTabberItem({ }); 属性值: indexnumber是tabBar 的哪一项,从左边算起,索引从0开始textstring否tab 上按钮文字iconPathstring否图片路径selectedIc…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
