#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDR 20
#define MAX 2
#define INT_SZ 2
typedef struct PeopleInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char address[ADDR];
}Peo;
typedef struct Contact
{
//struct PeopleInfo data[MAX];//存储的信息
Peo *data;
int sz;//记录存储的个数
int capacity;
}con,* pc;
void InitContact(pc);
void Destroy(pc);
int ADD_Capacity(pc);
void AddCon(pc);
int Find(pc,const char *name);
void DelCon(pc);
void ShowCon(pc);
void ModCon(pc);
void SearCon(pc);
void SortCon(pc);
void EmptyCon(pc);
#endif
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
#include<string.h>
void InitContact(struct Contact *pc)
{
//pc->sz = 0;
//memset(pc->data, 0, sizeof(pc->data));
pc->data = (Peo*)calloc(MAX, sizeof(Peo));
if (pc->data == NULL)
{
printf("%s", strerror(errno));
return;
}
pc->sz = 0;
pc->capacity = MAX;
}
void Destroy(struct Contact *pc)
{
free(pc->data);
pc->data = NULL;
pc->sz = 0;
pc->capacity = 0;
}
int ADD_Capacity(struct Contact *pc)
{
if (pc->sz == pc->capacity)
{
Peo * tmp = (Peo *)realloc(pc->data, (pc->capacity+INT_SZ)*sizeof(Peo));
if (tmp != NULL)
{
tmp = pc->data;
pc->capacity += INT_SZ;
return 1;
}
else
return 0;
}
return 1;
}
int Find(struct Contact *pc,const char *name)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name,name) == 0)
return i;
}
return -1;
}
void AddCon(struct Contact *pc)
{
/*if (pc->sz == MAX)
{
printf("通讯录已经满了,无法增加\n");
return;
}*/
int ret=ADD_Capacity(pc);
if (ret == 0)
return;
printf("请输入要增加的人的姓名:\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入要增加的人的年龄:\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入要增加的人的性别:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入要增加的人的电话:\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入要增加的人的地址:\n");
scanf("%s", pc->data[pc->sz].address);
pc->sz++;
printf("恭喜你,增加了一个名单\n");
}
void DelCon(struct Contact *pc)
{
int i = 0;
char name[20] = { 0 };
if (pc->sz == 0)
{
printf("通讯录为空,不能删除\n");
return;
}
printf("请输入要删除人的姓名:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret != -1)
{
for (i = ret; i <( pc->sz) - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("恭喜你,删除成功\n");
}
else if (ret == -1)
printf("删除失败,你要删除的人不存在\n");
}
void ShowCon(struct Contact *pc)
{
int i = 0;
printf("\t %5s \t %3s \t %5s \t %20s \t %20s \t\n", \
"name", "age", "sex", "telephon", "address");
for (i = 0; i < pc->sz; i++)
{
printf("\t %5s \t %3d \t %5s \t %20s \t %20s \t\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].address);
}
}
void ModCon(struct Contact *pc)
{
char name[20] = { 0 };
printf("请输入要修改人的姓名:\n");
scanf("%s", name);
int ret=Find(pc, name);
if (ret != -1)
{
printf("请输入修改后的名字:\n");
scanf("%s", pc->data[ret].name);
printf("请输入修改后的年龄:\n");
scanf("%d", &pc->data[ret].age);//因为age不是首元素的地址
printf("请输入修改后的性别:\n");
scanf("%s", pc->data[ret].sex);
printf("请输入修改后的电话:\n");
scanf("%s", pc->data[ret].tele);
printf("请输入修改后的地址:\n");
scanf("%s", pc->data[ret].address);
printf("恭喜你,修改成功\n");
}
else
printf("很遗憾,要修改的人不存在\n");
}
void SearCon(struct Contact *pc)
{
char name[20] = {0};
printf("请输入要查找人的姓名:\n");
scanf("%s", name);
int i=Find(pc, name);
if (i != -1)
{
printf("\t %5s \t %3d \t %5s \t %20s \t %20s \t\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].address);
}
else
printf("很遗憾,要查找的人不存在\n");
}
void SortCon(struct Contact *pc)
{
int i = 0;
int j = 0;
for (i = 0; i < (pc->sz) - 1; i++)
{
for (j = 0; j < (pc->sz) - 1 - i; j++)
{
if (strcmp(pc->data[j].name, pc->data[j + 1].name)>0)
{
Peo p;
p = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = p;
}
}
}
printf("恭喜你排序成功\n");
}
void EmptyCon(struct Contact *pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
void menu()
{
printf("***************************\n");
printf("*****0 exit 1.add *****\n");
printf("*****2.delete 3.modify*****\n");
printf("*****4.search 5.show ****\n");
printf("*****6.save 7.sort*******\n");
printf("***************************\n");
}
enum
{
Exit,
Add,
Del,
Mod,
Search,
Show,
Save,
Sort,
Empty
};
void test()
{
int input = 0;
struct Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case Exit:
Destroy(&con);
break;
case Add:
AddCon(&con);
break;
case Del:
DelCon(&con);
break;
case Mod:
ModCon(&con);
break;
case Search:
SearCon(&con);
break;
case Show:
ShowCon(&con);
break;
case Save:
break;
case Sort:
SortCon(&con);
break;
case Empty:
EmptyCon(&con);
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}