通讯录(C语言版)

🐌博主主页:🐌​倔强的大蜗牛🐌​

📚专栏分类:C语言
❤️感谢大家点赞👍收藏⭐评论✍️

目录

 一、通讯录的概念

二、通讯录制作(静态版)

(1)通讯录准备工作阶段

 1.菜单制作界面

2. 类型声明

3.通讯录的建立

4.初始化通讯录

5.利用枚举来定义

(2)功能的实现

1.增加联系人

2.显示联系人信息 

 3.删除指定联系人

4.查找指定联系人

 5.修改指定联系人

6.释放通讯录

三、通讯录制作(动态版)

1.结构体优化

2.初始化

3.增加联系人+增容(优化)

四、总代码

1.Contact.h

2.Contact.c

3.test.c


 一、通讯录的概念

通讯录一般指在日常生活中用笔记录,也在手机,电脑,电子字典等电子产品中拥有这个功能。通讯录作为通讯录地址的书本,当今的通讯录可以涵盖多项内容。

二、通讯录制作(静态版)

(1)通讯录准备工作阶段

 1.菜单制作界面

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

2. 类型声明

//类型的声明
//设计保存人的信息的这个结构体
typedef struct PeoInfo   
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];

}PeoInfo;

3.通讯录的建立

typedef struct Contact
{
	PeoInfo data[MAX];//data要增加sz就加,
	int sz;//data要减少sz减少(两个必定是联动的)
}Contact;

4.初始化通讯录

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

初始化实现

静态版本
void InitContact(Contact* pc)
{
	assert(pc);
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz=0;
}

5.利用枚举来定义

enum OPTION
{
EXIT,//默认0开始
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};

枚举用于:对于用户使用会更加的方便简洁

do 
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SerchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			//SortContact(&con);
			break;
		case EXIT:
			//释放通讯录
			DestroyContact(&con);
			printf("退出通讯录");
			break;
		default:
			printf("选择错误,重新选择");
			break;
		}
	} while (input);
}

(2)功能的实现

1.增加联系人

函数声明:

//增加联系人
void AddContact(Contact* pc);

增加联系人的实现:

静态版本
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX) 
	{
		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);

	pc->sz++;
	printf("成功输入联系人\n");
	
}

 成果展示:

2.显示联系人信息 

函数声明:

//显示所有联系人的信息
void ShowContact(const Contact* pc);

显示所以联系人的信息实现:

void ShowContact(const Contact* pc)
{
	int i = 0;
	//打印列标题
	printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0;i < pc->sz;i++)
	{
		printf("%-10s\t%-4d\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);
	}
}

成果展示:

 3.删除指定联系人

函数声明:

//删除指定联系人
void DelContact( Contact* pc);

删除指定联系人实现:

void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	assert(pc);
	//删除
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	找到要删除的人
	//int i = 0;
	//int del = 0;
	//int flag = 0;
	//for (i = 0;i < pc->sz;i++)
	//{
	//	//pc->data[i].name==name这样不能比较是错误的
	//	if (strcmp(pc->data[i].name, name) == 0)
	//	{
	//		del = i;
	//		flag = 1;
	//		break;
	//	}
	//}
	//if (flag == 0)
	//{
	//	printf("要删除的人不存在\n");
	//	return;
	//}
	// 
 int del=FindByName(pc, name);
 if (del == -1)
 {
	 printf("要删除的人不存在\n");
	 return;
 }
 int i = 0;

	//删除坐标为del的联系人
	for (i = del;i < pc->sz - 1;i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人\n");

}

成果展示:

4.查找指定联系人

函数声明:

//查找指定联系人
void SerchContact(const Contact* pc);

 查找指定联系人实现:

void SerchContact(const Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };

	printf("请输入要查找的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//pos=position
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
	}
	else {
		printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		//打印数据

		printf("%-10s\t%-4d\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);

	}
}

 5.修改指定联系人

函数声明:

//修改指定联系人
void ModifyContact(Contact* pc);

函数实现:

void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//pos=position
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
	}
	else 
	{
		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");
	}
}

6.释放通讯录

函数声明:

void DestroyContact(Contact * pc);

函数实现:

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

三、通讯录制作(动态版)

1.结构体优化

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

2.初始化

//动态版本
void InitContact(Contact* pc)
{
	assert(pc);
	pc->data = (PeoInfo*)malloc(DEFAUL_SZ *sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact");
		return;
	}
		pc->sz = 0;
		pc->capacity = DEFAUL_SZ;
}

3.增加联系人+增容(优化)

//动态版本
int CheckCapacity(Contact* pc) 
{
	if (pc->sz == pc->capacity)
		{
		PeoInfo* ptr=(PeoInfo*)realloc(pc->data,( pc->capacity + INC_SZ)* sizeof(PeoInfo));
		if (ptr == NULL)
		{
			perror("CheckCapacity");
			return 0;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
			return 1;
			
		}
		}
	return 1;
}
void AddContact(Contact* pc)
{
	assert(pc);
	
	if (0==CheckCapacity(pc))
	{
		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);

	pc->sz++;
	printf("成功输入联系人\n");

}


四、总代码

1.Contact.h

#pragma once
#include<string.h>
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
#define DEFAUL_SZ 3
#define INC_SZ 2
enum OPTION
{
EXIT,//默认0开始
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};


//类型的声明
//设计保存人的信息的这个结构体
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];//data要增加sz就加,
//	int sz;//data要减少sz减少(两个必定是联动的)
//}Contact;
//动态版本
typedef struct Contact
{
	PeoInfo *data;//指向了存放数据的空间
	int sz;//记录当前放的有效元素个数
	int capacity;//通讯录当前的最大容量
}Contact;

//函数声明

//初始化通讯录
void InitContact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);

//显示所以联系人的信息
void ShowContact(const Contact* pc);
//删除指定联系人
void DelContact( Contact* pc);
//查找指定联系人
void SerchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//
void DestroyContact(Contact * pc);

2.Contact.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//静态版本
//void InitContact(Contact* pc)
//{
//	assert(pc);
//	memset(pc->data, 0, sizeof(pc->data));
//	pc->sz=0;
//}
//动态版本
void InitContact(Contact* pc)
{
	assert(pc);
	pc->data = (PeoInfo*)malloc(DEFAUL_SZ *sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact");
		return;
	}
		pc->sz = 0;
		pc->capacity = DEFAUL_SZ;
}
//静态版本
//void AddContact(Contact* pc)
//{
//	assert(pc);
//	if (pc->sz == MAX) 
//	{
//		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);
//
//	pc->sz++;
//	printf("成功输入联系人\n");
//	
//}


//动态版本
int CheckCapacity(Contact* pc) 
{
	if (pc->sz == pc->capacity)
		{
		PeoInfo* ptr=(PeoInfo*)realloc(pc->data,( pc->capacity + INC_SZ)* sizeof(PeoInfo));
		if (ptr == NULL)
		{
			perror("CheckCapacity");
			return 0;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
			return 1;
			
		}
		}
	return 1;
}
void AddContact(Contact* pc)
{
	assert(pc);
	
	if (0==CheckCapacity(pc))
	{
		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);

	pc->sz++;
	printf("成功输入联系人\n");

}

void ShowContact(const Contact* pc)
{
	int i = 0;
	//打印列标题
	printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0;i < pc->sz;i++)
	{
		printf("%-10s\t%-4d\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);
	}
}

int FindByName(const Contact*pc,char name[])
{
	int i = 0;
	for (i = 0;i < pc->sz;i++)
	{
		//pc->data[i].name==name这样不能比较是错误的
		if (strcmp(pc->data[i].name, name) == 0)
		{
			
			return 1;//找到了
		}
	}
	return -1;//找不到
}

void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	assert(pc);
	//删除
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	找到要删除的人
	//int i = 0;
	//int del = 0;
	//int flag = 0;
	//for (i = 0;i < pc->sz;i++)
	//{
	//	//pc->data[i].name==name这样不能比较是错误的
	//	if (strcmp(pc->data[i].name, name) == 0)
	//	{
	//		del = i;
	//		flag = 1;
	//		break;
	//	}
	//}
	//if (flag == 0)
	//{
	//	printf("要删除的人不存在\n");
	//	return;
	//}
	// 
 int del=FindByName(pc, name);
 if (del == -1)
 {
	 printf("要删除的人不存在\n");
	 return;
 }
 int i = 0;

	//删除坐标为del的联系人
	for (i = del;i < pc->sz - 1;i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人\n");

}
void SerchContact(const Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };

	printf("请输入要查找的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//pos=position
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
	}
	else {
		printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		//打印数据

		printf("%-10s\t%-4d\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)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//pos=position
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
	}
	else 
	{
		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");
	}
}

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

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("******0.exit       ****************\n");
	printf("***********************************\n");
}

void test()
{
	int input = 0;
	//首先要有通讯录
	Contact con;
	//封装一个函数,把通讯录初始化一下
	InitContact(&con);
	do 
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SerchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			//SortContact(&con);
			break;
		case EXIT:
			//释放通讯录
			DestroyContact(&con);
			printf("退出通讯录");
			break;
		default:
			printf("选择错误,重新选择");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;

}

❤️结语: 

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
很高兴为您解答关于通讯录C语言程序设计代码的问题。根据您提供的引用内容,以下是一个通讯录C语言程序设计的简单示例: 首先,创建三个文件:text.c(实现测试的逻辑),contact.c(函数实现),contact.h(函数声明)。 在contact.h文件中,我们可以声明一些函数原型和结构体,例如: ```c #ifndef CONTACT_H #define CONTACT_H #define MAX_NAME_LENGTH 50 #define MAX_PHONE_LENGTH 20 typedef struct { char name[MAX_NAME_LENGTH]; char phone[MAX_PHONE_LENGTH]; } Contact; void addContact(Contact* contacts, int* count); void displayContacts(Contact* contacts, int count); void searchContact(Contact* contacts, int count, char* name); void deleteContact(Contact* contacts, int* count, char* name); #endif ``` 在contact.c文件中,我们可以实现这些函数,例如: ```c #include <stdio.h> #include <string.h> #include "contact.h" void addContact(Contact* contacts, int* count) { if (*count >= MAX_CONTACTS) { printf("通讯录已满,无法添加新联系人。\n"); return; } Contact newContact; printf("请输入联系人姓名:"); scanf("%s", newContact.name); printf("请输入联系人电话:"); scanf("%s", newContact.phone); contacts[*count] = newContact; (*count)++; printf("联系人添加成功。\n"); } void displayContacts(Contact* contacts, int count) { if (count == 0) { printf("通讯录为空。\n"); return; } printf("通讯录中的联系人:\n"); for (int i = 0; i < count; i++) { printf("姓名:%s,电话:%s\n", contacts[i].name, contacts[i].phone); } } void searchContact(Contact* contacts, int count, char* name) { for (int i = 0; i < count; i++) { if (strcmp(contacts[i].name, name) == 0) { printf("联系人找到:姓名:%s,电话:%s\n", contacts[i].name, contacts[i].phone); return; } } printf("未找到该联系人。\n"); } void deleteContact(Contact* contacts, int* count, char* name) { int found = 0; for (int i = 0; i < *count; i++) { if (strcmp(contacts[i].name, name) == 0) { found = 1; for (int j = i; j < *count - 1; j++) { contacts[j] = contacts[j + 1]; } (*count)--; printf("联系人删除成功。\n"); break; } } if (!found) { printf("未找到该联系人。\n"); } } ``` 在text.c文件中,我们可以编写测试逻辑,例如: ```c #include <stdio.h> #include "contact.h" int main() { Contact contacts[MAX_CONTACTS]; int count = 0; int choice; char name[MAX_NAME_LENGTH]; do { printf("\n通讯录操作菜单:\n"); printf("1. 添加联系人\n"); printf("2. 显示所有联系人\n"); printf("3. 查找联系人\n"); printf("4. 删除联系人\n"); printf("0. 退出\n"); printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: addContact(contacts, &count); break; case 2: displayContacts(contacts, count); break; case 3: printf("请输入要查找的联系人姓名:"); scanf("%s", name); searchContact(contacts, count, name); break; case 4: printf("请输入要删除的联系人姓名:"); scanf("%s", name); deleteContact(contacts, &count, name); break; case 0: printf("程序已退出。\n"); break; default: printf("无效的选择。\n"); break; } } while (choice != 0); return 0; } ``` 这是一个简单的通讯录C语言程序设计示例,其中包含了添加联系人、显示所有联系人、查找联系人和删除联系人等功能。您可以根据自己的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倔强的大蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值