当前位置:网站首页>[C language] static & dynamic & file address book (over 10000 words)
[C language] static & dynamic & file address book (over 10000 words)
2022-07-18 03:43:00 【Ordinary person 1】
author :@ Ordinary person 1
special column :《C Language from 0 To 1》
In a word : In the past , All is prologue
explain : The past is irreparable , The future can change
List of articles
Preface
This blog will introduce the address book , The so-called address book is based on the function of adding, deleting, checking and modifying , And add some other functions by yourself . Based on this , Bloggers will pass C Language to achieve three versions of the address book . Three versions of address book :
- Static address book
Static address book , When the information is not entered , By maximum capacity in the form of array 1000 Application memory , But it's not flexible enough , There will be a waste of memory or insufficient memory , For this question , We introduced dynamic address book .
- Dynamic address book
Dynamic address book , Make space more flexible , There will be no memory problem like static address book . At first, we can store by default 3 Personal information , When the current address book memory space is insufficient , We will expand the capacity , Each time 2 individual .
- File address book
The reason why I write file address book , It's because whether it's a static address book or a dynamic address book , The information entered each time cannot be saved , After exiting the address book, the message disappears , Have to re-enter . The emergence of file address book can solve this problem .
preparation
For three versions of address book design layout , It's all the same :
Mining In a modular way , The address book is divided into test.c、contact.c Two source files and contact.h A header file .
test.c: The main function interface is introduced .
contact.c: The realization of function function function
contact.h: Header file import 、 Function declaration 、 Structure declaration .
We directly from The main function Start with , That is to say test.c The document began to talk about
Static address book
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
/* * Add contact information Delete the specified contact information Find the specified contact information Modify designated contact information Show all contact information Clear all contacts Sort all contacts by name */
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
CLEAR,
SORTNAME
};
void menu()
{
printf("*******************************************\n");
printf("****** 1.add 2.del ******\n");
printf("****** 3.search 4.modify****\n");
printf("****** 5.show 6.clear ****\n");
printf("****** 7.sortName 0.exit *****\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf(" Please select :>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case SORTNAME:
SortContact(&con);
break;
case EXIT:
printf(" Exit address book \n");
break;
default:
printf(" Wrong choice \n");
break;
}
} while (input);
return 0;
}
analysis : The main function part mainly adopts dowhile Statement and switch sentence . meanwhile , When we choose, we may forget the function represented by the number , So we use enumeration types to solve this problem , Make us more convenient .
contact.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];
int count;
}Contact;
// initialization
void InitContact(Contact* pc);
// add to
void AddContact(Contact* pc);
// Print
void ShowContact(const Contact* pc);
// Delete
void DelContact(Contact* pc);
// lookup
void SearchContact(Contact* pc);
// modify
void ModifyContact(Contact*pc);
// Empty
void ClearContact(Contact* pc);
// Sort
void SortContact(Contact* pc);
analysis :contact.h It is the design of address book structure and the declaration of function , And the introduction of some header files , meanwhile , For some variables ,
For convenience of modification , We use #define To define . For human information , We defined the name , Age , full name , Telephone , Address and other information .
Then we need to store it , Define another structure , Including the array for storing information , And the current number . And the declaration of function .
contact.h That's what it does
contac.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void InitContact(Contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(Contact* pc)
{
assert(pc);
if (pc->count == MAX)
{
printf(" The address book is full , Unable to add \n");
return;
}
printf(" Please enter a name :");
scanf("%s", pc->data[pc->count].name);
printf(" Please enter age :");
scanf("%d", &pc->data[pc->count].age);
printf(" Please enter gender :");
scanf("%s", pc->data[pc->count].sex);
printf(" Please input the phone number :");
scanf("%s", pc->data[pc->count].tele);
printf(" Please enter the address :");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf(" Increase success \n");
}
void ShowContact(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n"," name "," Age "," Gender "," Telephone "," Address ");
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age,
pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
static int FindByName(Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
int i = 0;
if (pc->count == 0)
{
printf(" Address book is empty , No information can be deleted \n");
return;
}
printf(" Please enter the name of the person you want to delete :>");
scanf("%s", name);
// lookup
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person to delete does not exist \n");
return;
}
// Delete
for (i = pos; i < pc->count-1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf(" Delete successful \n");
}
void SearchContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
printf(" Please enter the name of the person you want to search for :>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person you're looking for doesn't exist \n");
return;
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", " name ", " Age ", " Gender ", " Telephone ", " Address ");
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age,
pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
}
void ModifyContact(Contact*pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
printf(" Please enter the name of the person you want to modify :>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person to modify does not exist \n");
return;
}
else
{
printf(" Please enter a name :");
scanf("%s", pc->data[pos].name);
printf(" Please enter age :");
scanf("%d", &pc->data[pos].age);
printf(" Please enter gender :");
scanf("%s", pc->data[pos].sex);
printf(" Please input the phone number :");
scanf("%s", pc->data[pos].tele);
printf(" Please enter the address :");
scanf("%s", pc->data[pos].addr);
printf(" Modification successful \n");
}
}
void ClearContact(Contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
printf(" Empty successfully !\n");
}
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
assert(pc);
for (int i = 0; i < pc->count-1; i++)
{
qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);
}
printf(" Sort success !\n");
}
analysis :contact.c That's right contact.h The functions declared inside are implemented . For some information search , For example, delete function , We all operate based on names , You can also follow your own ideas .
Okay , This is the static address book .
Dynamic address book
The biggest difference between the dynamic address book and the static address book lies in the definition of the structure , There is an additional variable of capacity . And when adding contacts, you should judge whether the capacity is enough , So we can package a function to judge whether the capacity is enough , If not enough, expand the capacity
And it involves dynamic memory , Then we need to encapsulate a function to release memory
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
/* * Add contact information Delete the specified contact information Find the specified contact information Modify designated contact information Show all contact information Clear all contacts Sort all contacts by name */
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
CLEAR,
SORTNAME
};
void menu()
{
printf("*******************************************\n");
printf("****** 1.add 2.del ******\n");
printf("****** 3.search 4.modify****\n");
printf("****** 5.show 6.clear ****\n");
printf("****** 7.sortName 0.exit *****\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf(" Please select :>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case SORTNAME:
SortContact(&con);
break;
case EXIT:
DestroyContact(&con);
printf(" Exit address book \n");
break;
default:
printf(" Wrong choice \n");
break;
}
} while (input);
return 0;
}
contact.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
//typedef struct Contact
//{
// PeoInfo data[MAX];
// int count;
//}Contact;
// Dynamic version
typedef struct Contact
{
PeoInfo* data;
int count;
int capacity;
}Contact;
// initialization
int InitContact(Contact* pc);
// add to
void AddContact(Contact* pc);
// Print
void ShowContact(const Contact* pc);
// Delete
void DelContact(Contact* pc);
// lookup
void SearchContact(Contact* pc);
// modify
void ModifyContact(Contact* pc);
// Empty
void ClearContact(Contact* pc);
// Sort
void SortContact(Contact* pc);
// The destruction
void DestroyContact(Contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
int InitContact(Contact* pc)
{
assert(pc);
pc->count = 0;
pc->data = (PeoInfo*)calloc(3,sizeof(PeoInfo));
if (pc->data == NULL)
{
printf("InitContact:%s\n", strerror(errno));
return 1;
}
pc->capacity = DEFAULT_SZ;
return 0;
}
void CheckCapacity(Contact* pc)
{
if (pc->count == pc->capacity)
{
PeoInfo* ptr = realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
printf("ADDContact:%s\n", strerror(errno));
return;
}
else
{
pc->data = ptr;
pc->capacity += INC_SZ;
printf(" Successful expansion \n");
}
}
}
// Dynamic version
void AddContact(Contact* pc)
{
assert(pc);
CheckCapacity(pc);
printf(" Please enter a name :");
scanf("%s", pc->data[pc->count].name);
printf(" Please enter age :");
scanf("%d", &pc->data[pc->count].age);
printf(" Please enter gender :");
scanf("%s", pc->data[pc->count].sex);
printf(" Please input the phone number :");
scanf("%s", pc->data[pc->count].tele);
printf(" Please enter the address :");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf(" Increase success \n");
}
void ShowContact(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", " name ", " Age ", " Gender ", " Telephone ", " Address ");
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age,
pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
static int FindByName(Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
int i = 0;
if (pc->count == 0)
{
printf(" Address book is empty , No information can be deleted \n");
return;
}
printf(" Please enter the name of the person you want to delete :>");
scanf("%s", name);
// lookup
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person to delete does not exist \n");
return;
}
// Delete
for (i = pos; i < pc->count - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf(" Delete successful \n");
}
void SearchContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
printf(" Please enter the name of the person you want to search for :>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person you're looking for doesn't exist \n");
return;
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", " name ", " Age ", " Gender ", " Telephone ", " Address ");
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age,
pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
}
void ModifyContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
printf(" Please enter the name of the person you want to modify :>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person to modify does not exist \n");
return;
}
else
{
printf(" Please enter a name :");
scanf("%s", pc->data[pos].name);
printf(" Please enter age :");
scanf("%d", &pc->data[pos].age);
printf(" Please enter gender :");
scanf("%s", pc->data[pos].sex);
printf(" Please input the phone number :");
scanf("%s", pc->data[pos].tele);
printf(" Please enter the address :");
scanf("%s", pc->data[pos].addr);
printf(" Modification successful \n");
}
}
void ClearContact(Contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
printf(" Empty successfully !\n");
}
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
assert(pc);
for (int i = 0; i < pc->count - 1; i++)
{
qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);
}
printf(" Sort success !\n");
}
void DestroyContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}
File address book
The file version address book is improved on the basis of the dynamic version address book , We need to save the information before exiting the address book , And we need to be able to load files after each initialization , Let the address book have information . This is the biggest difference !
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
/* * Add contact information Delete the specified contact information Find the specified contact information Modify designated contact information Show all contact information Clear all contacts Sort all contacts by name */
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
CLEAR,
SORTNAME
};
void menu()
{
printf("*******************************************\n");
printf("****** 1.add 2.del ******\n");
printf("****** 3.search 4.modify****\n");
printf("****** 5.show 6.clear ****\n");
printf("****** 7.sortName 0.exit *****\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf(" Please select :>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case SORTNAME:
SortContact(&con);
break;
case EXIT:
// Save information to file
SaveContact(&con);
// Destroy the address book
DestroyContact(&con);
printf(" Exit address book \n");
break;
default:
printf(" Wrong choice \n");
break;
}
} while (input);
return 0;
}
contact.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
//typedef struct Contact
//{
// PeoInfo data[MAX];
// int count;
//}Contact;
// Dynamic version
typedef struct Contact
{
PeoInfo* data;
int count;
int capacity;
}Contact;
// initialization
int InitContact(Contact* pc);
// add to
void AddContact(Contact* pc);
// Print
void ShowContact(const Contact* pc);
// Delete
void DelContact(Contact* pc);
// lookup
void SearchContact(Contact* pc);
// modify
void ModifyContact(Contact* pc);
// Empty
void ClearContact(Contact* pc);
// Sort
void SortContact(Contact* pc);
// The destruction
void DestroyContact(Contact* pc);
// Save address book information to a file
void SaveContact(Contact* pc);
// Load the contents of the file into the address book
void LoadContact(Contact* pc);
//
void CheckCapacity(Contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void LoadContact(Contact* pc)
{
FILE* pf = fopen("contact.dat", "r");
if (pf == NULL)
{
perror("LoadContact");
return;
}
// Reading documents
PeoInfo tmp = {
0 };
while (fread(&tmp, sizeof(PeoInfo), 1, pf))
{
// Whether to increase capacity
CheckCapacity(pc);
pc->data[pc->count] = tmp;
pc->count++;
}
// Close file
fclose(pf);
pf = NULL;
}
int InitContact(Contact* pc)
{
assert(pc);
pc->count = 0;
pc->data = (PeoInfo*)calloc(3, sizeof(PeoInfo));
if (pc->data == NULL)
{
printf("InitContact:%s\n", strerror(errno));
return 1;
}
pc->capacity = DEFAULT_SZ;
// Load the file
LoadContact(pc);
return 0;
}
void CheckCapacity(Contact* pc)
{
if (pc->count == pc->capacity)
{
PeoInfo* ptr = realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
printf("ADDContact:%s\n", strerror(errno));
return;
}
else
{
pc->data = ptr;
pc->capacity += INC_SZ;
printf(" Successful expansion \n");
}
}
}
// Dynamic version
void AddContact(Contact* pc)
{
assert(pc);
CheckCapacity(pc);
printf(" Please enter a name :");
scanf("%s", pc->data[pc->count].name);
printf(" Please enter age :");
scanf("%d", &pc->data[pc->count].age);
printf(" Please enter gender :");
scanf("%s", pc->data[pc->count].sex);
printf(" Please input the phone number :");
scanf("%s", pc->data[pc->count].tele);
printf(" Please enter the address :");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf(" Increase success \n");
}
void ShowContact(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", " name ", " Age ", " Gender ", " Telephone ", " Address ");
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age,
pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
static int FindByName(Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
int i = 0;
if (pc->count == 0)
{
printf(" Address book is empty , No information can be deleted \n");
return;
}
printf(" Please enter the name of the person you want to delete :>");
scanf("%s", name);
// lookup
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person to delete does not exist \n");
return;
}
// Delete
for (i = pos; i < pc->count - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf(" Delete successful \n");
}
void SearchContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
printf(" Please enter the name of the person you want to search for :>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person you're looking for doesn't exist \n");
return;
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", " name ", " Age ", " Gender ", " Telephone ", " Address ");
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age,
pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
}
void ModifyContact(Contact* pc)
{
char name[MAX_NAME] = {
0 };
assert(pc);
printf(" Please enter the name of the person you want to modify :>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf(" The person to modify does not exist \n");
return;
}
else
{
printf(" Please enter a name :");
scanf("%s", pc->data[pos].name);
printf(" Please enter age :");
scanf("%d", &pc->data[pos].age);
printf(" Please enter gender :");
scanf("%s", pc->data[pos].sex);
printf(" Please input the phone number :");
scanf("%s", pc->data[pos].tele);
printf(" Please enter the address :");
scanf("%s", pc->data[pos].addr);
printf(" Modification successful \n");
}
}
void ClearContact(Contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
printf(" Empty successfully !\n");
}
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
assert(pc);
for (int i = 0; i < pc->count - 1; i++)
{
qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);
}
printf(" Sort success !\n");
}
void DestroyContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}
void SaveContact(Contact* pc)
{
FILE*pf = fopen("Contact.dat", "w");
if (pf == NULL)
{
perror("SaveContact");
return;
}
// Writing documents
int i = 0;
for (i = 0; i < pc->count; i++)
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
}
// Close file
fclose(pf);
pf = NULL;
}

边栏推荐
- DEVKIT-mpc5744p配置rtos
- 聚簇索引和非聚簇索引
- The difference between B tree and b+ tree
- Lesson 2 WiFi experiment of hi3861 -api-1
- [development tutorial 17] AI voice face recognition (Conference recorder / face punch) -ai face registration, authentication and recognition
- Fuxin software appeared at the 2022 national chemical enterprise digital intelligence transformation and Development Forum
- leetcode:300. 最长递增子序列【LIS板子 + 贪心二分 + nlogn】
- The software supply chain security risk that makes enterprise digitalization and it executives bear the brunt of the cauldron points to the north
- Clickpaas Ma Jun: model driven low code platform practice
- Between the virtual and the real 03 | with these technologies, you are the "magic pen Ma Liang" that makes digital people live
猜你喜欢

Gates donated another $20billion, Google cloud switched to arm, and twitter employees were warned by CEO musk. Today, more big news is here

Will the expired data of redis be deleted immediately? Great mystery

Chromium Threading and Task

布局元宇宙社交,数字经济将迎来发展新机遇
![leetcode:300. Longest increasing subsequence [LIS board + greedy dichotomy + nlogn]](/img/1c/cfbeb0ef8b0adea03b901653c0d7ed.png)
leetcode:300. Longest increasing subsequence [LIS board + greedy dichotomy + nlogn]

Tencent T4 architects give you a "glimpse" of the main technical challenges and solutions of large website architecture

真的牛b!京东T3-2都还在学的微服务+MySQL+Kafka+boot2.x+虚拟机PDF

The colleague next to me was suddenly promoted to meituan P7 because he secretly learned this JVM note?

Digital ecological map of human resources in China - flexible employment market

水电站设备也能远程运维
随机推荐
“小白嘴”白山药是哪个县的特色农产品? 蚂蚁新村7月15日答案
5 款内部系统搭建低代码平台评测
The latest research of Zhu Songchun's team: robots can "confide" with humans! Also said that the next step is to create "Ai white"
想成为精英级开发者?请逼自己养成这10个习惯
Comparison of xssfworkbook, sxssfworkbook and easyexcel reading Excel files
Go zero micro service practical series (v. how to write cache code)
Equal subtrees on binary trees
Data transmission: Practice of batch extraction of isomorphic and heterogeneous IP data sources
曾经,我对着AI客服喷了两分钟,它只回复了我的第一句话
腾讯T4架构师带你“一窥”大型网站架构的主要技术挑战和解决方案
The difference between B tree and b+ tree
PD-Server GRPC 接口图解
Where is the IBD file of MySQL in win11 virtual machine
聊聊异步编程的 7 种实现方式
APUE learning notes - Chapter 15 interprocess communication
Really cow b! JD t3-2 is still learning microservice +mysql+kafka+boot2 X+ virtual machine pdf
Flutter 中的 offstage
Implementation of ZABBIX proxy active mode
朱松纯团队最新研究:机器人可与人类“推心置腹”!还说下一步要造“AI大白”...
MySQL中的索引