c语言通讯录的简单实现文件版本(动态开辟内存)

来源:互联网 发布:小辣椒4g3g2g网络选择 编辑:程序博客网 时间:2024/05/18 01:19


一、通讯录功能分为以下模块:

a)信息创建模块:对信息进行录入,通过进行相关操作,保存所需的文件;

b)信息查询:在信息载入和信息创建的前提下,对某人的信息进行查询;

c)信息修改:在信息载入和信息创建的前提下,对需更改信息的某人进行修改;

d)信息删除:在信息载入和信息创建的前提下,对某人的信息进行删除;

e)信息显示:在信息载入和信息创建的前提下,显示出系统所有人的信息;

f )信息排序:在信息载入和信息创建的前提下,根据姓名对通讯录排序;

g)清空信息:在信息载入和信息创建的前提下,清空通讯录;

h)保存信息:在信息载入和信息创建的前提下,对通讯录进行相关的编辑后,保存所需的文件;

i)退出程序:退出该程序,结束程序运行。


二、代码分为三部分:头文件、函数、测试函数

头文件:#contact.h

#ifndef __CONTACT_H__#define __CONTACT_H__#include<stdio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>//#define MAX 1000    //通讯录最大容量#define NAMEMAX 10#define TELE 12#define ADDR 25#define SEX 5#define CAPACITY 3   //当前容量#define FILENAME "daima.txt"typedef struct Peoinfo{char name[NAMEMAX];char sex[SEX];int age;char addr[ADDR];char tele[TELE];}Pof;typedef struct Contact{Pof *data;   //信息储存的区域int sz;  //有效元素的个数int capacity;  //容量char filename[100];  //文件名}Contact,*p;void Init(p list);         //初始化函数void Add(p pcon);          //录入函数void Show(const p pcon);   //显示函数void Delete(p pcon);       //删除函数void Search(p pcon);      //寻找函数void Modify(p pcon);     //修改函数void Sort(p pcon);      //排序函数void Clear(p pcon);     //清空函数void Addcapacity(p pcon); //增容函数void Save(p pcon);    //保存文件void display(p pcon);  //文件读入函数void Destory(p pcon); //释放内存函数#endif


函数:#contact.c

#include"contact.h"void display(p pcon)      //文件读入函数{int i = 0;FILE*pfin = fopen(FILENAME, "r");if (pfin == NULL){perror("fopen");exit(EXIT_FAILURE);}Pof tem = { 0 };while (fread(&tem, sizeof(Pof), 1, pfin) != 0){Addcapacity(pcon);   //加载信息要先开辟空间pcon->data[i] = tem;i++;pcon->sz++;}printf("读入成功");fclose(pfin);}void Save(p pcon)   //数据写入文件函数{int i = 0;FILE*pf = fopen(FILENAME, "w");if (pf == NULL){perror("fopen");exit(EXIT_FAILURE);}for (i = 0; i < pcon->sz; i++){fwrite(pcon->data+i, sizeof(Pof), 1, pf);}fclose(pf);}void Init(p list)  //初始化函数{list->sz = 0;list->data = malloc(CAPACITY*sizeof(Pof));   //初始化函数memsetif (list->data == NULL){perror("use malloc fail!");exit(0);//正常退出}memset(list->data, 0, CAPACITY*sizeof(Pof));list->capacity = CAPACITY;}void Addcapacity(p pcon)     //增容函数{if (pcon->sz == pcon->capacity){//增容Pof *ptr = realloc(pcon->data, (pcon->capacity + 2)*sizeof(Pof));if (ptr == NULL){perror("增容失败");exit(0);}else{pcon->data = ptr;pcon->capacity += 2;}}}void Destory(p pcon)  //释放内存{free(pcon->data);pcon->data = NULL;}void Add(p pcon)    //录入信息函数{char flat = 'Y';while(toupper(flat) == 'Y'){Addcapacity(pcon);int i = 0;i = pcon->sz;fflush(stdin);printf("请输入名字:");scanf("%s", pcon->data[i].name);printf("请输入性别:");scanf("%s", pcon->data[i].sex);printf("请输入年龄:");scanf("%d", &pcon->data[i].age);printf("请输入地址:");scanf("%s", pcon->data[i].addr);printf("请输入电话:");scanf("%s", pcon->data[i].tele);pcon->sz++;printf("录入成功!\n");printf("是否要继续录入信息,请选择(是y或否n):");fflush(stdin);scanf("%c", &flat);if (toupper(flat) != 'Y'){if (toupper(flat) == 'N')return;else{printf("输入错误,请重新输入:");fflush(stdin);scanf("%c", &flat);}}}}void Show(const p pcon)  // 显示函数{int i = 0;printf("%6s%6s%5s%15s%15s\n", "姓名", "性别", "年龄", "地址", "电话");for (i = 0; i < pcon->sz; i++){printf("%6s%6s%5d%15s%15s",pcon->data[i].name,pcon->data[i].sex,pcon->data[i].age,pcon->data[i].addr,pcon->data[i].tele);printf("\n");}}int find(char name[],p pcon )  //寻找函数{int i = 0;for (i = 0; i <pcon->sz; i++){if (strcmp(name, pcon->data[i].name) == 0)return i;}return -1;}void Delete(p pcon)    // 删除函数{char name[NAMEMAX];printf("请输入要删除人的姓名:");scanf("%s", &name);int ret = find(name,pcon);if (ret == -1)printf("没找到要删除的人!");else{for (int i = ret; i < pcon->sz; i++)pcon->data[i] = pcon->data[i + 1];pcon->sz--;printf("删除成功!");}}void Search(p pcon)    //查找函数{char name[NAMEMAX];printf("请输入要查找人的姓名:");scanf("%s", &name);int ret = find(name, pcon);if (ret == -1)printf("没找到要查找的人!");else{printf("%6s%6s%5d%15s%15s",pcon->data[ret].name,pcon->data[ret].sex,pcon->data[ret].age,pcon->data[ret].addr,pcon->data[ret].tele);}}void Modify(p pcon)    //修改函数{char name[NAMEMAX];printf("请输入要修改人的姓名:");scanf("%s", &name);int ret = find(name, pcon);if (ret == -1)printf("没找到要修改的人!");else{printf("请输入名字:");scanf("%s", pcon->data[ret].name);printf("请输入性别:");scanf("%s", pcon->data[ret].sex);printf("请输入年龄:");scanf("%d", &pcon->data[ret].age);printf("请输入地址:");scanf("%s", pcon->data[ret].addr);printf("请输入电话:");scanf("%s", pcon->data[ret].tele);printf("修改成功!");}}void Sort(p pcon)      //排序函数{int i=0, j = 0;for (i = 0; i < pcon->sz - 1;i++)for (j = 0; j < pcon->sz - 1 - i;j++){if (strcmp(pcon->data[j].name,pcon->data[j+1].name)>0){Pof tcmp = pcon->data[j];pcon->data[j] = pcon->data[j + 1];pcon->data[j + 1] = tcmp;}}printf("完成排序!");}void Clear(p pcon)   //清空函数{pcon->sz = 0;printf("数据已清空");}

测试函数:#test.c

#include"contact.h"enum Choose{EXIT,     //退出ADD,      //录入信息SHOW,     //显示信息DELETE,  //删除信息SEARCH,   //查找信息MODIFY,   //修改函数SORT,     //排序CLEAR,    //清空DISPLAY   //读入文件};void my_enum(){printf("\n\n\t\t\t【通讯录】\n");printf("\n\t\t1.录入信息    2.显示信息\n");printf("\t\t3.删除信息    4.查找信息\n");printf("\t\t5.修改信息    6.信息排序\n");printf("\t\t7.清空信息    8.读入文件\n");printf("\t请输入数字(1--7),【0退出程序】:");}int main(){Contact list;Init(&list);int i = 0;do{my_enum();scanf("%d", &i);switch (i){case ADD:Add(&list);break;case SHOW:Show(&list);break;case DELETE:Delete(&list);break;case SEARCH:Search(&list);break;case MODIFY:Modify(&list);break;case SORT:Sort(&list);break;case CLEAR:Clear(&list);break;case EXIT:Save(&list);Destory(&list);printf("退出系统");break;case DISPLAY:display(&list);  //文件读入break;default:printf("输入数字有错,请重新输入!");break;}} while (i);return 0;}

运行:



代码里的每个功能我都运行过了,是可以运行的,图片就不放了,好奇的小伙伴可以自己运行下。