【C语言】简单实现通讯录
已实现功能
新建联系人
删除指定联系人
查找指定联系人
修改指定联系人
显示所有联系人
清空所有联系人
按姓名排序联系人
待实现功能
通讯录加密
通讯录联网保存
通讯录导入导出
实现效果展示
头文件
#ifndef __TONYXUNLU_H__
#define __TONGXUNLU_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>
#define DEFAULT 2 //通信录默认大小
#define NAME_MAX 10
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDRESS_MAX 50
#define ADD_NUM 2 //每次扩容默认步长
enum OPTION
{
EXIT,
ADD,
DEL,
FIND,
MODIFY,
DISPLAY,
EMPTY,
SORT
};
typedef struct PLEINFO //通讯录个人信息结构体
{
char name[NAME_MAX];
char sex[SEX_MAX];
unsigned char age;
char telephone[TELE_MAX];
char address[ADDRESS_MAX];
}PLEINFO;
typedef struct CONTACT //通讯录结构体
{
unsigned int count;
unsigned int capacity;
PLEINFO *data;
}CONTACT;
CONTACT my_contact;
void InitContact(CONTACT *pcontact); //初始化通讯录
void Modify(CONTACT *pcontact); //修改联系人信息
void SubCapacity(CONTACT *pcontact); //核查缩小通讯录容量
void AddCapacity(CONTACT *pcontact); //核查增加通讯录容量
void Add(CONTACT *pcontact); //新建联系人
void Del(CONTACT *pcontact); //删除联系人
int Find(CONTACT *pcontact); //查找联系人
void Display(CONTACT *pcontact); //显示所有联系人
void Sort(CONTACT *pcontact); //按姓名排序联系人
void Empty(CONTACT *pcontact); //清空联系人
void menu(); //菜单
void Exit(CONTACT *pcontact); //关闭通讯录
#endif //_TONGXUNLU_H__
功能实现文件
#include "tongxunlu.h"
void InitContact(CONTACT *pcontact) //初始化通讯录
{
pcontact->capacity = DEFAULT;
pcontact->count = 0;
pcontact->data = (PLEINFO *)calloc(sizeof(PLEINFO), pcontact->capacity);
if (pcontact->data == NULL)
{
printf("\n初始化通讯录失败\n");
system("pause");
exit(-1);
}
}
void SubCapacity(CONTACT *pcontact) //核查缩小通讯录容量
{
if (pcontact->capacity > pcontact->count && pcontact->count != 0)
{
int result = pcontact->capacity - pcontact->count;
PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity - result)*sizeof(PLEINFO));
if (tmp != NULL)
{
pcontact->data = tmp;
tmp = NULL;
pcontact->capacity -= result;
}
else
{
perror("缩容失败");
Exit(pcontact);
exit(-1);
}
}
}
void AddCapacity(CONTACT *pcontact) //核查增加通讯录容量
{
if (pcontact->capacity == pcontact->count)
{
PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity + ADD_NUM)*sizeof(PLEINFO));
if (tmp != NULL)
{
pcontact->data = tmp;
tmp = NULL;
pcontact->capacity += ADD_NUM;
}
else
{
perror("扩容失败");
Exit(pcontact);
exit(-1);
}
}
}
void Add(CONTACT *pcontact) //新建联系人
{
AddCapacity(pcontact);
printf("\n\t新建联系人\n\n");
printf("请输入联系人姓名:>");
scanf("%s", (pcontact->data[pcontact->count].name));
printf("请输入联系人性别:>");
scanf("%s", (pcontact->data[pcontact->count].sex));
printf("请输入联系人年龄:>");
scanf("%d", &((pcontact->data[pcontact->count].age)));
printf("请输入联系人电话:>");
scanf("%s", (pcontact->data[pcontact->count].telephone));
printf("请输入联系人住址:>");
scanf("%s", (pcontact->data[pcontact->count].address));
++pcontact->count;
printf("\n\t联系人增加成功\n");
system("pause");
}
void Del(CONTACT *pcontact) //删除联系人
{
int i = Find(pcontact);
if (i == -1)
{
printf("\n没有找到该联系人\n");
system("pause");
return;
}
else
{
pcontact->data[i] = pcontact->data[--pcontact->count];
}
SubCapacity(pcontact);
printf("\n删除成功\n");
system("pause");
}
unsigned int Find(CONTACT *pcontact) //查找联系人
{
char name[10];
unsigned int i = 0;
printf("请输入你要操作的联系人的姓名:>");
scanf("%s", name);
for (i = 0; i < pcontact->count; i++)
{
if (!strcmp(pcontact->data[i].name, name))
{
return i;
}
}
return -1;
}
void Modify(CONTACT *pcontact) //修改联系人信息
{
int i = Find(pcontact);
if (i == -1)
{
printf("\n没有找到该联系人\n");
system("pause");
return;
}
else
{
int input = 0;
printf("\n---------------------------------------------\n");
printf("\n\t已找到该联系人\n\n姓名:%s\n性别:%s\n年龄:%d\n电话:%s\n住址:%s\n",
pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
pcontact->data[i].telephone, pcontact->data[i].address);
printf("\n---------------------------------------------\n");
do
{
printf("\n1.姓名\t2.性别\t3.年龄\t4.电话\t5.住址\t0.退出\n\n你要修改联系人的哪一个信息呢?:>");
scanf("%d", &input);
switch (input)
{
case 1:
{
printf("姓名修改为:>");
scanf("%s", pcontact->data[i].name);
}
break;
case 2:
{
printf("性别修改为:>");
scanf("%s", pcontact->data[i].sex);
}
break;
case 3:
{
printf("年龄修改为:>");
scanf("%d", &(pcontact->data[i].age));
}
break;
case 4:
{
printf("电话修改为:>");
scanf("%s", pcontact->data[i].telephone);
}
break;
case 5:
{
printf("住址修改为:>");
scanf("%s", pcontact->data[i].address);
}
break;
case 0: printf("\n退出修改\n");
break;
default: printf("\n选择错误,请重新选择\n");
break;
}
} while (input);
}
printf("\n联系人修改成功\n");
system("pause");
}
void Display(CONTACT *pcontact) //显示所有联系人
{
unsigned int i = 0;
printf("\n通讯录当前 存放联系人数量/总容量\t%d/%d\n", pcontact->count, pcontact->capacity);
printf("\n---------------------------------------------\n");
printf("\n%-10s%-8s%-9s%-15s%-50s\n\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < pcontact->count; i++)
{
printf("%-10s%-8s%-9d%-15s%-50s\n",
pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
pcontact->data[i].telephone, pcontact->data[i].address);
}
printf("\n---------------------------------------------\n");
system("pause");
}
void Empty(CONTACT *pcontact) //清空联系人
{
PLEINFO *tmp = (PLEINFO *)calloc(sizeof(PLEINFO), DEFAULT);
if (!tmp)
{
printf("\n清空失败,请稍后重新清空\n");
system("pause");
return;
}
free(pcontact->data);
pcontact->data = tmp;
tmp = NULL;
pcontact->capacity = DEFAULT;
pcontact->count = 0;
printf("\n联系人清空成功\n");
system("pause");
}
void Sort(CONTACT *pcontact) //按姓名排序联系人 //冒泡排序
{
unsigned int i = 0;
for (i = 0; i < pcontact->count - 1; i++)
{
unsigned int j = 0;
for (j = 0; j < pcontact->count - i - 1; j++)
{
if (strcmp(pcontact->data[j].name, pcontact->data[j + 1].name) > 0)
{
PLEINFO tmp = pcontact->data[j];
pcontact->data[j] = pcontact->data[j + 1];
pcontact->data[j + 1] = tmp;
}
}
}
}
void menu() //菜单
{
printf("***********************\n");
printf("*** 1.新建联系人 ***\n");
printf("*** 2.删除指定联系人***\n");
printf("*** 3.查找指定联系人***\n");
printf("*** 4.修改指定联系人***\n");
printf("*** 5.显示所有联系人***\n");
printf("*** 6.清空所有联系人***\n");
printf("****7.排序所有联系人***\n");
printf("**** 0.退出通讯录 ***\n");
printf("***********************\n\n");
}
void Exit(CONTACT *pcontact) //关闭通讯录
{
free(pcontact->data);
pcontact->data = NULL;
pcontact->capacity = 0;
pcontact->count = 0;
printf("\n已退出通讯录\n");
system("pause");
}
主函数文件
#include "tongxunlu.h"
int main()
{
int input = 0;
InitContact(&my_contact);
do
{
system("cls");
menu();
printf("你想干嘛?:>");
scanf("%d", &input);
switch (input)
{
case EXIT: Exit(&my_contact);
break;
case ADD: Add(&my_contact);
break;
case DEL: Del(&my_contact);
break;
case FIND:
{
unsigned int i = Find(&my_contact);
if (i == -1)
{
printf("\n没有找到联系人\n");
system("pause");
break;
}
printf("\n---------------------------------------------\n");
printf("\n姓名:%-10s\n性别:%-8s\n年龄:%-9d\n电话:%-15s\n住址:%-50s\n",
my_contact.data[i].name, my_contact.data[i].sex, my_contact.data[i].age,
my_contact.data[i].telephone, my_contact.data[i].address);
printf("\n---------------------------------------------\n");
system("pause");
}
break;
case MODIFY: Modify(&my_contact);
break;
case DISPLAY:Display(&my_contact);
break;
case EMPTY: Empty(&my_contact);
break;
case SORT: Sort(&my_contact);
break;
default: printf("\n你输错了,重新输入吧!\n");
break;
}
} while (input);
return 0;
}