C语言与C++动态通讯录超详细实现流程

目录
  • 1、思路以及要实现的功能
  • 2、详细步骤
    • 2.1 打印菜单界面(建一个源文件test.c)
    • 2.2 主函数
    • 2.3 初始化函数与加载函数
    • 2.4 增加联系人函数AddContact
    • 2.5 删除联系人函数DelContact
    • 2.6 查找联系人函数与打印函数
    • 2.7 修改信息函数ModifyContact
    • 2.8 排序函数SortContact
    • 2.9 保存信息函数与销毁数据函数
  • 3、源码

1、思路以及要实现的功能

通讯录就是为了存储许多联系人的不同方面的信息如名字、电话、地址、年龄、性别等,除此之外,还要实现增删查改还有打印通讯录等功能,所以我们先把要实现的功能列出来:

  • 增加联系人
  • 删除联系人
  • 搜索联系人
  • 修改联系人信息
  • 按年龄大小排序联系人
  • 打印联系人信息

2、详细步骤

2.1 打印菜单界面(建一个源文件test.c)

void menu()
{
	printf("********************************\n");
	printf("******  1.add    2.delete ******\n");
	printf("******  3.search 4.modify ******\n");
	printf("******  5.sort   6.print  ******\n");
	printf("************ 0.exit  ***********\n");
	printf("*******************************\n");
}

2.2 主函数

写出我们的主函数,利用do-while循环,并把即将要实现的功能先放在主函数内

在写函数之前,我们也要先定义一个结构体来存放联系人的信息还有联系人个数以及通讯录的最大容量,所以我们建一个头文件,称为contact.h,用来存放这些信息。

#pragma once
#include<stdio.h>
#define NAME_MAX 20//名字的最大长度
#define SEX_MAX 6
#define TELE_MAX 12//号码的最大位数
#define ADDR_MAX 30//地址的最大位数
#define ADD_PEO 1//每次拓展通讯录的人数
#define PEO_NUM 3//通讯录的初始容量
//类型的定义
typedef struct Peoinfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}Peoinfo;
typedef struct Contact
{
	Peoinfo *data;//指向动态申请的空间,存放联系人的信息
	int sz;//记录通讯录中有效信息的个数
	int capacity;//记录当前通讯录的最大容量
}Contact

除此之外,我们可以利用枚举将函数的选项封装一下!(存放在test.c)

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
}

这样子我们就可以写主函数啦!

#include "contact.h"
int main()
{
	Contact con;//创建通讯录
	InitContact(&con);//初始化通讯录
	int input=0;
	do
	{
		menu();
		printf("请选择:");
		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 SORT:
			SortContact(&con);//排序
			break;
		case PRINT:
			PrintContact(&con);//打印通讯录
			break;
		case EXIT:
			SaveContact(&con);//保存通讯录
			DestoryContact(&con);//销毁信息
			printf("退出通讯录!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	}while(input);
	return 0;
}

好啦!这样子我们就把轮廓写好了,现在就要一个个的实现每个函数的功能了!

2.3 初始化函数与加载函数

初始化函数InitContact与加载函数LoadContact

这里我们要先利用动态内存函数位信息开辟内存,然后用文件操作打开我们保存信息的文件中读取信息。

void InitContact(Contact* pc)
{
	pc->data=(Peoinfo*)malloc(PEO_NUM * sizeof(Peoinfo));
	if(pc->data==NULL)
	{
		perror("InitContact");
		return;
	}
	pc->sz=0;
	pc->capacity=PEO_NUM;

	LoadContact(pc);//加载已有的通讯录
}
void LoadContact(Contact* pc)
{
	File* pf = fopen("contact.txt","r");//创建或访问contact.txt读取信息
	if(pf == NULL)
	{
		perror("LoadContact");
		return;
	}
	Peoinfo tmp={0};
	while(fread(&tmp,sizeof(Peoinfo),1,pf))
	{
		if(pc->sz==pc->capacity)
		{
			Peoinfo* ptr=(Peoinfo*)realloc(pc,(ADD_PEO+pc->capacity)sizeof(Peoinfo));
			if(ptr!=NULL)
			{
				pc->data=ptr;
				pc->capacity+=ADD_PEO;
			}
			else
			{
				perror("AddContact");
				printf("读取通讯录失败!\n");
				return;
			}
		}
		pc->data[pc->sz]=tmp;
		pc->sz++;
	}
	fclose(pf);
	pf=NULL;
}

这里我们创建一个Contact.c源文件来存放各自函数的功能,然后将函数的各个声明放到Contact.h中,以下也如此。

2.4 增加联系人函数AddContact

void AddContact(Contact* pc)
{
	if(pc->sz==pc->capacity)
	{
		(Peoinfo*)ptr=(Peoinfo*)realloc(pc,(ADD_PEO+pc->capacity) * sizeof(Peoinfo));
		if(ptr!=NULL)
		{
			pc->data=ptr;
			pc->capacity+=ADD_PEO;
		}
		else
		{
			perror("AddContact");
			printf("读取通讯录失败!\n");
			return;
		}
	}
	printf("请输入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("增加成功!\n");
}

2.5 删除联系人函数DelContact

在实现该函数之前,我们发现,删除联系人函数与接下来的查找联系人、修改信息等函数有个共同的特点,那就是要先判断这个要做动作的联系人存不存在,所以考虑这点我们决定先封装一个FindByName函数用来判断这个人以及返回这个人信息的位置。

#include <string.h>
static int FindByName(Contact* pc,char*name)
{
	int i=0;
	for(i=0;i<pc->sz;i++)
	{
		if(strcmp(pc->data[i].name,name)==0)
			return i;
	}
	return -1;
}

接下来我们就来实现删除联系人函数:

void DelContact(Contact* pc)
{
	char delname[NAME_MAX]={0};
	if (pc->sz == 0)
	{
		printf("通讯录为空,无须删除!\n");
		return;
	}
	printf("请输入要删除人的名字:");
	scanf("%s", delname);
	//查找要删除的人
	int pos=FindByName(pc,delname);
	if(pos==-1)
	{
		printf("查无此人的信息!\n");
		return;
	}
	else
	{
		int i=0;
		for(i=pos;i<pc->sz-1;i++)
		{
			pc->data[i]=pc->data[i+1];
		}
		pc->sz--;
		printf("删除联系人成功!\n");
	}
}

2.6 查找联系人函数与打印函数

查找联系人函数SearchContact与打印函数PrintContact

查找函数的功能是查找通讯录中是否有此人,并将其打印出来,所以我们可以顺便的把打印函数PrintContact实现。

void PrintContact(Contact* pc)
{
	//打印标题
	printf("****************************************************************************\n");
	printf("|姓名                |性别  |年龄  |电话号码    |地址                      |\n");
	if (pc->sz == 0)
	{
		printf("通讯录无信息!\n");
		printf("****************************************************************************\n");
		return;
	}
	for (int i = 0; i < pc->sz; i++)
	{
		printf("|%-20s|%-6s|%-6d|%-12s|%-26s|\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
	printf("****************************************************************************\n");
	printf("\n");
}

接下来实现查找联系人函数:

void SearchContact(Contact* pc)
{
	char findname[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无须删除!\n");
		return;
	}
	printf("请输入要查找的人的名字:");
	scanf("%s", findname);
	int pos=FindByName(pc,findname);
	if (pos == -1)
	{
		printf("查无此人的信息!\n");
		return;
	}
	printf("****************************************************************************\n");
	printf("|姓名                |性别  |年龄  |电话号码    |地址                      |\n");
	printf("|%-20s|%-6s|%-6d|%-12s|%-26s|\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
	printf("****************************************************************************\n");
	printf("\n");
}

2.7 修改信息函数ModifyContact

void ModifyContact(Contact* pc)
{
	char findname[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无须删除!\n");
		return;
	}
	printf("请输入要查找的人的名字:");
	scanf("%s", findname);
	int pos=FindByName(pc,findname);
	if (pos == -1)
	{
		printf("查无此人的信息!\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("请输入住址:");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功!\n");
}

2.8 排序函数SortContact

这里使用的是按年龄排序(冒泡排序),读者可按自己的需求实现不同的方法函数。

void SortContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录无信息,无法排序!\n");
		return;
	}
	int i=0,j=0;
	for(i=0;i<pz->sz-1;i++)
	{
		int flag=1;
		for(j=0;j<pz->sz-1-i;j++)
		{
			if(pz->data[j].age>pz->data[[j+1].age)
			{
				Peoinfo tmp[2];
				tmp[0] = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp[0];
				flag=0;
			}
		}
		if(flag==1)
			break;
	}
	printf("排序完成!\n");
}

2.9 保存信息函数与销毁数据函数

保存信息函数SaveContact与销毁数据函数DestoryContact

通讯录的大体功能我们都实现了,剩下的就是保存我们的信息到文本中与将各个数据置零了。我们先实现保存函数SaveContact:

void SaveContact(Contact* pc)
{
	File* pf=fopen("contact.txt","w");
	if(pf==NULL)
	{
		perror("SaveContact");
		return;
	}
	int i=0;
	for(i=0;i<pc->sz;i++)
	{
		fwrite(pc->data+i,sizeof(Peoinfo),1,pf);
	}
	fclose(pf);
	pf=NULL;
}

实现下面的销毁数据函数DestoryContact:

void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc->data=NULL;
	pc->sz=0;
	pc->capacity=0;
}

完结撒花!!

3、源码

test.c

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void menu()
{
	printf("********************************\n");
	printf("******  1.add    2.delete ******\n");
	printf("******  3.search 4.modify ******\n");
	printf("******  5.sort   6.print  ******\n");
	printf("************ 0.exit  ***********\n");
	printf("*******************************\n");
}
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};
int main()
{
	Contact con;//创建通讯录
	InitContact(&con);//初始化通讯录
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		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 SORT:
			SortContact(&con);
			break;
		case PRINT:
			PrintContact(&con);//打印通讯录
			break;
		case EXIT:
			SaveContact(&con);//保存通讯录
			DestoryContact(&con);
			printf("退出通讯录!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NAME_MAX 20
#define SEX_MAX 6
#define TELE_MAX 12
#define ADDR_MAX 30
#define ADD_PEO 1
#define PEO_NUM 3
//#define PEO_MAX 1000
//类型的定义
typedef struct Peoinfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}Peoinfo;
//动态版本
typedef struct Contact
{
	Peoinfo *data;//指向动态申请的空间,存放联系人的信息
	int sz;//记录通讯录中有效信息的个数
	int capacity;//记录当前通讯录的最大容量
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//增加人的信息
void AddContact(Contact* pc);
//打印通讯录
void PrintContact(const Contact* pc);
//输出人的信息
void DelContact(Contact* pc);
//按名字查找
int FindByName(Contact* pc, char* name);
//查找信息
void SearchContact(Contact* pc);
//修改信息
void ModifyContact(Contact* pc);
//排序信息
void SortContact(Contact* pc);
//销毁通讯录
void DestoryContact(Contact* pc);
//保存通讯录
void SaveContact(Contact* pc);
//加载通讯录
void LoadContact(Contact* pc);

contact.c

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void LoadContact(Contact* pc)
{
	FILE* pf = fopen("contact.txt", "r");
	if (pf == NULL)
	{
		perror("LoadContact");
		return;
	}
	Peoinfo tmp = { 0 };
	while (fread(&tmp, sizeof(Peoinfo), 1, pf))
	{
		if (pc->sz == pc->capacity)
		{
			Peoinfo* ptr = (Peoinfo*)realloc(pc->data, (pc->capacity + ADD_PEO) * sizeof(Peoinfo));
			if (ptr != NULL)
			{
				pc->data = ptr;
				pc->capacity+=ADD_PEO;
			}
			else
			{
				perror("AddContact");
				printf("读取通讯录失败!\n");
				return;
			}
		}
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	fclose(pf);
	pf = NULL;
}
void InitContact(Contact* pc)
{
	pc->data = (Peoinfo*)malloc(PEO_NUM * sizeof(Peoinfo));
	if (pc->data == NULL)
	{
		perror("InitContact");
		return;
	}
	pc->sz = 0;
	pc->capacity = PEO_NUM;
	//加载通讯录
	LoadContact(pc);
}
void AddContact(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		Peoinfo* ptr = (Peoinfo*)realloc(pc->data, (pc->capacity + ADD_PEO) * sizeof(Peoinfo));
		if (ptr != NULL)
		{
			pc->data=ptr;
			pc->capacity += ADD_PEO;
			printf("增加容量成功!\n");
		}
		else
		{
			perror("AddContact");
			printf("增加联系人失败!\n");
			return;
		}
	}
	printf("请输入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("增加成功!\n");
}
void PrintContact(const Contact* pc)
{
	//打印标题
	printf("****************************************************************************\n");
	printf("|姓名                |性别  |年龄  |电话号码    |地址                      |\n");
	if (pc->sz == 0)
	{
		printf("通讯录无信息!\n");
		printf("****************************************************************************\n");
		return;
	}
	for (int i = 0; i < pc->sz; i++)
	{
		printf("|%-20s|%-6s|%-6d|%-12s|%-26s|\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
	printf("****************************************************************************\n");
	printf("\n");
}
static int FindByName(Contact* pc,char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp( pc->data[i].name,name) == 0)
			return i;
	}
	return -1;
}
void DelContact(Contact* pc)
{
	char delname[NAME_MAX]={0};
	if (pc->sz == 0)
	{
		printf("通讯录为空,无须删除!\n");
		return;
	}
	printf("请输入要删除人的名字:");
	scanf("%s", delname);
	//查找要删除的人
	int pos =FindByName(pc, delname);
	if (pos == -1)
	{
		printf("查无此人的信息!\n");
		return;
	}
	for (int i = pos; i < pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
}
void SearchContact(Contact* pc)
{
	char findname[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无须删除!\n");
		return;
	}
	printf("请输入要查找的人的名字:");
	scanf("%s", findname);
	int pos = FindByName(pc, findname);
	if (pos == -1)
	{
		printf("查无此人的信息!\n");
		return;
	}
	printf("****************************************************************************\n");
	printf("|姓名                |性别  |年龄  |电话号码    |地址                      |\n");
	printf("|%-20s|%-6s|%-6d|%-12s|%-26s|\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
	printf("****************************************************************************\n");
	printf("\n");
}
void ModifyContact(Contact* pc)
{
	char findname[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无须删除!\n");
		return;
	}
	printf("请输入要查找的人的名字:");
	scanf("%s", findname);
	int pos = FindByName(pc, findname);
	if (pos == -1)
	{
		printf("查无此人的信息!\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("请输入住址:");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功!\n");
}
void SortContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录无信息,无法排序!\n");
		return;
	}
	for (int i = 0; i < pc->sz - 1; i++)
	{
		int flag = 1;
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (pc->data[j].age > pc->data[j + 1].age)
			{
				Peoinfo tmp[2];
				tmp[0] = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp[0];
				flag = 0;
			}
		}
		if (flag == 1)
			break;
	}
	printf("排序完成!\n");
}
void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc -> data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
}
void SaveContact(Contact* pc)
{
	FILE* pf = fopen("contact.txt", "w");
	if (pf == NULL)
	{
		perror("SaveContact");
		return;
	}
	for (int i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data + i, sizeof(Peoinfo), 1, pf);
	}
	fclose(pf);
	pf = NULL;
}

到此这篇关于C语言与C++动态通讯录超详细实现流程的文章就介绍到这了,更多相关C语言动态通讯录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言静态动态两版本通讯录实战源码

    目录 正片开始 静态版本 头文件( phonebook.h) 接口(test.c) 功能板块(phonebook.c) 1. 初始化: 2. 增添: 3.查找 4.删除 5.修改 6.排序 7.全览 静态版全部代码 test.c(接口) phonebook.h(头文件) phonebook.c(功能) 动态版 动态初始化: 扩容函数 动态版全部代码 test.c phonebook.h 正片开始 这里为了方便对照,我搬出整个程序的前后修改版本,并分别作为静态和动态版本,实际差距并不大,提供出来只

  • C语言模拟实现动态通讯录

    目录 1.模拟实现通讯录总体架构一览图 2.文件执行任务 3.分模块实现 测试模块 test.c 头文件 功能函数声明 contact.h 功能函数逐一实现 1.模拟实现通讯录总体架构一览图 2.文件执行任务 3.分模块实现 测试模块 test.c 1.为了更好地展示,制作一个菜单,在菜单中有 添加,删除,查找,修改,排序,清空,退出的选项. 2.因为起先要进入程序一趟,所以用do····while循环(输入选项来看具体操作,退出还是其他操作) #include "contact.h"

  • C语言编程动态内存开辟实现升级版通讯录教程示例

    目录 前言 一.存放联系人信息 二.通讯录初始化 三.增加联系人 四.销毁通讯录 后记 前言 所谓动态内存开辟的通讯录,就是我需要多少联系人,就给多少联系人,防止给定一个联系人上限,需要增加联系人无法扩容,而联系人没有上限那么多又会造成内存浪费. 本文继之前的静态通讯录作出改进,有兴趣的同学可以看看之前的文章:C语言实现静态通讯录 一.存放联系人信息 这里是用struct PeoInfodata结构体指针指向通讯录,而不再直接 struct PeoInfo data[Max] 用结构体数组定义通

  • C语言实现通讯录的方法(包括静态版本和动态版本)

    目录 1.静态通讯录的实现 实现的方法: 2.动态通讯录的实现 实现的方法: 3.总结 1.静态通讯录的实现 实现的方法: 我们采用的方法就是工程形势,实现将功能和定义以及测试分成三个文件,其中定义放在.h文件,实现和测试放在.c文件当中. (1)contact.h文件的基本实现: #pragma once//防止头文件重复定义 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #defin

  • C语言静态与动态通讯录的实现流程详解

    目录 静态通讯录 contact.h contact.c test.c 动态通讯录 contact.h contact.c qsort.c test.c 本次通讯录的代码已经放到我的Gitee仓库中,感兴趣的小伙伴可以去看看 Gitee 静态通讯录 在我们学习完C语言的结构体.指针以及动态内存管理之后,我们就可以实现一些有意思的小项目了,通过这些小项目可以加深我们对于相关知识的理解. 静态通讯录主要要求有 静态大小,可以记录10个人的信息(大小自己定) 记录的信息如下:名字.性别.年龄.电话.住

  • C语言动态与静态分别实现通讯录详细过程

    目录 前言: 一.静态通讯录的实现 1.环境的分工逻辑 2.待实现的功能 3.contact.h 4.contact.c 5.test.c 6.实现效果 二.通讯录动态的实现 1.contact.h 2.contact.c 3.test.c 前言: 通讯录相信每一个人都了解过 它的功能包括简单包括:增删查改 这一期就来实现一个C语言实现的通讯录 续上次所聊到的--动态内存的分配 那么我会从标题所给的两个方式来实现 一.静态通讯录的实现 1.环境的分工逻辑 由于过程有点长,便于理解,所以一共会用到

  • C语言与C++动态通讯录超详细实现流程

    目录 1.思路以及要实现的功能 2.详细步骤 2.1 打印菜单界面(建一个源文件test.c) 2.2 主函数 2.3 初始化函数与加载函数 2.4 增加联系人函数AddContact 2.5 删除联系人函数DelContact 2.6 查找联系人函数与打印函数 2.7 修改信息函数ModifyContact 2.8 排序函数SortContact 2.9 保存信息函数与销毁数据函数 3.源码 1.思路以及要实现的功能 通讯录就是为了存储许多联系人的不同方面的信息如名字.电话.地址.年龄.性别等

  • C语言与C++内存管理超详细分析

    目录 一.内存 1.1 内存四区 1.2 使用代码证实内存四区的底层结构 二.malloc 和 free 2.1 malloc 和 free 的使用 2.2 内存泄漏与安全使用实例与讲解 三.new 和 delete 3.1 new 和 delete 使用 3.2 delete 与 delete[] 的区别 一.内存 在计算机中,每个应用程序之间的内存是相互独立的,通常情况下应用程序 A 并不能访问应用程序 B,当然一些特殊技巧可以访问,但此文并不详细进行说明.例如在计算机中,一个视频播放程序与

  • R语言3.6.3安装超详细教程附安装包

    软件下载 R语言3.6.3 软件安装包下载: 链接: https://pan.baidu.com/s/1sufVf2lmoj9GYG_j5_fJKQ 提取码: tnqg R语言R-4.0.4 安装包下载地址: 链接: https://pan.baidu.com/s/1uzH49cJ0lnob54k19WWjOQ 提取码: kusa 软件介绍 R语言是一款非常专业的统计建模软件,R语言拥有数据存储和处理系统;数组运算工具(其向量.矩阵运算方面功能尤其强大),完整连贯的统计分析工具;优秀的统计制图等

  • C语言哈希表概念超详细讲解

    目录 1. 哈希概念 2. 哈希冲突 3. 哈希实现 3.1 闭散列(哈希表) 3.1.1 闭散列的细节 3.1.2 优化后的闭散列 3.2 扩散列(哈希桶) 3.2.1 扩散列的细节 4. 哈希表和哈希桶的比较 5. 结尾语 1. 哈希概念 哈希其实在学排序时已经用过了,就是计数排序.计数排序也是用的一种映射关系. 比如对此数组进行 计数排序 :1 1 9 9 9 3 3 8 8 我用的是绝对映射 ,所以开辟的数组空间 它的大小 必须 能映射到 最大的元素. 但是 对于哈希来讲,可以用决定映射

  • 最新版Git2.29.2超详细安装流程(图文详解)

    一.官网下载Git 选择需要的 Mac.Window.Linux/Unix 版本 Git官网入口:点我下载 二.安装流程 流程如下 安装结束 一起学习进步,加油吧少年~ (如果安装过程出现其他问题,大家可以留言一起解决) 到此这篇关于最新版Git2.29.2超详细安装流程(图文详解)的文章就介绍到这了,更多相关Git2.29.2安装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • pygame外星人入侵小游戏超详细开发流程

    游戏开始前的注意事项 1:游戏<外星人入侵>将包含很多文件,请在你的D盘中新建一个空文件夹,并将其命名为alien_invasion.请务必将所有文件存储在这个文件夹中,这样游戏才能正常运行. 2:在开始编码前请安装pygame库(在pycharm终端pip install pygame即可) 如果在安装时遇到以下情况,请更新pip版本(将以下内容复制粘贴到下面回车即可) <外星人入侵>游戏简介 在游戏<外星人入侵>中,玩家控制着一艘最初出现在屏幕底部中央的飞船.玩家可

  • C语言折半查找法的超详细讲解

    折半查找法仅适用于对已有顺序的数组.数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置指到了key那个数那里,所以mid应该处于循环里面,即mid=(high+low)/2.注意:low,mid,high都要与下标绑定,也就是说它们就是下标.且循环条件是:high>=low. 同时注意:⑴若原来数组是由小到大排列的则:       mid=(high+low)/2;             if(key<a[mid])//说明要找的值在左边

  • C语言字符串操作总结大全(超详细)

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1

随机推荐