C语言实现一个简单的通讯录

Contact.h

#define _CRT_SECURE_NO_WARNINGS

#pragma once
#include<cstdio>
#include<memory.h>
#include<cstring>
#include<stdlib.h>

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000
#define DEFAULT_SZ 3
#define INC_SZ 2

//类型的定义
typedef struct PeoInfo
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    int age;
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;

//静态版本
//typedef struct Contact
//{
//    PeoInfo data[MAX];//存放添加人的信息
//    int sz;//当前通讯录中的人数
//}Contact;

//动态版本
typedef struct Contact
{
    PeoInfo* data;//存放添加人的信息
    int sz;//当前通讯录中的人数
    int capacity;
}Contact;


//函数的定义
void InitContact(Contact* pc);//初始化通讯录

void AddContact(Contact* pc);//在通讯录中添加人物信息

void PrintContact(const Contact* pc);//现实当前通讯录中的人的信息

void DelContact(Contact* pc);

void SearchContact(Contact* pc);

void ModifyContact(Contact* pc);

void DestoryContact(Contact* pc);

Contact.c函数的实现

 

#include"contact.h"

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

void AddContact(Contact* pc)
{
	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增加成功!\n");
	if (pc->capacity == pc->sz)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (DEFAULT_SZ + INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功!\n");
		}
		else
		{
			perror("AddContact");
			printf("增加联系人失败!\n");
			return;
		}
	}
}

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


static int FindByName(Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到了,返回下标i
		}
	}
	return -1;//找不到
}
void DelContact(Contact* pc)
{
	int i = 0;
	char name[MAX_NAME] = { 0 };
	if (pc->sz == 0)
	{
		printf("此通讯录为空无法删除信息\n");
		return;
	}
	//查找要删除的人(yes/no)?
	printf("请输入要删除的人名\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	for (i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
	
}

void SearchContact(Contact* pc)
{
	char name[MAX_NAME] = {0};
	printf("请输入要查找人的姓名.\n");
	scanf("%s", name);
	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("查无此人。\n");
		return;
	}
	printf("%-20s\t%-8s\t%-5s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址");
	printf("%-20s\t%-8s\t%-5d\t%-12s\t%-20s\t\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
}

void ModifyContact(Contact* pc)
{
	printf("请输入要修改人的姓名.\n");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("没有%s的信息。\n", name);
	}
	printf("%-20s\t%-8s\t%-5s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址");
	printf("%-20s\t%-8s\t%-5d\t%-12s\t%-20s\t\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
	printf("请修改>:\n");
	printf("请输入姓名>:");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别>:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pos].age);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);
	printf("\n修改成功!\n");
}

void PrintContact(const Contact* pc)
{
	int count = 0;
	printf("%-20s\t%-8s\t%-5s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址");
	for (count = 0; count < pc->sz; count++)
	{
		printf("%-20s\t", pc->data[count].name);
		printf("%-8s\t", pc->data[count].sex);
		printf("%-5d\t", pc->data[count].age);
		printf("%-12s\t", pc->data[count].tele);
		printf("%-20s\t", pc->data[count].addr);
		printf("\n");
	}
}

test.c通讯录功能测试;

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//通讯录(静态版本)
//1.通讯录中能够保存1000人的信息
//每个人的信息:
//姓名+年龄+性别+电话+地址
//2.增加人的信息
//3.删除指定人的信息
//4.修改指定人的信息
//5.查找指定人的信息
//6.排序通讯录的信息


//动态版本
//最初放3个人的信息,不够后增加两个人的信息

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

enum Option
{
	EXIT, ADD, DELETE, SEARCH, MODIFY, SORT, PRINTF
};
int main()
{
	int sz = 0;
	Contact con;
	int input = 0;
	InitContact(&con);
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		//增加信息
		case ADD:
			AddContact(&con);
			break;
		//删除信息
		case DELETE:
			DelContact(&con);
			break;
		//查找
		case SEARCH:
			SearchContact(&con);
			break;
		//修改信息
		case MODIFY:
			ModifyContact(&con);
			break;
		//分类信息
		case SORT:
			break;
		//打印信息
		case PRINTF:
			PrintContact(&con);
			break;
		//退出
		case EXIT:
			DestoryContact(&con);
			printf("退出通讯录!");
			break;
		default:
			printf("Please input again!\n");
			break;
		}
	} while (input);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值