通讯录(C语言实现)

目录

一.准备工作

二.实现步骤(静态版本)

1.创建菜单(test.c)

2.通讯录(Contact.h)

3.创建通讯录(test.c)

 4.Contact.h包含的声明及头文件

5.函数实现(Contact.c)

   代码中会用到的库函数

   InitContact(初始化通讯录)

   AddContact(增加)

    DelContact(删除)

    SearchConttact(查找)

ModifyContact(修改)

    SortContact(排序)

三.完整代码

test.c

Contact.c

Contact.h

四.补充

五.动态版本(内存动态分配)

 contact.h中新增内容

新增定义

修改结构体 

contact.c中新增函数

CheckCapacity(扩容)

DestroyContac(销毁)

 修改函数

InitContact

完整代码

contact.h

test.c

contact.c

六.文件版本

contact.h

test.h

contact.c


前言

今天教大家如何用C语言实现一个简单通讯录。

一.准备工作

1.平台:Visual Studio 2022(Vs官网下载社区版本,是免费的),X86环境下

2.在Vs中建立项目-->选定空项目-->源文件中新建三个文件,分别是:test.c(主函数)

                                                                                                        Contact.c(函数实现)

                                                                                                        Contact.h(存放头文件)

二.实现步骤(静态版本)

1.创建菜单(test.c)

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"


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

int main()
{
    int input = 0;
 do
 {
    menu();
    printf("请输入:>");
    scanf("%d",&input);
switch(input)
   {
    case 1:
         AddContact(&con);//增加通讯录
         break;
    case 2:
         DelContact(&con);//删除指定联系人
         break;
    case 3:
         SearchConttact(&con);//查找指定联系人
         break;
    case 4:
         ModifyContact(&con);//修改指定联系人
         break;
    case 5:
         ShowContact(&con);//打印联系人
         break;
    case 6:
         SortContact(&con);//排序联系人信息
         break;
    case 0:
         printf("退出通讯录\n");
         break;
    default:
         printf("命令错误,请重新输入\n");
         break;
         
    }
 }while(input);
    return 0;
}

2.通讯录(Contact.h)

typedef struct PeoInfo//人的信息
{
   char name[MAX_NAME];//名字
   int age;//年龄
   char sex[MAX_SXE];//性别
   char tele[MAX_TELE];//电话
   char addr[MAX_ADDR];//地址
}PeoInfo;



typedef struct Contact
{
   PeoInfo data[MAX];//存放人的信息
   int cont;//记录通讯录人数
}Contact;

3.创建通讯录(test.c)

int main()
{
	int input = 0;
	Contact con;//通讯录
	InitContact(&con);//初始化通讯录;尽量模块化;初始化特定方式
......

 4.Contact.h包含的声明及头文件

#pragma once

#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30

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

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

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


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

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

//修改指定类型人
void ModifyContact(Contact* pc);

//排序通讯录中的内容
void SortContact(Contact* pc);

5.函数实现(Contact.c)

   代码中会用到的库函数
函数名头文件作用
assert#include<assert.h>判断传入指针是否为空指针
memset#include<string.h>复制粘贴
strcmp#include<string.h>比较两个字符串是否相等,并返回相应参数
qsort#include<stdlib.h>排序函数
   InitContact(初始化通讯录)
void InitContact (Contact* pc)
{
     assert(pc);//断言函数,判断pc是否为空指针
     pc->cont = 0;
     memset(pc->data,0,sizeof(pc->data));//memset,需要三个参数,
                                         //粘贴的起始位置,
                                         //粘贴的数据,
                                         //粘贴多少个
}
   AddContact(增加)
void AddContact(Contact* pc)
{
     assert(pc);
     
     if(pc->cont == 100)
   {
        printf("通讯录已满,无法添加\n");
        return;

   }
     
     printf("请输入姓名:>");
     scanf("%s",&(pc->data[cont].name));
     printf("请输入年龄:>");
     scanf("%d",&(pc->data[cpnt].age));
     printf("请输入性别:>");
     scanf("%s",&(pc->data[cont].sex));
     printf("请输入电话:>");
     scanf("%s",&(pc->data[cont].tele));
     printf("请输入地址:>");
     scanf("%s",&(pc->data[cont].addr));
     
     pc->cont++;
     printf("添加成功\n");
}
    DelContact(删除)
void DelContact(Contact* pc)
{
     assert(pc);
     char name[MAX_NAME] == { 0 };

     if(pc->cont == 0)
     {
        printf("内容为空,没有信息删除\n");
        return;
     } 
     printf("请输入需要删除联系人的姓名:>");
     scanf("%s",name);
     //1.查找
     int pos = FindByName(pc,name);
     //2.删除
     if(pos == 0)
     {
        printf("查找成功\n");
        for(int i = pos;i<cont-1;i++)
        {
            pc->data[i].name == pc->data[i+1].name;  
        }
        pc->cont--;
     }
        else if(pos == -1)
        {
            printf("查找人不存在\n");
        }
}

int  FindByName(Contact* pc,char name[])//查找函数
{
     assert(pc);
     for(int i = 0;i<pc->cont;i++)
     {
         if(0 == strcmp(pc->data[i].name == name))//strcmp,
         {
            return i;
         }
     }
     return -1;  
}
    SearchConttact(查找)
 void SearchConttact(Contact* pc)
{
      assert(pc);
      char name[MAX_NAME] = { 0 };
      printf("请输入要查找人的名字:>");
      scanf("%s",name);
      //查找
      int pos = FindByName(pc,name);
      if(pos == -1)
      {
         printf("查找失败,此人不存在\n");
         return;
      }
      //打印
      printf("%20s\t%5s\t%10s\t%12s\t%30s\n","名字","年龄","性别","电话","地址");
      printf("%20s\t%5d\t%10s\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);
   
}
ModifyContact(修改)
void ModifyContact(Contact* pc)
{
     assert(pc);
     char name[MAX_NAME] = { 0 };
     printf("请输入修改人的名字:>");
     scanf("%s",name);
     //1.查找
     int pos = FindByName(pc,name);
     if(pos == -1)
     {
        printf("查找失败,此人不存在\n");
        return;
     }
     //2.修改
     printf("查找成功,接下来开始修改信息\n");

     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");
     
}
    SortContact(排序)
void SortContact(Contact* pc)
{ 
     assert(pc);
     //根据名字排序
     qsort(pc->data,pc->cont,sizeof(PeoInfo),cmp_peo_by_name);//库函数
     printf("排序成功\n");
}

int cmp_peo_by_name(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}

三.完整代码

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");
}

int main()
{
	int input = 0;
	Contact con;//通讯录
	InitContact(&con);//初始化通讯录;尽量模块化;初始化特定方式
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);//增加通讯录
			break;
		case 2:
			DelContact(&con);//删除指定联系人
			break;
		case 3:
			SearchConttact(&con);//查找指定联系人
			break;
		case 4:
			ModifyContact(&con);//修改指定联系人
			break;
		case 5:
			ShowContact(&con);//打印联系人
			break;
		case 6:
			SortContact(&con);//排序联系人信息
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("命令错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(Contact* pc)
{
	assert(pc);
	pc->cont = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->cont == 100)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}

	printf("请输入名字:>");
	scanf("%s", pc->data[pc->cont].name);

	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->cont].age));

	printf("请输入性别:>");
	scanf("%s", &(pc->data[pc->cont].sex));

	printf("请输入电话:>");
	scanf("%s", &(pc->data[pc->cont].tele));

	printf("请输入地址:>");
	scanf("%s", &(pc->data[pc->cont].addr));

	pc->cont++;
	printf("增加成功\n");
}

void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->cont; i++)
	{
		printf("%20s\t%-5d\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);
	}
}

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


void DelContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	assert(pc);
	if (pc->cont == 0)
	{
		printf("通讯录为空,没有信息可以删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	//删除
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2.查找
	for (int i = pos; i < pc->cont - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->cont--;
	printf("删除成功\n");
}

void  SearchConttact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//2.打印
	printf("%20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	
		printf("%20s\t%-5d\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);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("要修改的人的信息已经查找到,接下来开始修改\n");
	//2.修改
	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_poe_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按名字排序
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->cont, sizeof(PeoInfo), cmp_poe_by_name);
	printf("排序成功\n");
}

Contact.h

#pragma once

#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//类型的声明
//人的信息
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_NAME];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

//通讯录
typedef struct Contact
{
	PeoInfo data[MAX];//存放人的信息
	int cont;//记录当前通讯录中实际人的个数
}Contact;

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

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

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

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

//修改指定类型人
void ModifyContact(Contact* pc);

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

//排序通讯录中的内容
void SortContact(Contact* pc);

四.补充

用枚举类型,来替换菜单中的数字,可以增加代码可读性

#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");
}

enum Menu//增加代码可读性
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
};



int main()
{
	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:
			SearchConttact(&con);//查找指定联系人
			break;
		case MODIFY:
			ModifyContact(&con);//修改指定联系人
			break;
		case SHOW:
			ShowContact(&con);//打印联系人
			break;
		case SORT:
			SortContact(&con);//排序联系人信息
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("命令错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

五.动态版本(内存动态分配)

 contact.h中新增内容

新增定义

#define DEFAULT_SZ 3
#define INC_SZ 2

修改结构体 

typedef struct Contact
{
	PeoInfo* data;
	int cont;
	int capacity;
}Contact;

contact.c中新增函数

CheckCapacity(扩容)
void CheckCapacity(Contact* pc)
{
	assert(pc);
	if (pc->cont == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("AddContact::%s\n", strerror(errno));
            return;
		}
		else
		{
			pc->data = ptr;
            pc->capacity += INC_SZ;
            printf("增容成功\n");
		}
		
	}
	
}
DestroyContac(销毁)
void DestroyContact(Contact* pc)
{
	assert(pc);
	free(pc->data);
	pc->data = NULL;
}

 修改函数

InitContact
int InitContact(Contact* pc)
{
	assert(pc);
	pc->cont = 0;
	pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	pc->capacity = DEFAULT_SZ;
    return 0;
}

完整代码

contact.h

#pragma once

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


#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//类型的声明
//人的信息
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_NAME];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

//通讯录
//动态
typedef struct Contact
{
	PeoInfo* data;
	int cont;
	int capacity;
}Contact;

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

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

//扩容
void CheckCapacity(Contact* pc);

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


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

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

//修改指定类型人
void ModifyContact(Contact* pc);

//排序通讯录中的内容
void SortContact(Contact* pc);

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

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");
}

enum Menu//增加代码可读性
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
};



int main()
{
	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:
			SearchConttact(&con);//查找指定联系人
			break;
		case MODIFY:
			ModifyContact(&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);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//动态
int InitContact(Contact* pc)
{
	assert(pc);
	pc->cont = 0;
	pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	pc->capacity = DEFAULT_SZ;
	return 0;
}

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

void CheckCapacity(Contact* pc)
{
	assert(pc);
	if (pc->cont == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("AddContact::%s\n", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
		}
	}
}
//动态
void AddContact(Contact* pc)
{
	assert(pc);
	//增容
	CheckCapacity(pc);
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->cont].name);

	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->cont].age));

	printf("请输入性别:>");
	scanf("%s", &(pc->data[pc->cont].sex));

	printf("请输入电话:>");
	scanf("%s", &(pc->data[pc->cont].tele));

	printf("请输入地址:>");
	scanf("%s", &(pc->data[pc->cont].addr));

	pc->cont++;
	printf("增加成功\n");
}
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->cont; i++)
	{
		printf("%20s\t%-5d\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);
	}
}

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


void DelContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	assert(pc);
	if (pc->cont == 0)
	{
		printf("通讯录为空,没有信息可以删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	//删除
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2.删除
	for (int i = pos; i < pc->cont - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->cont--;
	printf("删除成功\n");
}

void  SearchConttact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//2.打印
	printf("%20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	
		printf("%20s\t%-5d\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);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("要修改的人的信息已经查找到,接下来开始修改\n");
	//2.修改
	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_poe_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按名字排序
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->cont, sizeof(PeoInfo), cmp_poe_by_name);
	printf("排序成功\n");
}

六.文件版本

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

void LoadContact(Contact* pc)
{
	FILE* PfRead = fopen("Contact.txt", "rb");
	if (PfRead == NULL)
	{
		perror("LoadContact");
		return;
	}
	//读文件
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, PfRead) == 1)
	{
		CheckCapacity(pc);
		pc->data[pc->cont] = tmp;
		pc->cont++;
	}

	//关闭
	fclose(PfRead);
	PfRead = NULL;
}

//动态
int InitContact(Contact* pc)
{
	assert(pc);
	pc->cont = 0;
	pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	pc->capacity = DEFAULT_SZ;
	//加载信息到通讯录里
	LoadContact(pc);
	return 0;
}

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

void CheckCapacity(Contact* pc)
{
	assert(pc);
	if (pc->cont == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("AddContact::%s\n", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
		}
	}
}
//动态
void AddContact(Contact* pc)
{
	assert(pc);
	//增容
	CheckCapacity(pc);
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->cont].name);

	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->cont].age));

	printf("请输入性别:>");
	scanf("%s", &(pc->data[pc->cont].sex));

	printf("请输入电话:>");
	scanf("%s", &(pc->data[pc->cont].tele));

	printf("请输入地址:>");
	scanf("%s", &(pc->data[pc->cont].addr));

	pc->cont++;
	printf("增加成功\n");
}
void ShowContact(const Contact* pc)
{
	printf("当前通讯录人数:%d\n", pc->cont);
	assert(pc);
	int i = 0;
	printf("%20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->cont; i++)
	{
		printf("%20s\t%-5d\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);
	}
}

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


void DelContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	assert(pc);
	if (pc->cont == 0)
	{
		printf("通讯录为空,没有信息可以删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	//删除
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2.删除
	for (int i = pos; i < pc->cont - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->cont--;
	printf("删除成功\n");
}

void  SearchConttact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//2.打印
	printf("%20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	
		printf("%20s\t%-5d\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);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("要修改的人的信息已经查找到,接下来开始修改\n");
	//2.修改
	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_poe_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按名字排序
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->cont, sizeof(PeoInfo), cmp_poe_by_name);
	printf("排序成功\n");
}

//保存通讯录

void SaveContact(const Contact* pc)
{
	assert(pc);
	FILE* PfWrite = fopen("Contact.txt", "wb");
	if (PfWrite == NULL)
	{
		perror("SaveContact");
		return;
	}
	//写文件
	for (int i = 0; i < pc->cont; i++)
	{
		fwrite(pc->data + i, sizeof(PeoInfo), 1, PfWrite);
	}
	//关闭文件
	fclose(PfWrite);
	PfWrite = NULL;
}

test.h

#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");
}

enum Menu//增加代码可读性
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
};



int main()
{
	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:
			SearchConttact(&con);//查找指定联系人
			break;
		case MODIFY:
			ModifyContact(&con);//修改指定联系人
			break;
		case SHOW:
			ShowContact(&con);//打印联系人
			break;
		case SORT:
			SortContact(&con);//排序联系人信息
			break;
		case EXIT:
			SaveContact(&con);
			DestroyContact(&con);//释放空间
			printf("退出通讯录\n");
			break;
		default:
			printf("命令错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

contact.c

#pragma once

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


#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//类型的声明
//人的信息
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_NAME];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

//通讯录
//动态
typedef struct Contact
{
	PeoInfo* data;
	int cont;
	int capacity;
}Contact;

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

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

//扩容
void CheckCapacity(Contact* pc);

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


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

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

//修改指定类型人
void ModifyContact(Contact* pc);

//排序通讯录中的内容
void SortContact(Contact* pc);

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

//保存通讯录
void SaveContact(const Contact* pc);
//加载文件信息到通讯录
void LoadContact(Contact* pc);

看到这里,不妨点个攒,关注一下吧! 

最后,谢谢你的观看。 

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值