通讯录的实现(动态实现)
2016-05-17 00:56
351 查看
在静态实现1000人通讯录的基础上,这次我们来动态实现,可以动态开辟内存空间,不受人数的限制,但此处的不受限制是相对的,如果内存用完了,那也不能再添加联系人了;
这次我们在静态实现的基础上再次优化,使用了枚举,以及对每次执行完一个功能时的页面进行优化,让使用者不再麻烦的去看最顶上的操作目录;
首先定义了头文件:contacts.h
然后建立test1.c文件:
test2.c
这次我们在静态实现的基础上再次优化,使用了枚举,以及对每次执行完一个功能时的页面进行优化,让使用者不再麻烦的去看最顶上的操作目录;
首先定义了头文件:contacts.h
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <memory.h> #define MAX 2 #define NAME_LENGTH 20 #define SEX_LENGTH 5 #define AGE_LENGTH 3 #define TELE_LENGTH 20 #define ADDR_LENGTH 30 /* 结构体 用于储存通讯录人员信息 */ typedef struct ContactsUser { char name[NAME_LENGTH]; char sex[SEX_LENGTH]; /* VS编译器下scanf_s对于长度有安全保护 因此采用字符数组保存年龄 */ char age[AGE_LENGTH]; char tele[TELE_LENGTH]; char addr[ADDR_LENGTH]; }ContactsUser; // // 结构体 将上一个结构体装起来 同时创建变量记录人数 // typedef struct Contacts { ContactsUser *person; int user_count;//确定当前容量 int capa;//电话本容量,动态 }Contacts,*pContacts; enum op { EXIT, ADD, DELE, CLEAR, FID, MODIFY, SHOW, SORT }; //typedef struct Contacts *pContacts; int add_contacts(pContacts pcon);//添加函数 int dele_contacts(pContacts pcon);//删除函数 int clear_contacts(pContacts pcon);//清空函数 int find_contacts(pContacts pcon);//查找函数 int modify_contacts(pContacts pcon);//修改函数 void sort_contacts(pContacts pcon);//排序函数 void show_contacts(pContacts pcon);//显示函数 void check(pContacts pcon); void menu();//主菜单
然后建立test1.c文件:
#include "contacts.h" void menu() { printf("------------ 服务菜单 ---------------\n"); printf("-------------------------------------\n"); printf(" 1.添加联系人\n"); printf(" 2.删除联系人\n"); printf(" 3.清空联系人\n"); printf(" 4.查找联系人\n"); printf(" 5.修改联系人\n"); printf(" 6.显示所有联系人\n"); printf(" 7.排序联系人\n"); printf(" 0.退出\n"); printf("-------------------------------------\n"); } /* 查询实体函数 用于将输入的用户特征和储存进行比较(strcmp) 方便其他功能函数的调用 */ int find_entry(pContacts pcon) { int i = 0; char name[NAME_LENGTH]; printf("请输入名字:"); scanf_s("%s", name,NAME_LENGTH); for (i = 0; i < pcon->user_count; i++) { if (strcmp(pcon->person[i].name, name) == 0) //输入和存储进行比较 { return i; } } return -1; } /* 增添函数 */ int add_contacts(pContacts pcon) { if (pcon->user_count==pcon->capa) { ContactsUser *tmp = (ContactsUser*)realloc (pcon->person,(pcon->capa +3)*sizeof(ContactsUser)); if(tmp == NULL) { printf("内存不足\n"); return -1; } else { pcon->person = tmp; (pcon->capa)+= 3; return 1; } } else { printf("请输入名字:"); /* scanf_s安全函数 应该添加控制长度的参数 */ scanf_s("%s", pcon->person[pcon->user_count].name, NAME_LENGTH); /* 数组从下标为0到下标为user_count-1 ,则在user_count处操作 */ printf("请输入性别:"); scanf_s("%s", pcon->person[pcon->user_count].sex, SEX_LENGTH); printf("请输入年龄:"); scanf_s("%s", pcon->person[pcon->user_count].age, AGE_LENGTH); printf("请输入电话:"); scanf_s("%s", pcon->person[pcon->user_count].tele,TELE_LENGTH); printf("请输入地址:"); scanf_s("%s", pcon->person[pcon->user_count].addr, ADDR_LENGTH); printf("添加成功!\n"); pcon->user_count++;//添加结束 人员数目增加1 return 1; } } /* 删除函数 */ int dele_contacts(pContacts pcon) { int i = 0; int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置 if (ret != -1) { for (i = ret; i < pcon->user_count - 1; i++) { pcon->person[i] = pcon->person[i + 1]; } printf("删除成功!\n"); pcon->user_count--; return 1; } else { printf("找不到联系人\n"); return -1; } } /* 清空函数 */ int clear_contacts(pContacts pcon) { /*memset(pcon->person,0,MAX);*/ /* memset函数 在一段内存中填充给定的值 是对较大结构体或数组清零的最快方法 */ pcon->user_count = 0;//count 赋值0 进行清零 printf("清空成功!"); return 1; } /* 查找函数 */ int find_contacts(pContacts pcon) { int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置 if (ret != -1) { printf("该联系人的信息为:\n"); printf("姓名:%-5s\n", pcon->person[ret].name, NAME_LENGTH); printf("性别:%-5s\n", pcon->person[ret].sex, SEX_LENGTH); printf("年龄:%-5s\n", pcon->person[ret].age, AGE_LENGTH); printf("电话:%-5s\n", pcon->person[ret].tele, TELE_LENGTH); printf("地址:%-5s\n", pcon->person[ret].addr, ADDR_LENGTH); return 1; } else { printf("找不到该联系人\n"); return -1; } } /* 修改函数 */ int modify_contacts(pContacts pcon) { int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置 if (ret != -1) { printf("请重新编辑该联系人信息:\n"); printf("请输入姓名:"); scanf_s("%s", pcon->person[ret].name, NAME_LENGTH); printf("请输入性别:"); scanf_s("%s", pcon->person[ret].sex, SEX_LENGTH); printf("请输入年龄:"); scanf_s("%s", pcon->person[ret].age, AGE_LENGTH); printf("请输入电话:"); scanf_s("%s", pcon->person[ret].tele, TELE_LENGTH); printf("请输入地址:"); scanf_s("%s", pcon->person[ret].addr, ADDR_LENGTH); printf("修改成功!"); return 1; } else { printf("找不到该联系人\n"); return -1; } } /* 显示函数 */ void show_contacts(pContacts pcon) { int i = 0; printf("%10s\t%4s\t%3s\t%13s\t%10s\n","姓名","性别","年龄","电话","地址"); for (i = 0;i< pcon->user_count;i++) { printf("%10s\t%4s\t%3s\t%13s\t%10s\n", pcon->person[i].name, pcon->person[i].sex, pcon->person[i].age,pcon->person[i].tele, pcon->person[i].addr); } printf("\n"); } //排序函数 void sort_contacts(pContacts pcon) { int i=0; int j=0; for(i=0;i<(pcon->user_count-1);i++) { for(j=0;j<(pcon->user_count-1)-i;j++) { if((strcmp(pcon->person[j].name,pcon->person[j+1].name))>0) { ContactsUser tmp=pcon->person[j]; pcon->person[j]=pcon->person[j+1]; pcon->person[j+1]=tmp; } } } printf("排序完成!"); }
test2.c
#include "contacts.h" /* 主函数 */ int main() { int input = 1;//定义一个输入初始化 Contacts user = {0}; user.capa = MAX; user.user_count = 0;//为user_count进行初始化 user.person = (ContactsUser*)malloc(sizeof(ContactsUser)*MAX); if(user.person==NULL) { printf("内存不足\n"); } else { menu(); while (input) { printf("\n 请选择数字编号:\n"); scanf("%d", &input); switch (input) //switch-case 使用不同的功能函数 { case ADD: add_contacts(&user); menu(); break; case DELE: dele_contacts(&user); menu(); break; case CLEAR: clear_contacts(&user); menu(); break; case FID: find_contacts(&user); menu(); break; case MODIFY: modify_contacts(&user); menu(); break; case SHOW: show_contacts(&user); menu(); break; case SORT: show_contacts(&user); menu(); break; case EXIT: printf("感谢使用!\n"); break; default: printf("输入有误!\n"); break; } } } free(user.person); user.person=NULL; return 0; }ok!!!come on!!!
相关文章推荐
- [opencv]识别人脸和眼睛
- SM2算法第十篇:数字证书及CA的扫盲介绍
- 针对大数据的种子点生长——分块生长的策略
- 2016百度之星 资格赛 1003 Problem C 容器瞎搞
- 针对大数据的种子点生长——分块生长的策略
- 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
- 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
- MySQL数据类型和常用字段属性总结
- App Service&cloud-services
- 图像数据到网格数据-3——Cuberille算法
- Google:坚决杀死Flash
- 图像数据到网格数据-2——改进的SMC算法
- CoherentNoise(相干噪声)
- Java基础中常犯的一些细节上的错误
- 24. Swap Nodes in Pairs [easy]
- Hongyang 生命不息,奋斗不止,万事起于忽微,量变引起质变 目录视图 摘要视图 订阅 Android 属性动画(Property Animation) 完全解析 (上)
- 2016/05/17 thinkphp3.2.2 分页的使用:①在Home下设置Publics文件夹或在thinkPHP下library的vender 把page.class.php 考贝进入 ②通过new 实例化方式调用 $page=new \Home\Publics\Page($total,3);
- 第一个月总结(2016-04-18到2016-05-17)
- MapReduce中使用SequenceFile的方式上传文件到集群中
- RecyclerView Part 1:为ListView专家写的基础