简易的通信录-完成增删查找

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
 
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_TELE 12
#define MAX_ADDR 20
#define MAX 100       //通讯录总容量
#define INIT_CAPACITY 3 //初始通讯录大小
#define INC_CAPACITY 5  //每次扩容大小
#define CONTACT_FILE_NAME "contact.dat" 
//要在工程目录下创建文件
 
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
 
typedef struct Contact
{
PeoInfo *peo;
int count;  //联系人数量
int capacity;  //当前最大容量
}Contact;
 
void init_contact(Contact *pcon);
void add_contact(Contact *pcon);
void del_contact(Contact *pcon);
void search_contact(Contact *pcon);
void modify_contact(Contact *pcon);
void show_contact(Contact *pcon);
void clear_contact(Contact *pcon);
void sort_contact(Contact *pcon);
void save_contact(Contact *pcon);


contact


#include "contact.h"
 
static void import(Contact *pcon, PeoInfo *ppeo)
{
assert(pcon);
if (pcon->count + 1 > pcon->capacity)
{
//这里动态分配
if (pcon->capacity + INC_CAPACITY <= MAX)
{
pcon->peo = (PeoInfo *)realloc(pcon->peo, (pcon->capacity + INC_CAPACITY) * sizeof(PeoInfo));
pcon->capacity += INC_CAPACITY;
}
else
{
pcon->peo = (PeoInfo *)realloc(pcon->peo, MAX * sizeof(PeoInfo));
pcon->capacity = MAX;
}
}
 
pcon->peo[pcon->count] = *ppeo;
pcon->count++;
}
 
void init_contact(Contact *pcon)
{
assert(pcon);
PeoInfo buf;
FILE *pfRead = fopen(CONTACT_FILE_NAME, "r");
if (pfRead == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pcon->peo = (PeoInfo *)malloc(INC_CAPACITY * sizeof(PeoInfo));
pcon->count = 0;
pcon->capacity = INIT_CAPACITY;
 
while (fread(&buf, sizeof(PeoInfo), 1, pfRead))
{
import(pcon, &buf);
}
fclose(pfRead);
}
 
 
void add_contact(Contact *pcon)
{
assert(pcon);
if (pcon->count + 1 > pcon->capacity)
{
if (pcon->capacity == MAX)
{
printf("电话本已满!无法添加。n");
return;
}
//这里动态分配
if (pcon->capacity + INC_CAPACITY <= MAX)
{
pcon->peo = (PeoInfo *)realloc(pcon->peo, (pcon->capacity + INC_CAPACITY) * sizeof(PeoInfo));
pcon->capacity += INC_CAPACITY;
}
else
{
pcon->peo = (PeoInfo *)realloc(pcon->peo, MAX * sizeof(PeoInfo));
pcon->capacity = MAX;
}
}

printf("name>");
scanf("%s", pcon->peo[pcon->count].name);
printf("age>");
scanf("%d", &pcon->peo[pcon->count].age);
printf("sex>");
scanf("%s", pcon->peo[pcon->count].sex);
printf("tele>");
scanf("%s", pcon->peo[pcon->count].tele);
printf("addr>");
scanf("%s", pcon->peo[pcon->count].addr);
pcon->count++;
printf("添加成功!n");
}
 
static int find_entry(Contact *pcon, const char *find_name)  //查找返回下标
{
assert(pcon);
assert(find_name);
int i = 0;
for (i = 0; i < pcon->count; i++)
{
if (strcmp(pcon->peo[i].name, find_name) == 0)
{
return i;
}
}
return -1;  //没找到
}
 
void del_contact(Contact *pcon)
{
assert(pcon);
char name[MAX_NAME];
int ret = 0;
int i = 0;
printf("请输入要删除人的名字>");
scanf("%s", name);
ret = find_entry(pcon, name);
if (ret == -1)
{
printf("要删除的人不存在!n");
return;
}
//删除操作
for (i = ret; i < pcon->count - 1; i++)  //减1防止越界
{
pcon->peo[i] = pcon->peo[i + 1];
}
pcon->count--;
printf("删除完成!n");
}
void search_contact(Contact *pcon)
{
assert(pcon);
char name[MAX_NAME];
int ret = 0;
int i = 0;
printf("请输入要查找人的名字>");
scanf("%s", name);
ret = find_entry(pcon, name);
if (ret == -1)
{
printf("要查找的人不存在!n");
return;
}
printf("%10s  %4d  %4s  %12s  %12sn",
pcon->peo[ret].name,
pcon->peo[ret].age,
pcon->peo[ret].sex,
pcon->peo[ret].tele,
pcon->peo[ret].addr);
}
void modify_contact(Contact *pcon)
{
assert(pcon);
char name[MAX_NAME];
int ret = 0;
int i = 0;
printf("请输入要修改人的名字>");
scanf("%s", name);
ret = find_entry(pcon, name);
if (ret == -1)
{
printf("要修改的人不存在!n");
return;
}
printf("age>");
scanf("%d", &pcon->peo[ret].age);
printf("sex>");
scanf("%s", pcon->peo[ret].sex);
printf("tele>");
scanf("%s", pcon->peo[ret].tele);
printf("addr>");
scanf("%s", pcon->peo[ret].addr);
//修改后查找下
search_contact(pcon);
}
void show_contact(Contact *pcon)
{
assert(pcon);
printf("%10s  %4s  %4s  %12s  %12sn",
"name", "age", "sex", "tele", "addr");
int i = 0;
for (i = 0; i < pcon->count; i++)
{
printf("%10s  %4d  %4s  %12s  %12sn",
pcon->peo[i].name,
pcon->peo[i].age,
pcon->peo[i].sex,
pcon->peo[i].tele,
pcon->peo[i].addr);
}
}
void clear_contact(Contact *pcon)
{
assert(pcon);
pcon->count = 0;
//清空后输出下
show_contact(pcon);
}
void sort_contact(Contact *pcon)
{
assert(pcon);
int i = 0;
int j = 0;
for (i = 0; i < pcon->count - 1; i++)
{
for (j = 0; j < pcon->count - 1 - i; j++)
{
if (strcmp(pcon->peo[j].name, pcon->peo[j + 1].name) > 0)
{
PeoInfo tmp = pcon->peo[j];
pcon->peo[j] = pcon->peo[j + 1];
pcon->peo[j + 1] = tmp;
}
}
}
//排序完输出下
show_contact(pcon);
}
 
void save_contact(Contact *pcon)
{
FILE *pfWrite = fopen(CONTACT_FILE_NAME, "w");
if (pfWrite == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
int i = 0;
for (i = 0; i < pcon->count; i++)
{
fwrite(&pcon->peo[i], sizeof(PeoInfo), 1, pfWrite);
}
fclose(pfWrite);
}


test.c
#include "contact.h"
 
enum OP
{
EXIT,
ADD,
DEL,
SHOW,
SEARCH,
MODIFY,
CLEAR,
SORT
};
 
void menu()
{
printf("***************************************************n");
printf("**********1.add  2.del  3.show  4.search***********n");
printf("*****5.modify  6.clear  7.sort  0.save & exit******n");
printf("***************************************************n");
}
void tect()
{
Contact mycon;
init_contact(&mycon);
int input = 1;
while (input)
{
menu();
printf("请输入>");
scanf("%d", &input);
system("cls");  //此时清一下屏
switch (input)
{
case ADD:
add_contact(&mycon);
break;
case DEL:
del_contact(&mycon);
break;
case SHOW:
show_contact(&mycon);
break;
case SEARCH:
search_contact(&mycon);
break;
case MODIFY:
modify_contact(&mycon);
break;
case CLEAR:
clear_contact(&mycon);
break;
case SORT:
sort_contact(&mycon);
break;
case EXIT:
save_contact(&mycon);
free(mycon.peo); //回收内存
exit(0);
break;
}
 
}
}
 
int main()
{
tect();
return 0;
}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值