数据结构——基于单链表实现通讯管理系统

文章目录

  • 一、前言
    • SList.h
    • SList.c
  • 二、通讯录的实现
    • 通讯录项目
    • Contact.h
    • 载入数据
    • 初始化通讯录
    • 添加通讯录数据
    • 通过姓名查找联系人
    • 删除通讯录数据
    • 展示通讯录数据
    • 查找通讯录数据
    • 修改通讯录数据
    • 保存通讯录
    • 销毁通讯录数据
  • 三、所有源代码
    • Contact.h
    • Contact.c
    • SList.h
    • SList.c
    • test.c

一、前言

这个通讯录是基于单链表实现的,关于单链表,之前已经做过完整的实现方法——数据结构——单链表(C语言版)
用单链表实现的通讯录其实和用顺序表实现的通讯录类似,可以参考该文章——基于动态顺序表的应用——通讯录


完成该通讯录需要引进经过修改后的单链表的文件

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include  "Contact.h"

typedef PeoInfo SLTDateType;

typedef struct SListNode
{
	SLTDateType date;
	struct SListNode* next;
}SLTNode;

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);

//尾删
void SLTPopBack(SLTNode** pphead);

//头删
void SLTPopFront(SLTNode** pphead);

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x);

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos);

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos);

//销毁链表
void SListDesTroy(SLTNode** pphead);

SList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

//申请新的结点
SLTNode* SLTBuyNode(SLTDateType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		printf("malloc fail!");
		exit(1);
	}
	newnode->date = x;
	newnode->next = NULL;
	return newnode;
}

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	//空链表 和 非空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* ptail = *pphead;
		while (ptail->next)
		{
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

//尾删
void SLTPopBack(SLTNode** pphead)
{
	assert(pphead && *pphead);
	//只有一个结点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	//多个结点
	else
	{
		SLTNode* prev = *pphead;
		SLTNode* ptail = *pphead;

		while (ptail->next)
		{
			prev = ptail;
			ptail = ptail->next;
		}
		free(ptail);
		ptail = NULL;
		prev->next = NULL;
	}
}

//头删
void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead && *pphead);
	assert(pos);
	if (*pphead == pos)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		SLTNode* newnode = SLTBuyNode(x);
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = newnode;
		newnode->next = pos;
	}
	
}

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{
	assert(pos);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && *pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
	
}

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{
	assert(pos && pos->next);
	SLTNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

//销毁链表
void SListDesTroy(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* pcur = *pphead;
	
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}

二、通讯录的实现

通讯录项目

创建一个通讯录项目,包含以下文件:

在这里插入图片描述

Contact.h 通讯录的头文件,包含通讯录的声明以及相关函数的声明
Contact.c 通讯录函数的具体实现方法
contact.txt 保存通讯录中的数据

SList.h 单链表的声明
SList.c 单链表函数的声明

test.c 测试代码,也可以当菜单

Contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//联系人的数据
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//前置声明
typedef struct SListNode contact;

//初始化通讯录
void InitContact(contact** con);

//添加通讯录数据
void AddContact(contact** con);

//删除通讯录数据
void DelContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

载入数据

//载入数据
void LoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "r");
	//判断读取是否成功
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//循环读取数据
	PeoInfo info;
	while (fread(&info, sizeof(PeoInfo), 1, pf))
	{
		SLTPushBack(con, info);
	}
	printf("历史数据导入通讯录成功!\n");
}

初始化通讯录

//初始化通讯录
void InitContact(contact** con)
{
	LoadContact(con);
}

添加通讯录数据

// 添加通讯录数据
void AddContact(contact** con)
{
	PeoInfo info;
	printf("请输入联系人的姓名:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.sex);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLTPushBack(con, info);
}

通过姓名查找联系人

//通过姓名查找联系人
contact* FindByName(contact* con, char name[])
{
	contact* pcur = con;
	while (pcur)
	{
		if (strcmp(pcur->date.name, name) == 0)
		{
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}

删除通讯录数据

//删除通讯录数据
void DelContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos != NULL)
	{
		SLTErase(con, pos);
		printf("删除成功!\n");
	}
	else
	{
		printf("删除失败!没有该联系人!\n");
	}
}

展示通讯录数据

//展示通讯录数据
void ShowContact(contact* con)
{
	printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
	contact* pcur = con;
	while (pcur)
	{
		printf("%6s %6s %6d %6s %6s\n",
			pcur->date.name,
			pcur->date.sex,
			pcur->date.age,
			pcur->date.tel,
			pcur->date.addr);
		pcur = pcur->next;
	}
}

查找通讯录数据

//查找通讯录数据
void FindContact(contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("找到了!该联系人的信息如下:\n");
		printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%6s %6s %6d %6s %6s\n",
			pos->date.name,
			pos->date.sex,
			pos->date.age,
			pos->date.tel,
			pos->date.addr);
	}
}

修改通讯录数据

//修改通讯录数据
void ModifyContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要修改的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("开始修改!\n");
		printf("联系人的新姓名为:\n");
		scanf("%s", pos->date.name);

		printf("联系人的新性别为:\n");
		scanf("%s", pos->date.sex);

		printf("联系人的新年龄为:\n");
		scanf("%d", &pos->date.age);

		printf("联系人的新电话为:\n");
		scanf("%s", pos->date.tel);

		printf("联系人的新地址为:\n");
		scanf("%s", pos->date.addr);

		printf("修改成功!\n");
	}
}

保存通讯录

//保存通讯录
void SaveContact(contact* con)
{
	FILE* pf = fopen("contact.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//将通讯录数据写入文件
	contact* pcur = con;
	while (pcur)
	{
		fwrite(&(pcur->date), sizeof(pcur->date), 1, pf);
		pcur = pcur->next;
	}
	printf("通讯录保存成功!\n");
}

销毁通讯录数据

//销毁通讯录数据
void DestroyContact(contact** con)
{
	//在销毁通讯录之前,保存数据
	SaveContact(*con);
	SListDesTroy(con);
}

三、所有源代码

Contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//联系人的数据
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//前置声明
typedef struct SListNode contact;

//初始化通讯录
void InitContact(contact** con);

//添加通讯录数据
void AddContact(contact** con);

//删除通讯录数据
void DelContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
#include "SList.h"

//载入数据
void LoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "r");
	//判断读取是否成功
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//循环读取数据
	PeoInfo info;
	while (fread(&info, sizeof(PeoInfo), 1, pf))
	{
		SLTPushBack(con, info);
	}
	printf("历史数据导入通讯录成功!\n");
}

//初始化通讯录
void InitContact(contact** con)
{
	LoadContact(con);
}

// 添加通讯录数据
void AddContact(contact** con)
{
	PeoInfo info;
	printf("请输入联系人的姓名:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.sex);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLTPushBack(con, info);
}

//通过姓名查找联系人
contact* FindByName(contact* con, char name[])
{
	contact* pcur = con;
	while (pcur)
	{
		if (strcmp(pcur->date.name, name) == 0)
		{
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}

//删除通讯录数据
void DelContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos != NULL)
	{
		SLTErase(con, pos);
		printf("删除成功!\n");
	}
	else
	{
		printf("删除失败!没有该联系人!\n");
	}
}

//展示通讯录数据
void ShowContact(contact* con)
{
	printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
	contact* pcur = con;
	while (pcur)
	{
		printf("%6s %6s %6d %6s %6s\n",
			pcur->date.name,
			pcur->date.sex,
			pcur->date.age,
			pcur->date.tel,
			pcur->date.addr);
		pcur = pcur->next;
	}
}

//查找通讯录数据
void FindContact(contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("找到了!该联系人的信息如下:\n");
		printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%6s %6s %6d %6s %6s\n",
			pos->date.name,
			pos->date.sex,
			pos->date.age,
			pos->date.tel,
			pos->date.addr);
	}
}

//修改通讯录数据
void ModifyContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要修改的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("开始修改!\n");
		printf("联系人的新姓名为:\n");
		scanf("%s", pos->date.name);

		printf("联系人的新性别为:\n");
		scanf("%s", pos->date.sex);

		printf("联系人的新年龄为:\n");
		scanf("%d", &pos->date.age);

		printf("联系人的新电话为:\n");
		scanf("%s", pos->date.tel);

		printf("联系人的新地址为:\n");
		scanf("%s", pos->date.addr);

		printf("修改成功!\n");
	}
}

//保存通讯录
void SaveContact(contact* con)
{
	FILE* pf = fopen("contact.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//将通讯录数据写入文件
	contact* pcur = con;
	while (pcur)
	{
		fwrite(&(pcur->date), sizeof(pcur->date), 1, pf);
		pcur = pcur->next;
	}
	printf("通讯录保存成功!\n");
}

//销毁通讯录数据
void DestroyContact(contact** con)
{
	//在销毁通讯录之前,保存数据
	SaveContact(*con);
	SListDesTroy(con);
}

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include  "Contact.h"

typedef PeoInfo SLTDateType;

typedef struct SListNode
{
	SLTDateType date;
	struct SListNode* next;
}SLTNode;

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);

//尾删
void SLTPopBack(SLTNode** pphead);

//头删
void SLTPopFront(SLTNode** pphead);

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x);

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos);

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos);

//销毁链表
void SListDesTroy(SLTNode** pphead);

SList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"



//申请新的结点
SLTNode* SLTBuyNode(SLTDateType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		printf("malloc fail!");
		exit(1);
	}
	newnode->date = x;
	newnode->next = NULL;
	return newnode;
}

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	//空链表 和 非空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* ptail = *pphead;
		while (ptail->next)
		{
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

//尾删
void SLTPopBack(SLTNode** pphead)
{
	assert(pphead && *pphead);
	//只有一个结点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	//多个结点
	else
	{
		SLTNode* prev = *pphead;
		SLTNode* ptail = *pphead;

		while (ptail->next)
		{
			prev = ptail;
			ptail = ptail->next;
		}
		free(ptail);
		ptail = NULL;
		prev->next = NULL;
	}
}

//头删
void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead && *pphead);
	assert(pos);
	if (*pphead == pos)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		SLTNode* newnode = SLTBuyNode(x);
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = newnode;
		newnode->next = pos;
	}
	
}

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{
	assert(pos);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && *pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
	
}

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{
	assert(pos && pos->next);
	SLTNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

//销毁链表
void SListDesTroy(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* pcur = *pphead;
	
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
//测试代码——菜单
void menu()
{
	printf("****************通讯录*******************\n");
	printf("******1.添加联系人    2.删除联系人*******\n");
	printf("******3.修改联系人    4.查找联系人*******\n");
	printf("******5.展示联系人    0. 退出************\n");
	printf("*****************************************\n");
}

int main()
{
	int input = 0;
	contact* con = NULL;
	//初始化
	InitContact(&con);
	do
	{
		menu();
		printf("选择你的操作->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			ModifyContact(&con);
			break;
		case 4:
			FindContact(con);
			break;
		case 5:
			ShowContact(con);
			break;
		case 0:
			printf("退出通讯录...\n");
			break;
		default:
			printf("输入错误!请重新输入!\n");
			break;
		}
	} while (input != 0);
	//销毁通讯录;
	DestroyContact(&con);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sonar+postsql的安装配置,centos7.9系统

1.安装postsql15 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql15-server sudo service postgresql-15 initdb sudo chkconfig postgresql-15 on sudo servic…

[StartingPoint][Tier2]Included

LXD https://www.hackingarticles.in/lxd-privilege-escalation/ Task 1 What service is running on the target machine over UDP? &#xff08;目标机器上通过UDP运行的服务是什么&#xff1f;&#xff09; $ nmap -sU 10.129.232.86 -p 69 tftp Task 2 What class o…

每日一博 - 重新定义JAR中的类或方法

文章目录 概述方式一 &#xff1a; 项目覆写相同包结构的类方式二&#xff1a; 魔改Jar包中的类方案对比方案一&#xff1a;在项目中新增第三方包路径方案二&#xff1a;替换JAR包中的类文件 概述 在一些情况下&#xff0c;我们可能需要定制第三方库的行为&#xff0c;但却无法…

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 &#xff08;一 &#xff09;上传 &#xff08;二&#xff09;解压 二、修改配置文件 &#xff08;一&#xff09;配置workers文件 &#xff08;二&#xff09;配置hadoop-env.sh文件 &#xff08;三&#xff09;配置core-site.xml文件 &…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域&#xff0c;了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术&#xff0c;我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库&#xff0c;构建了两个常用的分类模型&#xff…

自定义创建真实项目vue2项目

1. 创建 vue create 项目名 2. 选择自定义 3. 勾选以下必备选项 4.选择使用vue2 5. 选择哈希模式&#xff08;n&#xff09;; css选择Less 6. ESLint校验 选择 7. 保存&#xff08;按照默认&#xff09; 8. 在哪里添加ESLint文件 9. 要不要把这个改成将来的预设&am…

底层开发必知的三个内存结构概念

大家好&#xff0c;今天给大家介绍底层开发必知的三个内存结构概念&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在底层开发中&#xff0c;以下是三个关键的内存结构概念&…

linux进阶篇:性能监控工具——vmstat命令详细讲解

Linux性能监控工具&#xff1a;vmstat命令详细讲解 vmstat是Virtual Meomory Statistics&#xff08;虚拟内存统计&#xff09;的缩写&#xff0c;可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计&#xff0c;不足之处是无法对某个进程进行深入分析…

【Godot4.2】CanvasItem绘图函数全解析 - 7.自定义节点TextBoard

概述 之前发布的几篇文章几乎阐述了CanvasItem绘图函数最基础的内容。 本篇结合draw_style_box()和TextParagraph类&#xff0c;自定义了一个可以自适应宽高显示多行文本&#xff0c;且带有一个样式盒作为背景的文字板节点TextBoard。 系列目录 0.概述1.绘制简单图形2.设定绘…

13 Php学习:面向对象

PHP 面向对象 面向对象&#xff08;Object-Oriented&#xff0c;简称 OO&#xff09;是一种编程思想和方法&#xff0c;它将程序中的数据和操作数据的方法封装在一起&#xff0c;形成"对象"&#xff0c;并通过对象之间的交互和消息传递来完成程序的功能。面向对象编…

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别分类效果基…

卷积神经网络(CNN)笔记——多图深入理解

梗直哥、梗直哥丶的个人空间-梗直哥丶个人主页-哔哩哔哩视频 过去十年,卷积神经网络(CNN)如同科技领域的明星,以其卓越的表现撑起了人工智能的半边天。这种创新的网络模型,不仅在计算机视觉、语音识别等传统领域大放异彩,更为人工智能的快速发展和广泛应用奠定了坚实的基础。…

【软件设计师知识点】一、计算机系统基础知识

文章目录 冯诺依曼计算机CPUCPU 的功能CPU 的组成 数据表示进制转换单位换算定点数浮点小数IEEE 754标准浮点数的运算 校验码奇偶校验码海明码循环冗余校验码&#xff08;CRC&#xff09; 指令系统指令格式寻址方式指令集指令流水线 存储系统存储器的层次化结构存储器的分类相联…

MYBATIS获取参数值

MYBATIS最核心的莫过于动态的获取各种的参数值, 为了将来更好的使用MYBATIS进行开发, 我们必须先打好 "获取参数值" 这一基础 一. MYBATIS获取参数值的两种情况: 1.${} 实质:字符串的拼接 注解:${}使用的字符串拼接的方式拼接SQL语句, 所以, 如果其中出现了字符串…

【Golang学习笔记】从零开始搭建一个Web框架(二)

文章目录 模块化路由前缀树路由 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起&#xff0c;如果要实现路由功能的拓展增强&#xff0c;那将会非常麻烦&…

Python项目移动文件夹后出现ModuleNotFoundError: No module named

文章目录 0 问题再现1 问题原因2 结局办法2.1 如果是使用编译器运行2.2 如果是在linux环境下&#xff0c;使用命令运行 0 问题再现 移动Python的项目文件夹后&#xff0c;代码出现模块引用未知的问题。 1 问题原因 移动Python项目后&#xff0c;source root&#xff08;项目…

创新者指南

创新者指南 怎么把一个模糊的想法变为成功的商业模式。在高度不确定的商业环境下&#xff0c;怎样验证创新想法是否有商业价值&#xff0c;还有怎么用较低的成本打造产品&#xff0c;并推向市场。作者为我们总结出3个有用的策略&#xff08;测试方法&#xff09;和几个关键步骤…

从零实现诗词GPT大模型:专栏内容规划

一、前情介绍 本系列文章将从头编写一个类GPT的深度学习模型&#xff0c;并在诗词数据集上进行训练&#xff0c;从而可以进行诗词创作。 本次实现的类GPT模型&#xff0c;可以在kaggle上使用免费GPU进行训练&#xff0c;并可以在自己的电脑上进行推理&#xff0c;整个学习过程…

前端vue: 使用ElementUI适配国际化

i18n介绍 i18n&#xff08;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数&#xff09;是“国际化”的简称。 前端国际化步骤 1、安装i18n插件 安装插件时候&#xff0c;注意必须指定版本号&#xff0c;不然安装会报错。 npm i vue-i1…

查天气(Vue.js,Element UI)

演示图 几点注意 有亿点简陋&#xff0c;凑合能用&#xff0c;button一定要 !important 覆盖原本的 element ui &#xff0c;不然无效axios回调函数中 this 指向改变了&#xff0c;需要额外的保存一份服务器返回的数据比较复杂时&#xff0c;获取的时候需要注意层级结构method…