动态+静态 C语言实现通讯录

目录

一.通讯录简介

二.分模块实现

1.添加联系人信息

(1)静态版本

(2)动态版本

2.删除指定联系人信息

3.查找指定联系人信息

4.修改指定联系人信息

5.显示所有联系人信息

6.清空所有联系人

(1)静态版本

(2)动态版本

7.以名字排序所有联系人

8.销毁通讯录(释放)

三.菜单界面

四.头文件声明


一.通讯录简介

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

二.分模块实现

1.添加联系人信息

(1)静态版本

//添加联系人
void Addcontact(Contact* pc)
{
	assert(pc);
	if (pc->sz == Max)
	{
		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)动态版本

void Addcontact(Contact* pc)
{
	// 动态版本
	assert(pc);
	if (pc->sz == pc->Capacity)
	{
		PeoInfo* tmp = realloc(pc->data, (pc->Capacity + 2) * sizeof(PeoInfo));
		if (tmp != NULL)
		{
			pc->data = tmp;
		}
		else
		{
			perror("realloc:pc->data");
			return;
		}
		pc->Capacity += 2;
		printf("增容成功n");
	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.删除指定联系人信息

//删除联系人
void Deletecontact(Contact* pc)
{
	assert(pc);
	char name[Name_Max];
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法删除n");
	}
	printf("请输入要删除联系人的名字:>");
	scanf("%s", name);
	int pos = FindByname(pc, name);
	if (pos == -1)
	{
		printf("未找到指定联系人n");
		return;
	}
	else
	{
		int i = pos;
		for (i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功n");
	}
}

3.查找指定联系人信息

//查找联系人
void Searchcontact(Contact* pc)
{
	assert(pc);
	char name[Name_Max];
	printf("请输入要查找的联系人名字:>");
	scanf("%s", name);
	int pos = FindByname(pc, name);
	if (pos == -1)
	{
		printf("未找到指定联系人n");
		return;
	}
	printf("%-20s %-5s %-5s %-12s  %-30sn", "姓名", "性别", "年龄", "号码", "住址");
	printf("%-20s %-5s %-5d %-12s  %-30sn", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
}

4.修改指定联系人信息

//修改菜单
void menu1()
{
	printf("***********************n");
	printf("****1.姓名  2.性别 ****n");
	printf("****3.年龄  4.号码 ****n");
	printf("****5.住址  0.返回 ****n");
	printf("***********************n");
}

//修改联系人
void Modifycontact(Contact* pc)
{
	assert(pc);
	char name[Name_Max];
	int input = 0;
	printf("请输入修改联系人的名字:>");
	scanf("%s", name);
	int pos = FindByname(pc, name);
	if (pos == -1)
	{
		printf("未找到指定联系人n");
		return;
	}
	printf("%-20s %-5s %-5s %-12s  %-30sn", "姓名", "性别", "年龄", "号码", "住址");
	printf("%-20s %-5s %-5d %-12s  %-30sn", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
	do
	{
		menu1();
		printf("请选择要修改的内容:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入名字:>");
			scanf("%s", pc->data[pos].name);
			printf("修改成功n");
			break;
		case 2:
			printf("请输入性别:>");
			scanf("%s", pc->data[pos].sex);
			printf("修改成功n");
			break;
		case 3:
			printf("请输入年龄:>");
			scanf("%d", &pc->data[pos].age);
			printf("修改成功n");
			break;
		case 4:
			printf("请输入号码:>");
			scanf("%s", pc->data[pos].tele);
			printf("修改成功n");
			break;
		case 5:
			printf("请输入住址:>");
			scanf("%s", pc->data[pos].addr);
			printf("修改成功n");
			break;
		case 0:
			printf("退出修改n");
			break;
		default:
			printf("选择错误n");
			break;
		}
	} while (input);
}

5.显示所有联系人信息

//打印通讯录
void Printcontact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空n");
		return;
	}
	int i = 0;
	printf("%-20s %-5s %-5s %-12s  %-30sn", "姓名", "性别", "年龄", "号码", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s %-5s %-5d %-12s  %-30sn", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
}

6.清空所有联系人

(1)静态版本

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

//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{
	InitContact(pc);
	printf("清空成功n");
}

​

(2)动态版本

void InitContact(Contact* pc)
{
	assert(pc);
	PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo));
	if (tmp != NULL)
	{
		pc->data = tmp;
	}
	else
	{
		perror("PeoInfo*)malloc:");
		return;
	}
	memset(pc->data, 0, Default_Max * sizeof(PeoInfo));
	pc->sz = 0;
	pc->Capacity = Default_Max;
}
//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{
	InitContact(pc);
	printf("清空成功n");
}

7.以名字排序所有联系人

//排序联系人

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{
	int sz = pc->sz;
	qsort(pc->data, sz, sizeof(pc->data[0]), cmp_name);
	printf("排序成功n");
}

8.销毁通讯录(释放)

void Freecontact(Contact* pc)
{
	free(pc->data);
	pc->Capacity = 0;
	pc->sz = 0;
	printf("销毁成功n");
}

三.菜单界面

#define _CRT_SECURE_NO_WARNINGS  1
#include"contact.h"

void menu()
{
	printf("*****************************n");
	printf("****  1.add     2.delete ****n");
	printf("****  3.search  4.modify ****n");
	printf("****  5.print   6.empty  ****n");
	printf("****  7.sort    0.exit   ****n");
	printf("*****************************n");
}
void test()
{
	Contact Con;//通讯录
	InitContact(&Con); //初始化通讯录
	int input = 0;
	do 
	{
		input = 0;
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			Addcontact(&Con);
			break;
		case delete:
			Deletecontact(&Con);
			break;
		case search:
			Searchcontact(&Con);
			break;
		case modify:
			Modifycontact(&Con);
			break;
		case print:
			Printcontact(&Con);
			break;
		case empty:
			Emptycontact(&Con, InitContact);
			break;
		case sort:
			Sortcontact(&Con);
			break;
		case 0:
			Freecontact(&Con);
			printf("退出通讯录n");
			break;
		default:
			printf("选择错误n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

四.头文件声明

#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
//常量定义
enum Option
{
	//exit,
	add=1,
	delete,
	search,
	modify,
	print,
	empty,
	sort
};

#define Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30
#define Default_Max 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;

//静态版本
//1000个联系人 与已存个数结构体
//typedef struct Contact
//{
//	PeoInfo data[Max];
//	int sz;
//}Contact;

//函数声明

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

//添加联系人
void Addcontact(Contact* pc);

//打印通讯录
void Printcontact(Contact* pc);

//删除联系人
void Deletecontact(Contact* pc);

//查找联系人
void Searchcontact(Contact* pc);

//修改联系人
void Modifycontact(Contact* pc);

//清空联系人
void Emptycontact(Contact* pc,void(*p)(Contact*));

//排序联系人
void Sortcontact(Contact* pc);

//销毁通讯录
void Freecontact(Contact* pc);

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>