通讯录的实现(动态实现)
来源:互联网 发布:搜狗拼音去广告优化版 编辑:程序博客网 时间:2024/06/05 17:52
在静态实现1000人通讯录的基础上,这次我们来动态实现,可以动态开辟内存空间,不受人数的限制,但此处的不受限制是相对的,如果内存用完了,那也不能再添加联系人了;
这次我们在静态实现的基础上再次优化,使用了枚举,以及对每次执行完一个功能时的页面进行优化,让使用者不再麻烦的去看最顶上的操作目录;
首先定义了头文件: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!!!
0 0
- 通讯录的动态实现
- 动态通讯录的实现
- 通讯录的实现(动态实现)
- 实现动态版本通讯录(在简易通讯录的基础上)
- 通讯录(二)----动态实现
- 通讯录2.0(动态实现)
- 【C语言】实现一个通讯录(二:动态的实现)
- 动态存储实现通讯录
- 通讯录动态实现
- 模拟实现通讯录-动态
- 模拟实现动态通讯录
- 通讯录动态实现
- 模拟实现通讯录-动态的方法
- 实现动态内存分配的通讯录
- 使用动态内存分配的通讯录实现
- 模拟实现通讯录<二>(动态模拟)
- 模拟实现通讯录(动态方法)
- c语言实现动态通讯录
- UNIX网络编程:IPC之信号量
- 针对大数据的种子点生长——分块生长的策略
- 2016百度之星 资格赛 1003 Problem C 容器瞎搞
- 针对大数据的种子点生长——分块生长的策略
- [opencv]识别人脸和眼睛
- 通讯录的实现(动态实现)
- 哈希表的应用-浅析顶点聚簇网格简化算法的实现
- Android Drawable Resource目录-概要
- 浅议顶点焊接与哈希表的设计
- HTML5-video标签-实现点击预览图播放或暂停视频
- ToggleButton的使用
- 扑克牌的顺子
- 种子点生长算法下——三维种子点生长
- 解决easyDialog弹出框加载延时图片的时候不居中问题