我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

1.静态通讯录的实现

实现的方法:

我们采用的方法就是工程形势,实现将功能和定义以及测试分成三个文件,其中定义放在.h文件,实现和测试放在.c文件当中。

(1)contact.h文件的基本实现:


#pragma once//防止头文件重复定义

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000  //静态通讯录,最大为1000

#include<stdio.h>
#include<string.h>

struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
};

//静态的版本
struct Contact
{
	struct PeoInfo data[MAX];//容量为1000的通讯录
	int sz; //已经使用了多少个通讯录
};

//初始化通讯录
void InitContact(struct Contact* pc);

//通讯录的增加
void PushContact(struct Contact* pc);


//通讯录的删除:
void PopContact(struct Contact* pc);

//通讯录的打印
void ShowContact(const struct Contact* pc);

//通过名字来查找,找到返回下标,找不到返回-1。
int FindContactByName(const struct Contact* pc, const char* name);

//通讯的查找并打印
void SearchContact(const struct Contact* pc);

//修改联系人的信息
void ModContact(struct Contact* pc);

//以名字排序
void SortByNameContact(struct Contact* pc);

//清空所有联系人
void DestroyContact(struct Contact* pc);

(2)contact.c文件的基本实现


#include"contact.h"

//通讯录的初始化
void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(struct PeoInfo) * MAX);
}

//通讯录增加
void PushContact(struct Contact* pc)
{
	if (pc->sz >= MAX)
	{
		printf("This contact is full!\n");
	}
	printf("please input name:>");
	scanf("%s", &pc->data[pc->sz].name);
	printf("please input age:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("please input sex:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("please input tele:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("please input addr:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("Add successful\n");
	pc->sz++;
}

//通过名字来查找,找到返回下标,找不到返回-1。
int FindContactByName(const struct Contact* pc, const char* ThisName)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(ThisName, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//通讯录的打印
void ShowContact(const struct Contact* pc)
{
	printf("%15s\t%5s\t%8s\t%15s\t%20s\n", "name", "age","sex","tele","addr");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%15s\t%5d\t%8s\t%15s\t%20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

//通讯录的删除:
void PopContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("Address book is empty. Can Not be deleted\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("Please enter the name of the person you want to delete:>");
	scanf("%s", name);
	//1.查找
	int pos = FindContactByName(pc, name);
	if ( pos == -1)
	{
		printf("There's no one by that name!\n");
	}
	else
	{
		//2.删除
		int j = 0;
		for (j = pos; j < pc->sz - 1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		printf("Delection successful\n");
	}
	pc->sz--;
	
}

//通讯的查找
void SearchContact(const struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("please input name of you want to search:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("No this one!\n");
	}
	else
	{
		printf("%15s\t%5s\t%8s\t%15s\t%20s\n", "name", "age", "sex", "tele", "addr");
		printf("%15s\t%5d\t%8s\t%15s\t%20s\n", 
		pc->data[pos].name, 
		pc->data[pos].age, 
		pc->data[pos].sex, 
		pc->data[pos].tele, 
		pc->data[pos].addr);
	}
}

//修改联系人的信息
void ModContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf(" Please enter the name of the person you want to modify : > ");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("No this one\n");
	}
	else
	{
		printf("please input new name:>");
		scanf("%s", &pc->data[pos].name);
		printf("please input new age:>");
		scanf("%d", &pc->data[pos].age);
		printf("please input new sex:>");
		scanf("%s", pc->data[pos].sex);
		printf("please input new tele:>");
		scanf("%s", pc->data[pos].tele);
		printf("please input new addr:>");
		scanf("%s", pc->data[pos].addr);
		printf("Modify successful\n");
	}
}
//以名字排序
void SortByNameContact(struct Contact* pc)
{
	if (pc->sz == 0 || pc->sz == 1)
	{
		printf("Too few contacts to sort\n");
	}
	int i, j;
	for (i = 0; i < pc->sz ; i++)
	{
		int flag = 0;
		for (j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				struct PeoInfo tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
				flag = 1;
			}
		}
		if (flag == 0)
		{
			break;
		}
	}
	printf("Sort successful\n");
}


//清空所有联系人
void DestroyContact(struct Contact* pc)
{
	pc->sz = 0;
	printf("Destroy successful\n");
}

(3)test.c文件的实现


#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("************************************\n");
	printf("******   1.add      2.del    *******\n");
	printf("******   3.search   4.modify *******\n");
	printf("******   5.show     6.sort   *******\n");
	printf("******   7.destroy  0.exit   *******\n");
	printf("************************************\n");
}

enum Option//使用枚举,增加代码的可读性
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	DESTROY,
};

int main()
{
	int input;
	struct Contact con;
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("please select:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			printf("exit succseeful!\n");
			break;
		case ADD:
			PushContact(&con);
			break;
		case DEL:
			PopContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortByNameContact(&con);
			break;
		case DESTROY:
			DestroyContact(&con);
			break;
		default:
			printf("Select error, please select again!\n");
		}
	} while (input);
	return 0;
}

2.动态通讯录的实现

实现的方法:

和静态实现细节都差不多,只是静态使用的数组,所以固定了通讯录的大小,不能超出通讯录大小的限制,且没有使用完还会造成空间的浪费。所以使用动态内存分配来实现动态的通讯录。会节省空间并且是通讯录的大小变得灵活。

(1)contact.h文件的基本实现:


#pragma once//防止头文件重复定义

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define DEFINE_SZ  3

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
};

//动态的版本
struct Contact
{
	struct PeoInfo* data;
	int sz;//通讯录已经使用元素的个数
	int capacity; //当前的最大容量	
};

//初始化通讯录
void InitContact(struct Contact* pc);

//通讯录的增加
void PushContact(struct Contact* pc);

//通讯录的删除:
void PopContact(struct Contact* pc);

//通讯录的打印
void ShowContact(const struct Contact* pc);

//通过名字来查找,找到返回下标,找不到返回-1。
int FindContactByName(const struct Contact* pc, const char* name);

//通讯的查找并打印
void SearchContact(const struct Contact* pc);

//修改联系人的信息
void ModContact(struct Contact* pc);

//以名字排序
void SortByNameContact(struct Contact* pc);

//清空所有联系人
void DestroyContact(struct Contact* pc);

(2)contact.c文件的基本实现


#include"contact.h"

//通讯录的初始化


void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	pc->data = (struct PeoInfo*)malloc(sizeof(struct PeoInfo) * DEFINE_SZ);
	if (pc->data == NULL)
	{
		printf("malloc fail\n");
		return;
	}
	pc->capacity = DEFINE_SZ;
}

//通讯录增加
void PushContact(struct Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		//增容:
		struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, sizeof(struct PeoInfo) * (pc->capacity + 2));
		if (ptr == NULL)
		{
			printf("realloc fail\n");
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += 2;
			printf("Compatibilization successful\n");
		}
		
	}
	//录入新增成员信息:
	printf("please input name:>");
	scanf("%s", &pc->data[pc->sz].name);
	printf("please input age:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("please input sex:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("please input tele:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("please input addr:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("Add successful\n");
	pc->sz++;	
}

//通过名字来查找,找到返回下标,找不到返回-1。
int FindContactByName(const struct Contact* pc, const char* ThisName)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(ThisName, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//通讯录的打印
void ShowContact(const struct Contact* pc)
{
	printf("%15s\t%5s\t%8s\t%15s\t%20s\n", "name", "age", "sex", "tele", "addr");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%15s\t%5d\t%8s\t%15s\t%20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

//通讯录的删除:
void PopContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("Address book is empty. Can Not be deleted\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("Please enter the name of the person you want to delete:>");
	scanf("%s", name);
	//1.查找
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("There's no one by that name!\n");
	}
	else
	{
		//2.删除
		int j = 0;
		for (j = pos; j < pc->sz - 1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		printf("Delection successful\n");
	}
	pc->sz--;

}

//通讯的查找
void SearchContact(const struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("please input name of you want to search:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("No this one!\n");
	}
	else
	{
		printf("%15s\t%5s\t%8s\t%15s\t%20s\n", "name", "age", "sex", "tele", "addr");
		printf("%15s\t%5d\t%8s\t%15s\t%20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

//修改联系人的信息
void ModContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf(" Please enter the name of the person you want to modify : > ");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("No this one\n");
	}
	else
	{
		printf("please input new name:>");
		scanf("%s", &pc->data[pos].name);
		printf("please input new age:>");
		scanf("%d", &pc->data[pos].age);
		printf("please input new sex:>");
		scanf("%s", pc->data[pos].sex);
		printf("please input new tele:>");
		scanf("%s", pc->data[pos].tele);
		printf("please input new addr:>");
		scanf("%s", pc->data[pos].addr);
		printf("Modify successful\n");
	}
}

//以名字排序
void SortByNameContact(struct Contact* pc)
{
	if (pc->sz == 0 || pc->sz == 1)
	{
		printf("Too few contacts to sort\n");
	}
	int i, j;
	for (i = 0; i < pc->sz; i++)
	{
		int flag = 0;
		for (j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				struct PeoInfo tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
				flag = 1;
			}
		}
		if (flag == 0)
		{
			break;
		}
	}
	printf("Sort successful\n");
}

//清空所有联系人
void DestroyContact(struct Contact* pc)
{
	pc->sz = 0;
	pc->capacity = 0;
	free(pc->data);
	pc->data = NULL;
	printf("Destroy successful\n");
}

(3)test.c文件的实现


#include"contact.h"

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

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	DESTROY,
};

int main()
{
	int input;
	struct Contact con;
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("please select:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			DestroyContact(&con);
			printf("exit succseeful!\n");
			break;
		case ADD:
			PushContact(&con);
			break;
		case DEL:
			PopContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortByNameContact(&con);
			break;
		case DESTROY:
			DestroyContact(&con);
			break;
		default:
			printf("Select error, please select again!\n");
		}
	} while (input);
	return 0;
}

3.总结

其实通讯录的实现就是数据结构的一种体现,我们需要学的东西还有很多,请大家一起跟我努力吧!!
再就是有问题请大家及时指正!!!谢谢大家。

到此这篇关于C语言实现通讯录的方法(包括静态版本和动态版本)的文章就介绍到这了,更多相关C语言实现通讯录内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言实现简易通讯录(静态版本)的代码分享

这篇文章主要为大家详细介绍了如何录音C语言实现一个简易的通讯录(静态版本),文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

C语言静态版通讯录的设计与实现

静态版通讯录是一种简单的通讯录实现方式,通过定义固定的数组大小来存储联系人信息。该方法不支持动态增删联系人,但具有实现简单、易于理解的优点。在程序设计中,需注意数组边界溢出等问题
2023-05-16

C语言动态与静态分别实现通讯录的方法

这篇文章主要讲解了“C语言动态与静态分别实现通讯录的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言动态与静态分别实现通讯录的方法”吧!一.静态通讯录的实现1.环境的分工逻辑由于过程
2023-06-29

C语言实现静态版通讯录的代码分享

这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的静态版通讯录,主要运用了结构体,一维数组,函数,分支与循环语句等等知识,需要的可以参考一下
2023-01-12

C语言静态与动态通讯录的实现方法是什么

这篇文章主要讲解了“C语言静态与动态通讯录的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言静态与动态通讯录的实现方法是什么”吧!静态通讯录在我们学习完C语言的结构体、指针
2023-06-25

C语言实现动态版通讯录的代码分享

这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的动态版通讯录,主要运用了结构体,一维数组,函数,分支与循环语句等等知识,需要的可以参考一下
2023-01-12

C语言实现一个文件版动态通讯录流程详解

这篇文章主要介绍了C语言实现一个文件版动态通讯录流程,希望大家能从这篇文章中收获到许多,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录