C语言实现简单通讯录
本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下
一、概述
通讯录的实现其中包括了指针、结构体、动态内存管理、文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子;
通讯录功能如下:
- 添加联系人
- 删除联系人
- 查找联系人
- 修改联系人
- 显示所有联系人
- 加载联系人
- 保存联系人
- 联系人排序
二、代码如下
contact.h
#ifndefCONTACT_H #defineCONTACT_H #defineNAME_MAX20 #defineSEX_MAX10 #defineTEL_MAX12 #defineADDR_MAX20 #defineMEMBER_MAX1 typedefstructinfo { charname[NAME_MAX]; charsex[SEX_MAX]; intage; chartele[TEL_MAX]; charaddr[ADDR_MAX]; }info; typedefstructcontact { info*data; intsize; intcapacity; }contact,*pcontact; //初始化通讯录 voidInitContact(pcontactlist); //添加联系人 voidAddContact(pcontactlist); //删除联系人 voidDellContact(pcontactlist); //查找联系人 voidFindContact(pcontactlist); //修改联系人 voidModContact(pcontactlist); //显示所有联系人 voidShowContact(pcontactlist); //联系人排序(选择法) voidSortContact(pcontactlist); //检查容量 intCheckSize(pcontactlist); //查找联系人在数组data第几个位置 intFindContactAddr(pcontactlist); //从文件中加载联系人到内存 voidLoadContact(pcontactlist); //将联系人从内从中保存到文件 voidSaveContact(pcontactlist); #endif
contact.c
#include#include #include #include"contact.h" //初始化通讯录 voidInitContact(pcontactlist) { list->data=(info*)malloc(sizeof(info)*MEMBER_MAX); list->size=0; list->capacity=MEMBER_MAX; //每次初始化是加载一遍文件,防止最新录入的在保存在文件时覆盖上次 //打开程序时保存的信息 LoadContact(list); } //添加联系人 voidAddContact(pcontactlist) { infotmp_member; if(CheckCapacity(list)==0) { printf("成员已满,添加失败!"); return; } printf("请输入姓名:"); scanf("%s",tmp_member.name); printf("请输入性别:"); scanf("%s",tmp_member.sex); printf("请输入年龄:"); scanf("%d",&tmp_member.age); printf("请输入电话:"); scanf("%s",tmp_member.tele); printf("请输入地址:"); scanf("%s",tmp_member.addr); list->data[list->size]=tmp_member; printf("添加成功!\n"); list->size++; } //删除联系人 voidDellContact(pcontactlist) { chartmp_name[NAME_MAX]={0}; intret=0; printf("请输入姓名:"); scanf("%s",tmp_name); ret=FindContactAddr(list,tmp_name); if(ret==-1) { printf("无此联系人!\n"); return; } for(ret;ret size-1;ret++) { list->data[ret]=list->data[ret+1]; } printf("删除成功!\n"); list->size--; } //查找联系人 voidFindContact(pcontactlist) { chartmp_name[NAME_MAX]={0}; printf("请输入姓名:"); scanf("%s",tmp_name); for(inti=0;i size;i++) { if(strcmp(tmp_name,list->data[i].name)==0) { printf("===============================\n"); printf("姓名:%s\n",list->data[i].name); printf("性别:%s\n",list->data[i].sex); printf("年龄:%d\n",list->data[i].age); printf("电话:%s\n",list->data[i].tele); printf("地址:%s\n",list->data[i].addr); printf("===============================\n"); return; } } printf("无此联系人!\n"); } //查找联系人在数组data第几个位置 intFindContactAddr(pcontactlist,char*tmp_name) { for(inti=0;i size;i++) { if(strcmp(tmp_name,list->data[i].name)==0) returni; } return-1; } //修改联系人 voidModContact(pcontactlist) { infotmp_member; intret=0; printf("请输入姓名:"); scanf("%s",tmp_member.name); ret=FindContactAddr(list,tmp_member.name); if(ret==-1) { printf("无此联系人!\n"); return; } printf("请输入性别:"); scanf("%s",tmp_member.sex); printf("请输入年龄:"); scanf("%s",&tmp_member.age); printf("请输入电话:"); scanf("%s",tmp_member.tele); printf("请输入地址:"); scanf("%s",tmp_member.addr); list->data[ret]=tmp_member; printf("修改成功!\n"); } //联系人排序(选择法) voidSortContact(pcontactlist) { infotmp_member; for(inti=0;i size-2;i++) { for(intj=1;j size-1;j++) { if(strcmp(list->data[i].name,list->data[j].name)>0) { tmp_member=list->data[i]; list->data[i]=list->data[j]; list->data[j]=tmp_member; } } } } //检查上次动态开辟的空间是否够用,不够时继续开辟 intCheckCapacity(pcontactlist) { if(list->size==list->capacity) { info*tmp=(info*)malloc(sizeof(info)*(list->capacity+10)); if(tmp==NULL) return0; memcpy(tmp,list->data,sizeof(info)*list->size); free(list->data); list->data=tmp; list->capacity+=10; } return1; } //显示所有联系人 voidShowContact(pcontactlist) { for(inti=0;i size;i++) { printf("============第%d位==============\n",i+1); printf("姓名:%s\n",list->data[i].name); printf("性别:%s\n",list->data[i].sex); printf("年龄:%d\n",list->data[i].age); printf("电话:%s\n",list->data[i].tele); printf("地址:%s\n",list->data[i].addr); printf("===============================\n"); } } //从文件中加载联系人到内存 voidLoadContact(pcontactlist) { infotmp_member; FILE*pf=NULL; pf=fopen("./contatc.dat","rb"); if(pf==NULL) perror("fopenerror"); //按照内存块读取,一次读1块,1块大小是sizeof(info) while(fread(&tmp_member,sizeof(info),1,pf)) { if(CheckCapacity(list)) { list->data[list->size]=tmp_member; list->size++; } } if(pf!=NULL) { fclose(pf); pf=NULL; printf("加载成功!\n"); } } //将联系人从内从中保存到文件 voidSaveContact(pcontactlist) { FILE*pf=NULL; pf=fopen("./contatc.dat","wb"); if(pf==NULL) perror("fopenerror"); for(inti=0;i size;i++) { //按照内存块写入,一次写1块,1块大小是sizeof(info) fwrite(list->data+i,sizeof(info),1,pf); } if(pf!=NULL) { fclose(pf); pf=NULL; printf("保存成功!\n"); } }
test.c
#define_CRT_SECURE_NO_WARNINGS #include#include"contact.h" enumopt { Exit, Add, Dell, Find, Mod, Show, Load, Save, Sort, }; voidmenu(void) { printf("/*========================通讯录======================*/\n"); printf("/*=0.退出通讯录1.添加联系人=*/\n"); printf("/*=2.删除联系人3.查找联系人=*/\n"); printf("/*=4.修改联系人5.显示所有联系人=*/\n"); printf("/*=6.加载联系人7.保存联系人=*/\n"); printf("/*=8.联系人排序=*/\n"); printf("/*====================================================*/\n"); } voidTestContact(void) { contactpc; InitContact(&pc); intopt=0; do { menu(); printf("请选择:>"); scanf("%d",&opt); switch(opt) { caseExit: printf("退出系统...\n"); break; caseAdd: AddContact(&pc); break; caseDell: DellContact(&pc); break; caseFind: FindContact(&pc); break; caseMod: ModContact(&pc); break; caseShow: ShowContact(&pc); break; caseLoad: LoadContact(&pc); break; caseSave: SaveContact(&pc); break; caseSort: SortContact(&pc); break; default: printf("输入选项有误,重新输入!\n"); break; } }while(opt); } intmain(void) { TestContact(); printf("\n"); system("pause"); return0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。