题目:实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
8. 保存联系人到文件
9. 加载联系人
头文件 contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<errno.h>
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_SIZE 64//姓名长度
#define TEL_SIZE 16//电话号码长度
#define ADDR_SIZE 128//地址长度
#define LIST_DEFAULT 1//列表中人的个数
#define INC_SIZE 1//扩容的长度
#define CT_FILE "contact.bin"
typedef struct person{
char name[NAME_SIZE];
char sex;
unsigned char age;
char telphone[TEL_SIZE];
char address[ADDR_SIZE];
}person_t,*person_p,**person_pp;
typedef struct contact{
int cap;//通讯录容量
int size;//实际人数
person_t list[0];
}contact_t,*contact_p,**contact_pp;
void menu();
void InitContactDefault(contact_pp ctpp);//初始化
void AddPerson(contact_pp ctpp);//增加联系人
void DelPerson(contact_pp ctpp);//删除联系人
void SearchPerson(contact_p ct);//查找联系人
void ModPerson(contact_pp ctpp);//修改联系人
void ClearPerson(contact_pp ctpp);//清空联系人
void SortContact(contact_p ct);//排序
void ShowContact(contact_p ct);//显示通讯录
void Save(contact_p ct);//保存
int Load(contact_pp ctpp);//加载
#endif
函数的实现 contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//检查通讯录是否已满 yes->1 no->0
static int IsFull(contact_p ct){
return ct->size == ct->cap ? 1 : 0;
}
//扩容通讯录 yes->1 no->0
static int IncContact(contact_pp ctpp)
{
int new_size = sizeof(contact_t)+(((*ctpp)->cap) + INC_SIZE)*sizeof(person_t);
contact_p p = realloc(*ctpp, new_size);
if (!p){
printf("Inc Contact Error!\n");
return 0;
}
p->cap = (*ctpp)->cap + INC_SIZE;
*ctpp = p;
printf("debug:Inc Contact Success!\n");
return 1;
}
//比较人名
static int person_cmp(const void *x, const void *y)
{
person_p _x = (person_p)x;
person_p _y = (person_p)y;
return strcmp(_x->name, _y->name);
}
//以人名查找通讯录
static int FindName(contact_p ct, char *name)
{
int i = 0;
assert(ct);
for (i = 0; i < ct->size; i++)
{
if (strcmp(ct->list[i].name, name) == 0)
{
return i;
}
}
return -1;//没找到
}
//交换结构体内容
static void Swap(struct person *a, struct person *b)
{
struct person tmp;
tmp= *a;
*a = *b;
*b = tmp;
return;
}
void menu()
{
printf("---------------------------------------\n");
printf("-- 1.Show 2.Add 3.Del --\n");
printf("-- 4.Mod 5.Search 6.Sort --\n");
printf("-- 7.Clear 8.Save --\n");
printf("---------------------------------------\n");
printf("Please Enter Your Select:>");
}
int InitContactFile(contact_pp ctpp,FILE *fp)
{
contact_p p = (contact_p)malloc(sizeof(contact_t));
if (p){
fread(p, sizeof(contact_t), 1, fp);
int _cap = p->cap;
int size = sizeof(contact_t)+p->cap*sizeof(person_t);
contact_p p1 = (contact_p)realloc(p, size);
if (p1){
p = p1;
fread(p->list, p->cap*sizeof(person_t),1,fp);
*ctpp = p;
return 1;
}
else{
return 0;
}
}
else{
return 0;
}
}
void InitContactDefault(contact_pp ctpp)
{
*ctpp = malloc(sizeof(contact_t)+sizeof(person_t)*LIST_DEFAULT);
if (NULL == *ctpp){
printf("%s: %d\n)", strerror(errno), errno);
exit(1);//终止程序
}
(*ctpp)->cap = LIST_DEFAULT;
(*ctpp)->size = 0;
printf("debug: Init Contact Success!\n");
}
void AddPerson(contact_pp ctpp)
{
if (!IsFull(*ctpp) || IncContact(ctpp)){
person_p p = &((*ctpp)->list[(*ctpp)->size]);
printf("Please Enter Name: ");
scanf("%s", p->name);
printf("Please Enter Sex: ");
scanf(" %c", &(p->sex));
printf("Please Enter Age: ");
scanf(" %u", &(p->age));
printf("Please Enter Telphone: ");
scanf(" %s", p->telphone);
printf("Please Enter Address: ");
scanf(" %s", p->address);
(*ctpp)->size++;
}
else{
printf("Realloc Error!\n");
return;
}
}
void ShowContact(contact_p ct)
{
int top = ct->size;
int i = 0;
person_p p = ct->list;
for (; i < top; i++){
printf("姓名: %-6s性别: %-3c年龄: %-3d电话: %-12s住址: %-16s\n",\
p[i].name, p[i].sex,p[i].age, p[i].telphone,p[i].address);
}
}
void SortContact(contact_p ct)
{
person_p p = ct->list;
qsort(p, ct->size, sizeof(person_t), person_cmp);
}
void SearchPerson(contact_p ct)
{
assert(ct);
char name[NAME_SIZE] = { 0 };
int ret = 0;
printf("Please Enter The Name Of The User You Are Looking For: ");
scanf(" %s", name);
ret = FindName(ct, name);
if (-1 != ret){
printf("姓名: %-6s性别: %-3c年龄: %-3d电话: %-12s住址: %-16s\n", \
ct->list[ret].name, ct->list[ret].sex, ct->list[ret].age, \
ct->list[ret].telphone, ct->list[ret].address);
}
else{
printf("Sorry,Don not hava this user!\n");
}
}
void ModPerson(contact_pp ctpp)
{
assert(*ctpp);
char name[NAME_SIZE] = { 0 };
int ret = 0;
printf("Please Enter The Name Of The User You Want To Modify: ");
scanf(" %s", name);
ret = FindName(*ctpp, name);
if (-1 != ret){
person_p p = &((*ctpp)->list[ret]);
printf("Please Enter Name: ");
scanf("%s", p->name);
printf("Please Enter Sex: ");
scanf(" %c", &(p->sex));
printf("Please Enter Age: ");
scanf(" %u", &(p->age));
printf("Please Enter Telphone: ");
scanf(" %s", p->telphone);
printf("Please Enter Address: ");
scanf(" %s", p->address);
printf("Modify Success!\n");
}
else{
printf("No Such User!\n");
}
}
void DelPerson(contact_pp ctpp)
{
assert(*ctpp);
char name[NAME_SIZE] = { 0 };
int ret = 0;
int i = 0;
printf("Please Enter The Name Of The User You Want To Deleted: ");
scanf(" %s", name);
ret = FindName(*ctpp, name);
if (-1 != ret){
Swap(&(*ctpp)->list[ret], &(*ctpp)->list[(*ctpp)->size-1]);
(*ctpp)->size--;
//for (i = ret; i < (*ctpp)->size; i++){
// (*ctpp)->list[i] = (*ctpp)->list[i+1];
//}
//(*ctpp)->size--;
printf("Deleted Success!\n");
}
else{
printf("No Such User!\n");
}
}
//此处清空通讯录后并没有恢复通讯录原来的长度
void ClearPerson(contact_pp ctpp)
{
(*ctpp)->size = 0;
printf("Clear Success!\n");
return;
}
void Save(contact_p ct)
{
FILE *fp = fopen(CT_FILE, "wb");
if (NULL == fp){
printf("Fopen Erroe!\n");
return;
}
fwrite(ct, sizeof(contact_t)+sizeof(person_t)*ct->cap, 1, fp);
fclose(fp);
}
int Load(contact_pp ctpp)
{
FILE *fp = fopen(CT_FILE, "rb");
if (NULL == fp){
printf("Init Contact Default!\n");
InitContactDefault(ctpp);
return 0;
}
int ret = InitContactFile(ctpp, fp);
fclose(fp);
return ret;
}
测试 main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
int main()
{
int select = 0;
volatile int quit = 0;//保持内存的可见性
contact_p ct;
Load(&ct);
while (!quit){
menu();
scanf("%d",&select);
switch (select){
case 1:
ShowContact(ct);
break;
case 2:
AddPerson(&ct);
break;
case 3:
DelPerson(&ct);
break;
case 4:
ModPerson(&ct);
break;
case 5:
SearchPerson(ct);
break;
case 6:
SortContact(ct);
break;
case 7:
ClearPerson(&ct);
break;
case 8:
Save(ct);
printf("Save!\n");
quit = 1;
break;
default:
printf("Your Enter Error!\n");
break;
}
}
system("pause");
return 0;
}