1.contact.h
//#pragma once
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include <stdio.h>
#include <windows.h>
#pragma warning (disable:4996)
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 20
#define MAX_ADDR 30
#define CON_START 2 //初始通讯录大小
#define INC_COUNT 10 //每次增容大小
typedef struct PeoInfo { //个人信息结构体
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}Peo;
typedef struct Contact { //通讯录信息结构体
Peo* con;//结构体指针,数据存放的位置
int count;//现在存放的个数
int capacity;//容量
}Con, *pCon;
/*接口函数*/
void initContact(pCon pcon);//初始化通讯录
void add(pCon pcon);
void dele(pCon pcon);
void search(pCon pcon);
void modify(pCon pcon);
void show(pCon pcon);
void empty(pCon pcon);
void sort(pCon pcon);
#endif
2.contact.c
#include "contact.h"
/*初始化*/
void initContact(pCon pcon)
{
pcon->con = (Peo*)malloc(CON_START*sizeof(Peo));
if (pcon->con == NULL){
printf("Out Of Memory\n");
exit(EXIT_FAILURE);
}
memset(pcon->con, 0, CON_START*sizeof(Peo));
pcon->count = 0;
pcon->capacity = CON_START;//初始化最大容量为CON_START
}
void check(pCon pcon) //检测
{
Peo *ptr = NULL;
if (pcon->count == pcon->capacity){
ptr = (Peo*)realloc(pcon, (pcon->count + INC_COUNT)*sizeof(Peo));
if (ptr == NULL){
printf("Out Of Memory\n");
exit(EXIT_FAILURE);
}
else{
pcon->con = ptr;
pcon->capacity = pcon->capacity + INC_COUNT;
}
}
}
/*增加成员*/
void add(pCon pcon)
{
check(pcon);
printf("name:");
scanf("%s", pcon->con[pcon->count].name);
printf("age:");
scanf("%d", &(pcon->con[pcon->count].age));
printf("sex:");
scanf("%s", pcon->con[pcon->count].sex);
printf("tele:");
scanf("%s", pcon->con[pcon->count].tele);
printf("addr:");
scanf("%s", pcon->con[pcon->count].addr);
pcon->count++;
}
int find(pCon pcon)
{
char name[10] = { 0 };
int i = 0;
printf("请输入姓名: ");
scanf("%s", name);
for (i = 0; i < pcon->count; i++){
if (strcmp(name, pcon->con[i].name) == 0){
return i;
}
}
return -1;
}
/*删除成员*/
void dele(pCon pcon)
{
int i = 0;
int ret = 0;
if (pcon->count == 0){
printf("通讯录为空\n");
return;
}
ret = find(pcon);
if (ret == -1){
printf("没有找到!\n");
}
else{
for (i = ret; i < pcon->count - 1; i++){
pcon->con[i] = pcon->con[i + 1];
}
pcon->count--;
printf("删除成功!\n");
}
}
/*查找成员*/
void search(pCon pcon)
{
int ret = 0;
if (pcon->count == 0){
printf("通讯录为空\n");
return;
}
ret = find(pcon);
if (ret == -1){
printf("没有找到\n");
}
else{
printf("%5s\t%s\t%5s\t%5s\t%5s\n", "name", "age", "sex", "tele", "addr");
printf("%5s\t%d\t%5s\t%5s\t%5s\n", \
pcon->con[ret].name,\
pcon->con[ret].age, pcon->con[ret].sex,\
pcon->con[ret].tele, pcon->con[ret].addr);
}
}
/*修改*/
void modify(pCon pcon)
{
int ret = 0;
if (pcon->count == 0){
printf("通讯录为空\n");
return;
}
ret = find(pcon);
if (ret == -1){
printf("没有找到\n");
}
else{
printf("name:");
scanf("%s", &(pcon->con[ret].name));
printf("age:");
scanf("%d", &(pcon->con[ret].age));
printf("sex:");
scanf("%s", &(pcon->con[ret].sex));
printf("tele:");
scanf("%s", &(pcon->con[ret].tele));
printf("addr:");
scanf("%s", &(pcon->con[ret].addr));
}
}
/*排序*/
void sort(pCon pcon) //从小到大
{
int flag = 0;
int i = 0;
int j = 0;
for (i = 0; i<pcon->count - 1; i++){
flag = 1;
for (j = 0; j<pcon->count - i - 1; j++){
if (strcmp(pcon->con[j].name, pcon->con[j + 1].name)>0){
Peo tmp = pcon->con[j];
pcon->con[j] = pcon->con[j + 1];
pcon->con[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
break;
}
//show(pcon);
printf("排序完成\n");
}
/*展示信息*/
void show(pCon pcon)
{
int i = 0;
printf("%5s\t%s\t%5s\t%5s\t%5s\n", "name", "age", "sex", "tele", "addr");
//printf("%d\n",pcon->count );
for (i = 0; i<pcon->count; i++){
printf("%5s\t%d\t%5s\t%5s\t%5s\n", \
pcon->con[i].name,\
pcon->con[i].age, pcon->con[i].sex,\
pcon->con[i].tele, pcon->con[i].addr);
}
}
void empty(pCon pcon)
{
if (pcon->con != NULL){
free(pcon->con);
pcon->con = NULL;
}
}
3.test.c
#include "contact.h"
/*
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
0. 退出
*/
enum Option //枚举,增加代码可读性
{
Exit,//从0开始
Add,
Dele,
Search,
Modify,
Show,
Empty,
Sort
};
void menu()
{
printf("##############################\n");
printf("###### Design By Liyuan ####\n");
printf("##############################\n");
printf("###### 1.add 2.dele ####\n");
printf("###### 3.search 4.modify ####\n");
printf("###### 5.show 6.empty ####\n");
printf("###### 7.sort 0.exit ####\n");
printf("##############################\n");
}
test()
{
Con myCon;//创建的一个Con类型变量,即新创建一个通讯录名
int input = 0;
initContact(&myCon);//初始化
while (1){
menu();
printf("Please Select<0-7>:");
scanf("%d", &input);
switch (input){
case Add:
add(&myCon);
break;
case Dele:
dele(&myCon);
break;
case Search:
search(&myCon);
break;
case Modify:
modify(&myCon);
break;
case Show:
show(&myCon);
break;
case Empty:
empty(&myCon);
break;
case Sort:
sort(&myCon);
break;
case Exit:
empty(&myCon);//释放内存,防止内存泄漏
exit(0);
break;
default:
printf("Select Erro.Please Reselect!\n");
break;
}
}
}
int main()
{
test();
system("pause");
return 0;
}