【C语言】实现动态版通讯录

这篇具有很好参考价值的文章主要介绍了【C语言】实现动态版通讯录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】实现动态版通讯录

💌内容专栏:【C语言】进阶部分

💌本文概括: 结合自定义类型、动态内存管理知识,对静态版本的通讯录进行优化。

💌本文作者:花 碟

💌发布时间:2023.4.2

 

目录

前言:

一、静态版本代码实现:

二、动态通讯录 

三、代码整理 


前言:

前面我们学过了结构体、枚举等自定义类型的学习,写了一个静态版本的通讯录【传送门】点击进入静态版通讯录界面,我们知道,我们写的通讯录其实本质用的是一个结构体数组,数组的大小是固定的,这时我们就可以使用动态内存管理相关知识,对内存空间进行一个合理的分配,而不至于一下开辟一个较大的数组空间,用的时候却很少,造成了内存浪费的问题等。如果在内存不够时,也可以进行申请一定的空间来存储数据。

一、静态版本代码实现:

这里我就直接将完整代码放过来,具体分析,可以点击传送门链接,看实现思路哦~~

test.c文件代码(测试通讯录的相关功能)

#include "contact.h"
void Menu()
{
	printf("********************************\n");
	printf("******   0.exit 1.add     ******\n");
	printf("******  2.delete  3.modify******\n");
	printf("******  4.search 5.show    *****\n");
	printf("******      6.sort         *****\n");
	printf("********************************\n");

}

enum Option
{
	EXIT,
	ADD,
	DELETE,
	MODIFY,
	SEARCH,
	SHOW,
	SORT
};
int main()
{
	Contact con;//创建一个名为con的结构体变量
	InitContact(&con);
	int input = 0;
	do
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DELETE:
			DeleteContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
	} while (input);

}

contact.h文件(用来声明函数、结构体变量)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 20
#define MAX 20 

//创建个人信息
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 sz;
}Contact;

//初始化结构体
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//显示通讯录
void ShowContact(const Contact* pc);
//删除指定联系人
void DeleteContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);

contact.c文件(用来具体实现函数内部的功能)

#define  _CRT_SECURE_NO_WARNINGS 
#include"contact.h"

//静态版本
//初始化通讯录
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));

}
 
//添加联系人
void AddContact(Contact* pc)
{
	//CheckContact(pc);
	if (pc->data == pc->sz)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("添加成功\n");
	pc->sz++;
}
//显示通讯录
void ShowContact(const Contact* pc)
{
	printf("%-15s %-5s %-5s %-15s %-20s\n","姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s %-5d %-5s %-15s %-20s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
	}
}

//查找姓名
static int Findname(Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;//找到返回i
		}
	}
	return -1;//没找到返回-1
}
//删除指定联系人
void DeleteContact(Contact* pc)
{
	if (0 == pc->sz)
	{
		printf("通讯录为空,无法删除联系人\n");
			return;
	}
	printf("请输入姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s",name);
	//查找姓名
	int pos = Findname(pc,name);

	//删除
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	int i = 0;
	for (i = pos; i < pc->sz; i++)
	{
		pc->data[pos] = pc->data[pos + 1];
	}
	printf("删除成功\n");
	pc->sz--;
}
//查找指定联系人
void SearchContact(const Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入姓名:>");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("%-15s %-5s %-5s %-15s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-15s %-5d %-5s %-15s %-20s\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)
{
	printf("请输入要修改人的姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}
//通过名字来排序
int cmp_by_name(const void* e1,const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//排序通讯录
void SortContact(Contact* pc)
{
	qsort(pc->data, pc->sz,sizeof(PeoInfo),cmp_by_name);

	printf("排序成功\n");
}

二、动态通讯录 

我们将动态的版本的通讯录修改为:默认能够存放3个人的信息,不够的话,每次增加2个人的信息

在contact.h文件中,我们宏定义 DEFAULT_SZ 表示 默认3个人的信息

INC_SZ 表示 容量不够时,每次增加2个人的信息

#define DEFAULT_SZ 3
#define INC_SZ 2

在contact.h文件中。声明结构体部分:我们要让动态申请的内存空间可大可小,一定需要malloc函数来申请空间,所以我们应该将结构体数组修改为一个结构体指针data,指针类型是PeoInfo*,data指向了存放数据的空间,定义sz变量用来记录当前通讯录中的信息个数,capacity变量用来记录通讯录的容量。

//动态版本的通讯录
typedef struct Contact
{
	PeoInfo* data;//data指向了存放数据的空间
	int sz;//记录通讯录中的有效信息个数
	int capacity;//记录通讯录的容量
}Contact;

在contact.c文件中,初始化通讯录函数里面的部分就需要大改了,我们需要首先开辟默认3个元素大小的空间,元素类型是PeoInfo* ,即malloc的参数为DEFAULT_SZ*sizeof(PeoInfo),

我们拿一个ptr的结构体指针接收,如果ptr为NULL,就打印报错的信息(strerror需要引用<string.h>头文件,errno需要引用<errno.h>),然后返回空,不为NULL的话,就将ptr赋给data,元素的起始地址就为data,sz初始化为0,capacity容量初始化为默认值。

//静态版本
初始化通讯录
//void InitContact(Contact* pc)
//{
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//
//}

//动态版本
//初始化通讯录
void InitContact(Contact* pc)
{
	PeoInfo* ptr= (PeoInfo* )malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (ptr == NULL)
	{
		printf("通讯录初始化失败::%s", strerror(errno));
		return;
	}
	else
	{
		pc->data = ptr;
		pc->sz = 0;
		pc->capacity = DEFAULT_SZ;
	}	
}
在contact.c文件中,添加联系人函数里面我们也需要进行大幅度改动。pc->data这里就不是静态版本的数组了,我们直接将这个if语句给屏蔽掉,直接写一个CheckContact函数用来判断通讯录是否满了?是否需要扩容?
//添加联系人
void AddContact(Contact* pc)
{
	CheckContact(pc);
	/*if (pc->data == pc->sz)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}*/
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("添加成功\n");
	pc->sz++;
}

CheckContact函数

如果pc->sz 等于 pc->capacity ,即通讯录当前有效个人信息等于目前的容量时,说明通讯录已经满了,就需要扩容,此时就可以用realloc函数来扩容,pc->data表示通讯录的起始地址,新的大小为新的元素个数*每个元素的大小。返回值暂存在ptr指针之中,如果ptr为NULL,则打印报错的信息,不为NULL,则将ptr赋值给pc->data,容量+2,为了显示扩容效果,我们顺便打印当前容量值。

//检测通讯录是否满了
void CheckContact(Contact* pc)
{
	//如果通讯录满了 就增容
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr= (PeoInfo*)realloc(pc->data,(pc->capacity+ INC_SZ)*sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("CheckContact::%s", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功,当前容量为:%d\n", pc->capacity);
		}
	}
	//没满直接跳过以上语句
}

最后,我们退出通讯录的时候,也可以将自己申请的内存空间给释放掉。我们在contact.h文件中声明一个DestroyContact函数表示销毁通讯录。

在contact.c文件下面接着编写代码:

//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
    pc->sz = 0;
    pc->capacity = 0;
	printf("释放成功...\n");
}

 代码测试:

为了测试方便,作者直接将信息用数字测试,当我们输入三个有效信息之后,此时有效空间等于当前的通讯录容量了,当我们再次选择1,继续添加联系人,就“显示增容成功,当前容量为5”。

【C语言】实现动态版通讯录

三、代码整理 

将代码整理在下面,需要的自取呐~

test.c文件

#include "contact.h"
void Menu()
{
	printf("********************************\n");
	printf("******   0.exit 1.add     ******\n");
	printf("******  2.delete  3.modify******\n");
	printf("******  4.search 5.show    *****\n");
	printf("******      6.sort         *****\n");
	printf("********************************\n");

}

enum Option
{
	EXIT,
	ADD,
	DELETE,
	MODIFY,
	SEARCH,
	SHOW,
	SORT
};
int main()
{
	Contact con;//创建一个名为con的结构体变量
	InitContact(&con);
	int input = 0;
	do
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DELETE:
			DeleteContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			DestroyContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
	} while (input);
}

contact.h文件

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 20
//#define MAX 20 
#define DEFAULT_SZ 3
#define INC_SZ 2
//创建个人信息
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 sz;
//}Contact;

//动态版本的通讯录
typedef struct Contact
{
	PeoInfo* data;//data指向了存放数据的空间
	int sz;//记录通讯录中的有效信息个数
	int capacity;//记录通讯录的容量
}Contact;

//初始化结构体
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//显示通讯录
void ShowContact(const Contact* pc);
//删除指定联系人
void DeleteContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
//销毁通讯录
void DestroyContact(Contact* pc);

contact.c文件

#include"contact.h"
//静态版本
初始化通讯录
//void InitContact(Contact* pc)
//{
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//
//}

//动态版本
//初始化通讯录
void InitContact(Contact* pc)
{
	PeoInfo* ptr= (PeoInfo* )malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (ptr == NULL)
	{
		printf("通讯录初始化失败::%s", strerror(errno));
		return;
	}
	else
	{
		pc->data = ptr;
		pc->sz = 0;
		pc->capacity = DEFAULT_SZ;
	}	
}

//检测通讯录是否满了
void CheckContact(Contact* pc)
{
	//如果通讯录满了 就增容
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr= (PeoInfo*)realloc(pc->data,(pc->capacity+ INC_SZ)*sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("CheckContact::%s", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功,当前容量为:%d\n", pc->capacity);
		}
	}
	//没满直接跳过以上语句
}
//添加联系人
void AddContact(Contact* pc)
{
	CheckContact(pc);
	/*if (pc->data == pc->sz)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}*/
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("添加成功\n");
	pc->sz++;
}
//显示通讯录
void ShowContact(const Contact* pc)
{
	printf("%-15s %-5s %-5s %-15s %-20s\n","姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s %-5d %-5s %-15s %-20s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
	}
}

//查找姓名=
static int Findname(Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;//找到返回i
		}
	}
	return -1;//没找到返回-1
}
//删除指定联系人
void DeleteContact(Contact* pc)
{
	if (0 == pc->sz)
	{
		printf("通讯录为空,无法删除联系人\n");
			return;
	}
	printf("请输入姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s",name);
	//查找姓名
	int pos = Findname(pc,name);

	//删除
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	int i = 0;
	for (i = pos; i < pc->sz; i++)
	{
		pc->data[pos] = pc->data[pos + 1];
	}
	printf("删除成功\n");
	pc->sz--;
}
//查找指定联系人
void SearchContact(const Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入姓名:>");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("%-15s %-5s %-5s %-15s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-15s %-5d %-5s %-15s %-20s\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)
{
	printf("请输入要修改人的姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}
//通过名字来排序
int cmp_by_name(const void* e1,const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//排序通讯录
void SortContact(Contact* pc)
{
	qsort(pc->data, pc->sz,sizeof(PeoInfo),cmp_by_name);

	printf("排序成功\n");
}
//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	printf("释放成功...\n");
}

好了,动态版本的通讯录就到这里,感谢各位读者的支持~,如编写有误,还请联系我 ✨✨文章来源地址https://www.toymoban.com/news/detail-433029.html

到了这里,关于【C语言】实现动态版通讯录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言实现通讯录--动态版

    实现一个通讯录,联系人的数量可多可少 1.在静态版本的基础上改用动态的方法: (1)默认能够存放三个人的信息 (2)不够的话,每次增加两个人的信息 2.其他功能不变 建立三个文件: test.c 用于测试通讯录的相关功能 contsct.c 通讯录的实现模块(用函数实现功能) conta

    2024年02月15日
    浏览(53)
  • C语言动态内存练习:【通讯录(动态内存版本)实现】

    前面我们写了一个静态数组版本的通讯录,再结合刚学习的动态内存管理的知识,我们现在来实现一个动态内存版本的通讯录。 动态内存版本的通讯录,主要还是为了解决静态数组版本的通讯录空间太大导致的内存浪费和空间太小不够存放的问题。 扩容策略: 为通讯录设置

    2023年04月13日
    浏览(72)
  • C语言之通讯录的实现(静态版,动态版,文件版)

    个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 目录 静态通讯录的实现逻辑  test.c:通讯录的逻辑实现 Contact.h:函数的声明与头文件的包含 Contact.c:函数的实现  通讯录源码:  test.c: Contact.c: Contect.h: 动态版通讯录  test.c: Co

    2024年04月13日
    浏览(43)
  • 【进阶C语言】动态版通讯录的实现(详细讲解+全部码源)

    前言 📕作者简介: 热爱跑步的恒川 ,致力于 C/C++、Java、Python 等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于 C语言进阶 系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等,持续更

    2024年02月01日
    浏览(47)
  • 动态内存管理函数介绍及C语言实现通讯录管理系统2.0版(动态增长版本)

    之前向大家介绍了C语言实现通讯录管理系统1.0版本,但该版本有明显的不足之处,比如:一开始就开辟了1000个date数组,如果联系人很少,那么就会造成严重的内存浪费,或者联系人超过了1000人,那么原数组就放不下了,所以今天我们考虑使用动态内存管理的办法来实现一个

    2023年04月08日
    浏览(50)
  • 【C语言】动态通讯录 -- 详解

    前面详细介绍了静态版通讯录【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客,但是静态版通讯录的空间是无法被改变的,而且空间利用率也不高。为了解决静态通讯录这一缺点,这时就要有一个能够随着存入联系人数量的增加而增大空间的通讯录。接下来我们将

    2024年02月12日
    浏览(43)
  • 【C语言】动态通讯录(超详细)

    通讯录是一个可以很好锻炼我们对结构体的使用,加深对结构体的理解,在为以后学习数据结构打下结实的基础 这里我们想设计一个有 添加联系人,删除联系人,查找联系人,修改联系人,展示联系人,排序 这几种功能的通讯录 注意:我们按照三个区域划分 上图所示进行

    2024年02月08日
    浏览(35)
  • C语言实践——通讯录(2)(动态版)

    首先感谢上一篇博客的大佬们的点赞,非常感谢!!! 目录 前言  一、需要添加的功能 1. 初始化——动态内存开辟 2.添加联系人——通讯录扩容 3.退出通讯录——通讯录销毁 二、具体操作 1.铺垫 2.修改初始化函数 3.修改添加函数  4.退出通讯录,新增销毁函数 上一篇文章我

    2023年04月08日
    浏览(35)
  • 【C语言】通讯录2.0 (动态增长版)

    通讯录是一种记录联系人信息的工具,包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同,可以直接看第四章改造内容。 此通讯录是 基于通讯录1.0(静态版)的基础上进行改进 ,请先看系列文章第一篇,再看本篇博客。 ****** 有需要源代码,见

    2024年02月14日
    浏览(42)
  • 【C语言】——通讯录(静态-动态增长-文件储存)

      目录 前言: 一:整体框架 关于通讯录结构体的创建  二:通讯录的功能实现(静态) 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人  2.5 查找联系人 2.6修改联系人  2.7排序联系人 三:通讯录优化——动态内存  3.1通讯录的创建 3.2初始化通讯录  3.3增加联系

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包