第 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…...
物联网、无线通讯
LAN:局域网 Local Area Network WAN:广域网 Wide Area Network WLAN:无线局域网 Wireless LAN LPWAN:低功耗广域网 Low Power Wide Area Network技术特点无线通信技术应用场景高功耗、高速率的远距离传输3G、4G蜂窝这类传输技术适…...
Pod和容器设计模式
为什么需要Pod 一些应用的实现是需要多个进程配合完成的,由于容器实际上是一个“单进程”模型,如果在容器里启动多个进程会存在进程管理的难题。在Kubernetes里面,实际上会被定义为一个拥有四个容器的Pod。 Pod相当于进程组 Kubernetes 是…...
docker系列(3) - 常用软件安装
文章目录 3. docker安装常用软件3.1 安装nginx3.2 安装redis3.3 安装mysql3.4 部署springboot程序3.4.1 编写dockerfile3.4.2 构建镜像3.4.3 启动镜像 3. docker安装常用软件 3.1 安装nginx docker pull nginx#挂载启动 docker run -it -d \ --namenginx \ --networkpub_netw…...
Apache Hive之数据查询
文章目录 版权声明数据查询环境准备基本查询准备数据select基础查询分组、聚合JOINRLIKE正则匹配UNION联合Sampling采用Virtual Columns虚拟列 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利…...
OpenCV---视频操作
用摄像头捕获视频 import cv2 as cv import numpy cap cv.VideoCapture(0) while(cap.isOpened()):ret, frame cap.read() # read() 它返回两个值,第一个是布尔值,表示是否成功读取到一帧,第二个是帧本身。cv.imshow(Video, frame)if c…...
《TCP/IP网络编程》阅读笔记--进程间通信
目录 1--进程间通信 2--pipe()函数 3--代码实例 3-1--pipe1.c 3-2--pipe2.c 3-3--pipe3.c 3-4--保存信息的回声服务器端 1--进程间通信 为了实现进程间通信,使得两个不同的进程间可以交换数据,操作系统必须提供两个进程可以同时访问的内存空间&am…...
mysql中show status参数介绍
Uptime_since_flush_status, 2159061:自上次刷新状态以来的服务器运行时间(以秒为单位)。Uptime, 2159061:服务器的总运行时间(以秒为单位)。Threads_running, 2:当前正在运行的客户端线程数。T…...
Tomcat服务的部署及配置优化
文章目录 1. Tomcat的相关介绍1.1 Tomcat简介1.2 Tomcat的核心组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器 1.3 Tomcat的功能组件1.3.1 connector连接器1.3.2 container容器1.3.2.1 子容器及其相关功能 1.4 主要作用1.5 Tmocat处理请求的过程 2. Tomcata服务部署2.1 安装…...
入门力扣自学笔记279 C++ (题目编号:1123)
1123. 最深叶节点的最近公共祖先 题目: 给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。 回想一下: 叶节点 是二叉树中没有子节点的节点树的根节点的 深度 为 0,如果某一节点的深度为 d,那它…...
【AIGC专题】Stable Diffusion 从入门到企业级实战0402
一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第02节, 利用Stable Diffusion ControlNet Openpose模型精准控制图像生成。上一节,我们介绍了《Stable Diffusion C…...
wordpress微博图床/域名查询备案
2019独角兽企业重金招聘Python工程师标准>>> 朴素贝叶斯分类器 一,生成词向量(词集模型)第一,假设这里有两个参数vocabList, inputSet。vocabList代表着包含很多无重复的词,词量足够大,inputSet…...
企业网络安全设计/宁波seo网站推广软件
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 浅谈spring——切面(七)这一节提到平日要借助ProxyFactoryBean建创织入切面的代理子类,虽然对标目类进行了强增,但是增加了很多额…...
wordpress博客速度很慢/杭州seo泽成
小机在用vi编辑文件时遇到“Terminal too wide”的提示解决方法:export TERMvt100stty -astty columns 132转载于:https://blog.51cto.com/295501803/1976028...
wordpress新闻类主题/营销型网站方案
零售数据分析:如何对产品价格分组 在零售体系中,产品有个属性是所属的价位段(或者价格带),即:某个产品属于哪个价位段,以方便我们做统计分析的需要。 在统计学中对此称为:数据分组。数据分组的方法有单变量…...
做动态网站需要什么/网络推广团队哪家好
2016-09-01 01:18齐晓庆 客户经理在加减乘除运算中,运算结果的类型和运算量的类型相同,由于类型不同,所以出错,要达到你目的可以1000\15 1000\25,由于1.5 2.5是小数所以强制转换时出错2016-09-01 01:15齐敦益 客户经理同构数是会出现在它的平…...
猎头用什么网站做单/百度录入网站
1、版本管理 1.1、工程版本区分 1.2、工程版本 SNAPSHOT(快照版本) 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本…...