实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
(容量这里使用动态内存实现)
可执行操作:
add 添加联系人信息
delete 删除指定联系人信息
search 查找指定联系人信息
modify 修改指定联系人信息
show 显示所有联系人信息
clear 清空所有联系人
sort 以名字排序所有联系人
这里动态实现的通讯录本质上是一种动态顺序表
操作指引部分使用枚举将输入于相应操作一一列举
增加代码可读性
enum option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,CLEAR
};
自定义结构体类型,存储联系人信息
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* data;int sz;//通讯录中有效信息的个数int capacity; //通讯录的容量
}Contact;
使用malloc申请动态内存空间,并使用memset将初始值置为0
void InitContact(Contact* pc)
{pc->data = (PeoInfo*)malloc(DEFAULT_SIZE * sizeof(PeoInfo));if (pc->data == NULL){printf("malloc fail\n");exit(-1);}else{memset(pc->data, 0, DEFAULT_SIZE * sizeof(PeoInfo));pc->sz = 0;}pc->capacity = DEFAULT_SIZE;//#define定义的初始容量
}
void AddContact(Contact* pc)
{CheckCapacity(pc);printf("请输入姓名->");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄->");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别->");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话->");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址->");scanf("%s", pc->data[pc->sz].addr);pc->sz++;
}
为使打印出的通讯录各列对齐,通过格式控制字符串调整对齐方式和域宽
void ShowContact(Contact* pc)
{printf("%-20s %-5s %-5s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s %-5d %-5s %-12s %-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}
通过输入判断删除项,封装一个FindByName函数通过输入的姓名返回其所处位置下标
FindByName后续操作也会经常用到
删除操作时,待删除位置的后数据以此前移一位即可实现删除
int FindByName(Contact* pc, char* str)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, str) == 0){return i;//找到返回位置下标}}return -1;//找不到返回-1
}void DeletContact(Contact* pc)
{char str[MAX_NAME] = { 0 };printf("请输入需删除的联系人姓名->");scanf("%s", str);int pos = FindByName(pc, str);while (pos < pc->sz - 1){//待删除位置的后数据以此前移一位即可实现删除pc->data[pos] = pc->data[pos + 1];pos++;}pc->sz--;
}
同样使用FindByName返回查找位置的下标
同时将查找的信息打印
void SearchContact(Contact* pc)
{char str[MAX_NAME] = { 0 };printf("请输入需查找的联系人姓名->");scanf("%s", str);int pos = FindByName(pc, str);printf("%-20s %-5s %-5s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-20s %-5d %-5s %-12s %-20s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);
}
一段又臭又长的输入输出函数
void ModifyContact(Contact* pc)
{char str[MAX_NAME] = { 0 };printf("请输入需修改的联系人姓名->");scanf("%s", str);int pos = FindByName(pc, str);printf("请输入姓名->");scanf("%s", pc->data[pos].name);printf("请输入年龄->");scanf("%d", &(pc->data[pos].age));printf("请输入性别->");scanf("%s", pc->data[pos].sex);printf("请输入电话->");scanf("%s", pc->data[pos].tele);printf("请输入地址->");scanf("%s", pc->data[pos].addr);printf("修改成功\n");ShowContact(pc);
}
使用qsort函数根据姓名进行排序,注意比较函数中的指针类型转换为(PeoInfo*)
int cmp_by_name(const void* p1, const void* p2)
{return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}void SortContact(Contact* pc)
{qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);printf("排序成功\n");ShowContact(pc);
}
傻瓜式清空
void ClearContact(Contact* pc)
{pc->sz = 0;printf("通讯录已清空\n");
}
此没有结合文件操作的通讯录完全是个半成品
上一篇:Linux chattr命令
下一篇:IO流之字节流