C语言实现通讯录系统——容量自增,文件版本

来源:互联网 发布:潍坊行知学校是高中吗 编辑:程序博客网 时间:2024/05/29 19:12


     头文件maillist.h


#ifndef _MAILLIST_H_#define _MAILLIST_H_#include<stdio.h>#include<windows.h>#include<assert.h>#define INIT_MAIL_SIZE 64          //定义宏表示通讯录容量#define INC_SIZE 64             //宏表示自增容量#define FILE_NAME "maillistFile.txt"    #pragma warning (disable:4996)typedef struct person   //结构体变量,指针,二级指针。表示人的姓名等信息{char name[32];char sex[4];char age[4];char tel[16];char address[64];}person_t, *person_p, **person_pp;typedef struct mail    //结构体变量,指针,二级指针。表示通讯录相关信息{int size;int cap;person_p maillist;}mail_t, *mail_p, **mail_pp;//相关函数的声明void menu();void initMail(mail_pp m);void addMail(mail_p m, person_p p);void deleteMail(mail_p m);void findMail(mail_p m);void changeMail(mail_p m);void desplayMail(mail_p m);void clearMail(mail_p m);void nameSort(mail_p m);void desdoryMail(mail_p m);int fileStore(mail_p m);int fileLoad(mail_p m);#endif 

     函数实现maillist.c

#include "maillist.h"    //引入头文件//内部static函数,判断通讯录,满返回1,否则返回0static int isMailFull(mail_p m){assert(m); //断言return m->size >= m->cap ? 1 : 0;}//判断通讯录,为空时返回1,否则返回0static int isMailEmpty(mail_p m){assert(m);if (m->size == 0){printf("Your maillist is empty!\n");return 1;}return 0;}//通讯录容量自增函数static int incMail(mail_p m){assert(m);person_p p = realloc(m->maillist, (m->cap + INC_SIZE)*sizeof(person_t));if (NULL == p){perror("realloc");return 0;}m->maillist = p;m->cap += INC_SIZE;printf("inc success!\n");return 1;}//字符串比较static int strCmp(const void* x, const void* y){return strcmp((*(person_p)x).name, (*(person_p)y).name);}//交换结构体变量static void swap(person_p x, person_p y){person_t tmp = *x;*x = *y;*y = tmp;}//界面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");printf("*************************************************************\n");}//初始化通讯录,并用malloc函数为之分配空间void initMail(mail_pp m){assert(m);*m = (mail_p)malloc(sizeof(mail_t));if (NULL == *m){//判断内存分配是否成功perror("malloc");exit(1);}(*m)->maillist = (person_p)malloc(sizeof(person_t)*INIT_MAIL_SIZE);if (NULL == (*m)->maillist){perror("malloc");exit(2);}(*m)->cap = INIT_MAIL_SIZE;(*m)->size = 0;fileLoad(*m);}int fileLoad(mail_p m){assert(m);FILE* fp = fopen(FILE_NAME, "rb");if (NULL == fp){perror("fopen");return -2;}person_t p;while (1){fread(&p, sizeof(person_t), 1, fp);if (feof(fp)){break;}addMail(m, &p);}fclose(fp);return 0;}int fileStore(mail_p m){assert(m);FILE* fp = fopen(FILE_NAME, "wb");if (NULL == fp){perror("fopen");return -1;}int i = 0;for (i = 0; i < m->size; i++){fwrite(m->maillist + i, sizeof(person_t), 1, fp);}fclose(fp);return 0;}//销毁分配的内存空间void desdoryMail(mail_p m){assert(m);fileStore(m);//文件存储free(m->maillist);m->maillist = NULL;free(m);m = NULL;}//添加联系人void addMail(mail_p m, person_p p){assert(m);if ((!isMailFull(m)) || incMail(m)){int pos = m->size;m->maillist[pos] = *p;m->size++;}}
//删除联系人void deleteMail(mail_p m){assert(m);if (!isMailEmpty(m)){char name[32];printf("Please input the name maillist you delete : ");scanf("%s", name);int i = 0;for (i = 0; i < m->size; i++){if (strcmp(m->maillist[i].name, name) == 0){swap(m->maillist + i, m->maillist + m->size - 1);m->size--;}}if (i == m->size){printf("no man!\n");}}}//查找void findMail(mail_p m){assert(m);if (!isMailEmpty(m)){char name[32];printf("Please input the name of maillist you find : ");scanf("%s", name);int i = 0;for (i = 0; i < m->size; i++){if (strcmp(m->maillist[i].name, name) == 0){printf("name\tsex\tage\ttel\t\taddress\n");printf("%s\t%s\t%s\t%s\t%s\n", m->maillist[i].name, m->maillist[i].sex,m->maillist[i].age, m->maillist[i].tel, m->maillist[i].address);break;}}if (i == m->size){printf("no man!\n");}}}//修改void changeMail(mail_p m){assert(m);if (!isMailEmpty(m)){printf("Please input the name of list you want to change ->");char name[32];scanf("%s", name);int i;for (i = 0; i < m->size; i++){if (strcmp(name, m->maillist[i].name) == 0){again:printf("Please input message you want to change(name|sex|age|tel|address)->");char input[16];char change[64];scanf("%s", input);if (strcmp(input, "name") == 0){printf("Please input new name ->");scanf("%s", change);strcpy(m->maillist[i].name, change);}else if (strcmp(input, "sex") == 0){printf("Please input sex ->");scanf("%s", change);strcpy(m->maillist[i].sex, change);}else if (strcmp(input, "age") == 0){printf("Please input age ->");scanf("%s", change);strcpy(m->maillist[i].age, change);}else if (strcmp(input, "tel") == 0){printf("Please input new tel ->");scanf("%s", change);strcpy(m->maillist[i].tel, change);}else if (strcmp(input, "address") == 0){printf("Please input new address ->");scanf("%s", change);strcpy(m->maillist[i].address, change);}else{goto again;}printf("Congratulationgs,you successed changemessage!\n");printf("Are you want to changed again?(Y|N)\n");char s = 0;getchar();scanf("%c", &s);if ((s == 'y') || (s == 'Y')){goto again;}else{break;}}}if (i == m->size){printf("no man\n");}}}//显示全部联系人void desplayMail(mail_p m){assert(m);if (!isMailEmpty(m)){printf("name\tsex\tage\ttel\t\taddress\n");int i = 0;for (i = 0; i < m->size; i++){printf("%s\t%s\t%s\t%s\t%s\n", m->maillist[i].name, m->maillist[i].sex,m->maillist[i].age, m->maillist[i].tel, m->maillist[i].address);}}}//清空联系人void clearMail(mail_p m){assert(m);if (!isMailEmpty(m)){m->size = 0;printf("clear mailist success!\n");}}//以名字排序所有联系人void nameSort(mail_p m){assert(m);if (!isMailEmpty(m)){qsort(m->maillist, m->size, sizeof(person_t), strCmp);}desplayMail(m);}

     测试main.c

#include "maillist.h"//添加联系人static void myAddMail(mail_p m){assert(m);person_t p;printf("name\tsex\tage\ttel\t\taddress\n");scanf("%s %s %s %s %s", &p.name, &p.sex, &p.age, &p.tel, &p.address);addMail(m, &p);printf("Congratulations,you successed addMessage!\n");}int main(){mail_p mymail = NULL;initMail(&mymail);int input = 0;int done = 0;menu();while (!done){printf("Please choose <0—7> : ");scanf("%d", &input);switch (input){//选择对通讯录进行的操作case 0:printf("bye~\n");done = 1;break;case 1:myAddMail(mymail);break;case 2:deleteMail(mymail);break;case 3:findMail(mymail);break;case 4:changeMail(mymail);break;case 5:desplayMail(mymail);break;case 6:clearMail(mymail);break;case 7:nameSort(mymail);break;default:printf("error input!\n");break;}}desdoryMail(mymail);system("pause");return 0;}


        如有错误,欢迎指出!







0 0
原创粉丝点击