C/C++语言实现简易通讯录 [含文件操作,循环双链表]

news2025/1/21 5:56:37

文章目录

  • C/C++语言实现简易通讯录
    • 概要
    • 基本功能
    • 运行截图展示
    • 主要代码展示

🎖  博主的CSDN主页:Ryan.Alaskan Malamute
📜 博主的代码仓库主页 [ Gitee ]:@ryanala      [GitHub]: Ryan-Ala

C/C++语言实现简易通讯录

⚠⚠⚠ 如果需要代码可以前往这里下载 简易通讯录(最终版)

概要

本采用c++语言实现的简易通讯录,具体功能包括添加、删除,查找和修改联系人信息,显示和清空联系人列表等基本功能

该简易通讯录采用了循环双链表的数据结构,以及文件操作等技术,能够实现对通讯录联系人基本信息的修改与保存

基本功能

  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除联系人
  • 查找联系人:按照姓名进行查找联系人
  • 修改联系人:根据姓名重新修改联系人
  • 清空联系人:清空通讯录中所有信息
  • 保存通讯录:将本次录入的联系人基本信息保存至文件中,以便在下一次打开时查阅

运行截图展示

登录

在这里插入图片描述
录入基本信息
在这里插入图片描述
显示联系人
在这里插入图片描述
查找联系人

在这里插入图片描述

修改联系人
在这里插入图片描述

主要代码展示

双链表实现部分

注意:这里只给出部分代码,如有需要全部源码链接已在文章开头给出链接

ListNode.cpp

#pragma once

#include"contact.h"

typedef struct ListNode
{
	Datatype data;
	struct ListNode* next;
	struct ListNode* prev;   //指向下一个节点
} *pListNode, contact;

//初始化循环双链表
pListNode Init_List();

//创建一个新的节点
pListNode Buy_newNode(); 

pListNode Buy_newNode(peoinform* x); 

//L前插入
void Insert_List(pListNode L);  

//尾插
void Insert_End(pListNode L); 
void Insert_End(pListNode L, pListNode x); 

//头插
void Insert_Head(pListNode L);   

//删除
int Delete(pListNode s);  

//尾删
void Delete_End(pListNode L);   

//头删
void Delete_Head(pListNode L);  

//打印
void Printf_List(pListNode L);   

//任意位置插入
//int Insert_List(pListNode L, Datatype x, int i);   

//查找
pListNode Find_List(pListNode L, const char* x);   

//删除某个元素
int Delete_List(pListNode L, const char* x);  

//销毁
int Destory_List(pListNode L);  

//判空
int Empty_List(pListNode L);  

//长度
int Length_List(pListNode L);  


ListNode.cpp

#include"ListNode.h"

pListNode Init_List()  //初始化循环双链表
{
	pListNode s = (pListNode)malloc(sizeof(ListNode));
	if (!s)
	{
		cerr << ":)  ERROR!    Dynamic allocation of memory failed" << endl;
		exit(1);
	}
	s->next = s;
	s->prev = s;
	return s;
}

pListNode Buy_newNode()  //创建一个新的节点
{
	pListNode newnode = (pListNode)malloc(sizeof(ListNode));
	if (!newnode)
	{
		cerr << ": ERROR!    Dynamic allocation of memory failed" << endl;
		exit(1);
	}
	Scanf_peoinform(&newnode->data);
	newnode->prev = NULL;
	newnode->next = NULL;
	return newnode;
}

pListNode Buy_newNode(peoinform* x)
{
	pListNode newnode = (pListNode)malloc(sizeof(ListNode));
	if (!newnode)
	{
		cerr << ":)  ERROR!    Dynamic allocation of memory failed" << endl;
		exit(1);
	}
	strcpy(newnode->data.name, x->name);
	strcpy(newnode->data.sex, x->sex);
	strcpy(newnode->data.tele, x->tele);
	strcpy(newnode->data.address, x->address);
	strcpy(newnode->data.realation, x->realation);
	strcpy(newnode->data.birthday, x->birthday);
	strcpy(newnode->data.notes, x->notes);
	newnode->prev = NULL;
	newnode->next = NULL;
	return newnode;
}

void Insert_List(pListNode L)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	system("cls");
	pListNode prev = L->prev;
	pListNode newNode = Buy_newNode();
	prev->next = newNode;
	newNode->prev = prev;
	newNode->next = L;
	L->prev = newNode;
	cout << "输入完成" << endl;
	system("pause");
	system("cls");
}
void Insert_End(pListNode L)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	Insert_List(L);
}

void Insert_End(pListNode L, pListNode x)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	if (!x)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	pListNode prev = L->prev;
	prev->next = x;
	x->prev = prev;
	x->next = L;
	L->prev = x;
}

void Insert_Head(pListNode L)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	Insert_List(L->next);
}

void Delete_End(pListNode L)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	if (Empty_List(L))
	{
		exit(1);
	}
	Delete(L->prev);  
}

void Delete_Head(pListNode L)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	if (Empty_List(L))
	{
		exit(1);
	}
	Delete(L->next);
}

void Printf_List(pListNode L)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		exit(1);
	}
	pListNode s = L->next;
	cout << "表中元素为:";
	while (s != L)
	{
		cout << "姓名:" << s->data.name << "   ";
		cout << "性别:" << s->data.sex << "   ";
		cout << "生日:" << s->data.birthday << "   ";
		cout << "电话:" << s->data.tele << "   ";
		cout << "地址:" << s->data.address << "   ";
		cout << "关系:" << s->data.realation << "   ";
		s = s->next;
	}
	cout << endl << "打印完毕!" << endl;
}

pListNode Find_List(pListNode L, const char* x)
{
	if (!L)
	{
		cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		return NULL;
	}
	pListNode s = L->next;
	while (s != L)
	{
		if (!strcmp(s->data.name,x))
		{
			return s;
		}
		else
		{
			s = s->next;
		}
	}
	if (s = L)
	{
		return NULL;
	}
	return NULL;
}

int Delete(pListNode s)
{
	if (!s)
	{
		cerr << "Delete_L_NULL" << endl;
		exit(1);
	}
	s->prev->next = s->next;
	s->next->prev = s->prev;
	free(s);
	s = NULL;
	return 1;
}

int Delete_List(pListNode L, const char* x)
{
	if (!L)
	{
		cerr << "Delete_L_NULL" << endl;
		exit(1);
	}
	pListNode s = Find_List(L, x);
	if (!s)
	{
		cerr << "删除失败!" << endl;
		return 0;
	}
	return Delete(s);
}

int Destory_List(pListNode L)  
{
	if (!L)
	{
		cerr << "Destory_L_NULL" << endl;
		exit(1);
	}
	pListNode s = L->next, r = s;
	while (s != L)
	{
		s = s->next;
		free(r);
		r = s;
	}
	free(L);
	L = NULL;
	return 1;
}

int Empty_List(pListNode L)
{
	if (!L)
	{
		cerr << "Empty_List_L_NULL" << endl;
		exit(1);
	}
	return L->next == L;
}

int Length_List(pListNode L)
{
	if (!L)
	{
		cerr << "Length_L_NULL" << endl;
		exit(1);
	}
	int count = 0;
	pListNode s = L->next;
	while (s != L)
	{
		count++;
		s = s->next;
	}
	return count;
}



contact.cpp

#include"ListNode.h"
#include"Heap.h"
#include"contact.h"

 pListNode Init_contact()
{
	pListNode Head = Init_List();
	return Head;
}

 void Menu()
 {
	 cout << endl;
	 cout << "*******************************" << endl;
	 cout << "***** 1.添加 **** 2.删除 ******" << endl;
	 cout << "***** 3.查找 **** 4.修改 ******" << endl;
	 cout << "***** 5.显示 **** 6.清空 ******" << endl;
	 cout << "***** 0.退出(保存) ************" << endl;
	 cout << "*******************************" << endl;
 }

 void Menu_revise()
 {
	 cout << endl;
	 cout << "*******************************" << endl;
	 cout << "***** 1.姓名 **** 2.性别 ******" << endl;
	 cout << "***** 3.生日 **** 4.电话 ******" << endl;
	 cout << "***** 5.地址 **** 6.关系 ******" << endl;
	 cout << "***** 7.备注 **** 0.退出(保存)*" << endl;
	 cout << "*******************************" << endl;
 }

 void Menu_select()
 {
	 cout << endl;
	 cout << "*******************************" << endl;
	 cout << "***** 1.继续修改当前联系人 ****" << endl;
	 cout << "***** 2.修改其他联系人 ********" << endl;
	 cout << "***** 0.退出(保存) ************" << endl;
	 cout << "*******************************" << endl;
 }

 void Menu_serch()
 {
	 cout << endl;
	 cout << "*******************************" << endl;
	 cout << "***** 1.按姓名查找 ************" << endl;
	 cout << "***** 2.按电话号码查找 ********" << endl;
	 cout << "*******************************" << endl;
 }

 void Menu_ashore()
 {
	 cout << endl;
	 cout << "*******************************" << endl;
	 cout << "******* 1.登录**2.注册 ********" << endl;
	 cout << "******* 3.注销**0.退出 ********" << endl;
	 cout << "*******************************" << endl;
 }

 int Detect()
 {
	 char size[MAX_SCANF] = { 0 };
	 cin >> size;
	 while (strlen(size) > 1)
	 {
	 loop:
		 cout << "输入格式错误!请重新输入:" << endl;
		 cin.ignore(1024, '\n');
		 cin >> size;
	 }
	 if (!isdigit(size[0]))
		 goto loop;
	 return  size[0] - '0';
 }

 void Scanf_peoinform(Datatype*x)
 {
	 if (!x)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 cout << endl << "请输入联系人信息:" << endl;
	 cout << endl << "姓名:" << endl;
	 cin >> x->name;
	 cout << endl << "性别:" << endl;
	 cin >> x->sex;
	 cout << endl << "生日:" << endl;
	 cin >> x->birthday;
	 cout << endl << "电话:" << endl;
	 cin >> x->tele;
	 cout << endl << "地址:" << endl;
	 cin >> x->address;
	 cout << endl << "关系:" << endl;
	 cin >> x->realation;
	 cout << endl << "备注:" << endl;
	 cin >> x->notes;
 }

 void Printf_peoinform(Datatype* x)
 {
	 if (!x)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 cout << "姓名: " << x->name << endl;
	 cout << "性别: " << x->sex << endl;
	 cout << "生日: " << x->birthday << endl;
	 cout << "电话: " << x->tele << endl;
	 cout << "地址: " << x->address << endl;
	 cout << "关系:" << x->realation << endl;
	 cout << "备注:" << x->notes << endl;
	 cout << "_______________________________" << endl;
 }

 void Display_contact(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 if (con->next == con)
	 {
		 cout << "通讯录中无联系人!" << endl;
		 return;
	 }
	 pListNode p = con->next;
	 while (p && p != con)
	 {
		 Printf_peoinform(&(p->data));
		 p = p->next;
	 }
	 cout << endl;
 }

 void Add_contact(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 Insert_End(con);
 }

 void Delete_contact(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 cout << endl << "请输入需要删除的联系人的姓名:";
	 char name[MAX_NAME];
	 cin >> name;
	 pListNode pos = Find_List(con, name);
	 if (pos)
	 {     
		 Delete(pos);
		 cout << "删除成功!" << endl;
	 }
	 else 
		 cout << "未找到名为:" << name << "的联系人,删除失败!" << endl;
 }

 void Serch_contact(contact* con)
 {
	 system("cls");
	 Menu_serch();
	 LABEL:
	 int num = 0;
	 num = Detect();
	 if (num == 1)
		 Serch_contact_name(con);
	 else if (num == 2)
		 Serch_contact_tele(con);
	 else
	 {
		 cout << "未找到对应的命令,请重新输入! " << endl;
		 goto LABEL;
	 }
 }

 void Serch_contact_name(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 system("cls");
	 cout << "请输入需要查询的联系人: ";
	 char name[MAX_NAME];
	 cin >> name;
	 pListNode s = con->next;
	 int flag = 0;
	 while (s != con)
	 {
		 if (strstr(s->data.name, name))
		 {
			 flag = 1;
			 Printf_peoinform(&(s->data));
		 }
		 s = s->next;
	 }
	 if (!flag)
	 {
		 cout << "未找到联系电话包含: " << name << " 的联系人!" << endl;
	 }
	 system("pause");
	 system("cls");
 }

 void Serch_contact_tele(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 system("cls");
	 cout << "请输入需要查询联系人的电话号码: ";
	 char tele[MAX_TELE];
	 cin >> tele;
	 pListNode s = con->next;
	 int flag = 0;
	 while (s != con)
	 {
		 if (strstr(s->data.tele, tele))
		 {
			 flag = 1;
			 Printf_peoinform(&(s->data));
		 }
		 s = s->next;
	 }
	 if (!flag)
	 {
		 cout << "未找到联系电话包含: " << tele << " 的联系人!" << endl;
	 }
	 system("pause");
	 system("cls");
 }

 void Revise_contact(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 pListNode pos = NULL;
	 char name[MAX_NAME];
	 int num = 0;
	 int flag = 0;
	 char size[MAX_SCANF] = { 0 };
 LABEL1:
	 if (flag)
	 {
		 Menu_select();
		 cout << "Please Input a number: " << endl;
		 num = Detect();
		 if (num == 1)
			 goto LABEL3;
		 else if (num == 2)
			 goto LABEL2;
		 else
		 {
			 cout << "程序退出,保存成功!" << endl;
			 return;
		 }
	 }
	 else
	 {
	 LABEL2:
		 cout << "请输入需要修改的联系人姓名: ";
	 }
	 cin >> name;
	 pos = Find_List(con, name);
	 if (pos)
	 {
		 cout << "查询成功!该联系人信息为:" << endl;
		 Printf_peoinform(&pos->data);
		 do
		 {
			 flag = 1;
		 LABEL3:
			 Menu_revise();
			 cout << "请选择需要修改的信息:";
			 switch (Detect())
			 {
			 case NAME:
				 cout << "请重新输入姓名:" << endl;
				 cin >> pos->data.name;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case SEX:
				 cout << "请重新输入性别:" << endl;
				 cin >> pos->data.sex;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case BIRTHDAY:
				 cout << "请重新输入生日:" << endl;
				 cin >> pos->data.birthday;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case TELE:
				 cout << "请重新输入电话:" << endl;
				 cin >> pos->data.tele;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case ADRESS:
				 cout << "请重新输入地址:" << endl;
				 cin >> pos->data.address;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case REALATION:
				 cout << "请重新输入关系:" << endl;
				 cin >> pos->data.realation;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case NOTES:
				 cout << "请重新输入备注:" << endl;
				 cin >> pos->data.notes;
				 cout << "修改成功!" << endl;
				 goto LABEL1;
				 break;
			 case EXIT:
				 cout << "程序退出,保存成功!" << endl;
				 goto LAB;
			 default:
				 cout << "无效的命令,请重新输入: " << endl;
			 }
		 } while (num);
	 }
	 else
	 {
		 cout << "未找到名为: " << name << " 的联系人,无法修改!" << endl;
	 }
 LAB:;
 }

 void Desstory_contact(contact*& con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 Destory_List(con);
	 con = Init_List();
	 cout << "清空成功!" << endl;
 }

 int Empty_contact(contact* con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 return Empty_List(con);
 }

 void Sort_name(contact*& con)
 {
	 if (!con)
	 {
		 cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		 exit(1);
	 }
	 int length = Length_List(con), i = 0;
	 if (length > 1)
	 {
		 contact** ret = (contact**)malloc(sizeof(contact*) * length), * p = con->next;
		 while (p && p != con)
		 {
			 ret[i++] = p;
			 p = p->next;
		 }
		 HeapSort(ret, length);
		 for (int i = 0; i < length - 1; i++)
		 {
			 ret[i]->next = ret[i + 1];
			 ret[i + 1]->prev = ret[i];
		 }
		 con->next = ret[0];
		 ret[0]->prev = con;
		 con->prev = ret[length - 1];
		 ret[length - 1]->next = con;
	 }
	 cout << "已将通讯录联系人按姓名首字母排序!" << endl;
 }
 //写入通讯录
  void Save_contact(contact* con)
 {
	  if (!con)
	  {
		  cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		  exit(1);
	  }
	 FILE* fin = fopen("contact.txt", "wb");
	 if (!fin)
	 {
		 cerr << "fopen_error!" << endl;
		 exit(1);
	 }
	 else
	 {
		 pListNode p = con->next;
		 while (p && p != con)
		 {
			 fwrite(&(p->data), sizeof(peoinform), 1, fin);
			 p = p->next;
		 }
		 fclose(fin);
		 fin = NULL;
		 cout << "保存成功!" << endl;
	 }
 }

  //退出通讯录,释放内存
  void Exit_contact(contact* con)
  {
	  if (!con)
	  {
		  cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		  exit(1);
	  }
	  Save_contact(con);
	  Destory_List(con);  //销毁循环双链表
  }

 //加载文件信息至通讯录
  void Loadcontact(contact* con)
  {
	  if (!con)
	  {
		  cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		  exit(1);
	  }
	  FILE* fin = fopen("contact.txt", "rb");
	  if (fin == NULL)
	  {
		  return;
	  }
	  else
	  {
		  peoinform temp = { 0 };
		  while (fread(&temp, sizeof(peoinform), 1, fin))
		  {
			  contact* newNode = Buy_newNode(&temp);
			  Insert_End(con, newNode);
		  }
	  }
	  fclose(fin);
  }

  // 比较
	  bool Compare(Ashore * L, char* x, char* y)
  {
	  if (!strcmp(L->account, x))
	  {
		  if (!strcmp(L->aode, y))
			  return true;
	  }
	  return false;
  }
  //登录
  bool Logon(Ashore* L)
  {
	  char account[MAX_account];
	  char aode[MAX_code];
	  cout << "请输入账号" << endl;
	  cin >> account;
	  cout << "请输入密码" << endl;
	  cin >> aode;
	  return !strcmp(L->account, account) && !strcmp(L->aode, aode);
  }

  void Scan(Ashore* L, char* x, char* y)
  {
	  strcpy(L->account, x);
	  strcpy(L->aode, y);
	  Save_(L);
  }
  //注册
  void Registe(Ashore* L)
  {
	  char account[MAX_account] = { 0 };
	  char aode[MAX_code] = { 0 };
	  cout << "请输入账号" << endl;
	  cin >> account;
	  cout << "请输入密码" << endl;
	  cin >> aode;
	  Scan(L, account, aode);
  }
  //写入
  void Save_(Ashore* L)
  {
	  if (!L)
	  {
		  cerr << ":)  ERROR!    Function argument is nullptr!" << endl;
		  exit(1);
	  }
	  FILE* fp = fopen("Ashore.txt", "wb");
	  if (!fp)
	  {
		  cerr << "fopen_error!" << endl;
		  exit(1);
	  }
	  else
	  {
		  fwrite(L, sizeof(Ashore), 1, fp);
		  fclose(fp);
		  fp = NULL;
		  cout << "保存成功" << endl;
		  system("pause");
		  system("cls");
	  }
  }
  //加载密码
  Ashore* Loadcontact_()
  {
	  FILE* fp = fopen("Ashore.txt", "rb");
	  if (fp == NULL)
	  {
		  return NULL;
	  }
	  else
	  {
		  Ashore temp = { 0 };
		  if (fread(&temp, sizeof(Ashore), 1, fp))
		  {
			  Ashore* newNode = Buy_(&temp);
			  fclose(fp);
			  return newNode;
		  }
		  else
		  {
			  return NULL;
		  }
	  }
	  return NULL;
  }
  Ashore* Buy_(Ashore* L)
  {
	  Ashore* newnode = (Ashore*)malloc(sizeof(Ashore));
	  strcpy(newnode->account, L->account);
	  strcpy(newnode->aode, L->aode);
	  return newnode;
  }
  Ashore* In_()
  {
	  Ashore* first = (Ashore*)malloc(sizeof(Ashore));
	  return first;
  }

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

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

相关文章

Android 开发投屏软件

一、背景 作为Android开发总会有给他人share自己APP情况&#xff0c;一般在线会议投屏&#xff0c;总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力&#xff0c;可以在电脑端直接控制手机&#xff0c;同步起来非常方便简单 打开步骤 …

【Kubernetes】K8s 中的 Pod 驱逐

K8s 中的 Pod 驱逐 1.Pod 被驱逐的原因&#xff1a;抢占和节点压力2.抢占式驱逐2.1 Pod 调度2.1.1 过滤2.1.2 计分 2.2 Pod 优先级2.3 优先级示例 3.节点压力驱逐3.1 服务质量等级3.1.1 Guaranteed3.1.2 Burstable3.1.3 BestEffort 4.其他类型的驱逐4.1 API 发起的驱逐&#xf…

[机器学习]练习-KNN算法

1&#xff0e;&#x1d458;近邻法是基本且简单的分类与回归方法。&#x1d458;近邻法的基本做法是&#xff1a;对给定的训练实例点和输入实例点&#xff0c;首先确定输入实例点的&#x1d458;个最近邻训练实例点&#xff0c;然后利用这&#x1d458;个训练实例点的类的多数来…

代码随想录算法训练营三刷 day38 | 动态规划之 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

三刷day38 509. 斐波那契数1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 70. 爬楼梯1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 746. 使用最小花费爬楼梯1 确定dp数组以及下标…

Disruptor

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这是我作为学习笔记总结应用篇最后一篇&#xff0c;本章大量的参考了别的博主的文章。 我们今天一起来看一个开源项目 Disruptor。看看我们怎么利用 CPU 和高速缓存的硬件特性&#xff0c;来设计一个对于性能有极限追求的系…

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器&#xff0c;交换机之间通过Trunk链路相连&#xff0c;路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…

python批量转化pdf图片为jpg图片

1.把pdf图片批量转为jpg&#xff1b;需要注意的是&#xff0c;需要先安装poppler这个软件&#xff0c;具体安装教程放在下面代码中了 2.代码 #poppler安装教程参考&#xff1a;https://blog.csdn.net/wy01415/article/details/110257130 #windows上poppler下载链接&#xff1a…

只出现一次的数字 II

题目链接 只出现一次的数字 II 题目描述 注意点 nums中&#xff0c;除某个元素仅出现一次外&#xff0c;其余每个元素都恰出现三次设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题 解答思路 本题与只出现一次的数字的数字类似&#xff0c;区别是重复的数字会…

游戏领域AI智能视频剪辑解决方案

游戏行业作为文化创意产业的重要组成部分&#xff0c;其发展和创新速度令人瞩目。然而&#xff0c;随着游戏内容的日益丰富和直播文化的兴起&#xff0c;传统的视频剪辑方式已难以满足玩家和观众日益增长的需求。美摄科技&#xff0c;凭借其在AI智能视频剪辑领域的深厚积累和创…

手写SpringBoot(三)之自动配置

系列文章目录 手写SpringBoot&#xff08;一&#xff09;之简易版SpringBoot 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 手写SpringBoot&#xff08;三&#xff09;之自动配置 手写SpringBoot&#xff08;四&#xff09;之bean动态加载 手写SpringBoot…

内网穿透时报错【Bad Request This combination of host and port requires TLS.】的原因

目录 1.内网直接https访问&#xff08;可以正常访问&#xff09; 程序配置的证书 2.内网穿透后,通过外网访问 3.原因 4.内网非https的Web应用&#xff0c;使用https后&#xff0c;也变成了https访问 5.题外话 感觉自己的web应用配置了https&#xff0c;反而影响了内网穿…

单词频次-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第44讲。 单词频次&#xf…

SpringAMQP-Exchange交换机

1、Fanout-Exchange的特点是&#xff1a;和它绑定的消费者都会收到信息 交换机的作用是什么? 接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息&#xff0c;路由失败&#xff0c;消息丢失FanoutExchange的会将消息路由到每个绑定的队列 声明队列、交…

MySQL 数据库基础操作详解

文章目录 MySQL 数据库基础操作详解1. 基本概念2. 库的操作3. 表的操作4. 数据操作5. 示例示例一&#xff1a;创建表和插入数据示例二&#xff1a;查询数据示例三&#xff1a;更新数据示例四&#xff1a;删除数据 MySQL 数据库基础操作详解 MySQL 是一种常用的关系型数据库管理…

linux查找指定目录下包含指定字符串文件,包含子目录

linux查找指定目录下包含指定字符串的文件&#xff0c;包含子目录 linux查找指定目录下包含指定字符串的指定文件格式&#xff0c;包含子目录 指定目录 cd /home/www/linux查找指定目录下包含指定字符串的文件&#xff0c;包含子目录 grep -r "指定字符串"注释 gr…

深入理解Happens-Before原则:以实例解析并发编程的基石

在最近的一次面试中面试官问到了Happens-Before原则&#xff0c;作此篇回顾下知识点。 在并发编程中&#xff0c;为了保证程序的正确性和可预测性&#xff0c;我们需要理解并遵循一系列内存访问规则。Happens-Before原则定义了线程间可见性和顺序性的保证。所有此篇文章将通过…

代码随想录训练营Day39:● 62.不同路径 ● 63. 不同路径 II

62.不同路径 题目链接 https://leetcode.cn/problems/unique-paths/description/ 题目描述 思路 dp[i][j] 表示的是走到&#xff08;i&#xff0c;j&#xff09;有多少种不同的路径 第一行和第一列都需要初始化为1&#xff0c;因为这些位置都只有一种路径 class Solution {…

头歌 实验一 关系数据库标准语言SQL湖北汽车工业学院 )

头歌 实验一 关系数据库标准语言SQL 制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01; 目录 头歌 实验一 关系数据库标准语言SQL**制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01;** 第一关&#xff1a;创建数据库第…

C++ :STL中deque的原理

deque的结构类似于哈希表&#xff0c;使用一个指针数组存储固定大小的数组首地址&#xff0c;当数据分布不均匀时将指针数组内的数据进行偏移&#xff0c;桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来&#xff0c;从原理可以看出deque的性能是非常高的…

用Kimichat拆解雷军在小米汽车SU7发布会上的演讲技巧

小米SU7发布会可以说是非常成功。雷军的演讲技巧是发布会成功的重要因素之一&#xff0c;很值得借鉴学习。 可以借助Kimichat来深度拆解雷军在小米汽车SU7发布会上的演讲技巧。 在kimichat中输入提示词&#xff1a; 根据文件《雷军小米SU7发布会演讲文字稿》&#xff0c;总结…