首页 > 编程知识 正文

c语言中动态分配存储空间,用c语言编写通讯录

时间:2023-05-03 16:01:56 阅读:33779 作者:4138

一、使用多个文件实现通讯录

1、头文件Contact.h

自行编写的头文件:编写包含库函数的头文件,以及自行编写的函数声明、个人信息结构、通讯录结构、枚举、宏定义即可。

#pragma once//头文件中包含# include stdio.h # include assert.h # include stdlib.h # pragma warning (disclude stdlib ) 姓名最大长度#define MAX_AGE 5//年龄最大长度#define MAX_SEX 5//性别最大长度#define MAX_TELE 12//最大电话号码长度# definename define capacine 地址簿功能选择{EXITCONTACT,//0ADDCONTACT,//1DELCONTACT,SEARCHCONTACT,MODIFYCONTACT //枚举0至7结束添加删除并更改打印顺序,然后选择类型int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; (}PerInfo; 结构联系人//地址簿结构{int size; //已经存了多少个int capacity; //通讯录总大小PerInfo* date; //定义灵活的数组; //函数声明//菜单函数void menu (; //初始化通讯录函数voidinitcontact (结构联系人* PS )//增加通讯录对象的函数voidaddcontact (结构联系人* PS ); //删除通讯录的人的函数voiddelcontact (结构联系人* PS ); //个人信息检索函数voidsearchcontact (conststructcontact * PS ); //修改个人信息函数voidmodifycontact (结构联系人* PS ); //打印通讯簿函数voidprintcontact (conststructcontact * PS ); //释放动态内存函数voidfreecontact (结构联系人* PS ); //将通讯录保存到文件的函数voidsavecontact (结构联系人* PS ); //判断通讯录容量是否足够voidcheckcapacity (结构联系人* PS ); 2、源文件

源文件包含您自己编写的所有头文件,以便可以使用头文件中的内容。

(1) main.c源文件

你只需要负责调试,调用函数,调试代码。

#include'Contect.h'int main () /添加、删除、搜索、修改、排序、打印结构联系人con; //初始化定义通讯录initcontact(con )的int input=0的do{menu (; 请选择printf(':n ' ); scanf('%d ',input ); int pos=0; 使用了sitch(input )//枚举。 { caseaddcontact 3360 add contact (con; 布雷克; casedelcontact : del contact (con; 布雷克; casesearchcontact : search contact (con; 布雷克; casemodifycontact 3360修改联系人(con; 布雷克; caseprintcontact 3360打印联系人(con; 布雷克; case SORTCONTACT:break; caseexitcontact 3360保存联系人(con; 自由联系(con ); 布雷克; casesavecontact 3360存储联系人(con; 布雷克; 默认:打印(输入错误n ); 布雷克; } while (输入); 返回0; (2)联系源文件

主要负责函数的实现

#include'Contect.h'void menu () printf (# # # # # # # # # # # # # # (n ) ); printf () ##1.add2.div(#n ); printf(##3.search4.modify##n ); printf(##5.print6.sort##n ); printf(##7.save0.exit# )n ); printf (

"################################n");}void SaveContact(struct Contact* ps){FILE* fpwrite = fopen("mycontact.date", "wb");if (fpwrite == NULL){printf("SaveContact::%s", strerror(errno));return;}else//将通讯录文件保存在文件中{for (int i = 0; i < ps->size; i++){fwrite(&(ps->date[i]), sizeof(PerInfo), 1, fpwrite);}}fclose(fpwrite);fpwrite = NULL;}void LoadContact(struct Contact* ps){PerInfo temp = { 0 };FILE* fpread = fopen("mycontact.date", "rb");if (fpread == NULL){printf("LoadContact::%s", strerror(errno));return;}else{//初始化时将文件里的内容读进通讯录里while (fread(&temp, sizeof(PerInfo), 1, fpread)){CheckCapacity(ps);ps->date[ps->size] = temp;ps->size++;}}fclose(fpread);fpread = NULL;}void InitContact(struct Contact *ps){ps->date = (PerInfo*)malloc(CAPACITY_SZ * (sizeof(PerInfo)));if (ps->date == NULL){return;}else{ps->size = 0;//已存数目ps->capacity = CAPACITY_SZ;//初始容量}LoadContact(ps);//加载文件中的内容/*memset(ps->date, 0, sizeof(ps->date));ps->size = 0;*/}//判断是否需要增容 void CheckCapacity(struct Contact* ps){if ((ps->size) == (ps->capacity))//判断是否需要增容{//增容PerInfo* pos = (PerInfo*)realloc(ps->date, (CAPACITY_SZ * 2)*sizeof(PerInfo));if (pos != NULL){printf("增容成功n");ps->date = pos;ps->capacity = CAPACITY_SZ * 2;}else{printf("扩容失败n");}}}void AddContact(struct Contact* ps)//增加函数{CheckCapacity(ps);//判断是否需要增容printf("请输入名字:");scanf(" %s", ps->date[ps->size].name);printf("请输入年龄:");scanf(" %d", &ps->date[ps->size].age);printf("请输入性别:");scanf(" %s", ps->date[ps->size].sex);printf("请输入电话:");scanf("%s", ps->date[ps->size].tele);printf("请输入住址:");scanf("%s", ps->date[ps->size].addr);printf("添加成功n");ps->size++;/*if (ps->size == MAX){printf("空间已满,添加失败n");}else{printf("请输入名字:" );scanf(" %s", ps->date[ps->size].name);printf("请输入年龄:");scanf(" %d",& ps->date[ps->size].age);printf("请输入性别:");scanf(" %s", ps->date[ps->size].sex);printf("请输入电话:");scanf("%s", ps->date[ps->size].tele);printf("请输入住址:");scanf("%s", ps->date[ps->size].addr);printf("添加成功n");ps->size++;}*/}void PrintContact(const struct Contact* ps){if (ps->size == 0){printf("通讯录为空n");}else{printf("%-20st%sdt%-5st%-12st%-30sn","姓名", "年龄", "性别", "电话号码", "住址");for (int i = 0; i < ps->size; i++){printf("%-20st%4dt%-5st%-12st%-30sn",ps->date[i].name,ps->date[i].age,ps->date[i].sex,ps->date[i].tele,ps->date[i].addr);}}}//寻找名字对应下标的函数static int FindContact(const struct Contact* ps,char name[MAX_NAME]){int pos = 0;for (pos = 0; pos < ps->size; pos++){if (strcmp(ps->date[pos].name, name) == 0){break;}}if (pos == ps->size){return -1;}else{return pos;}}void DelContact(struct Contact*ps){char name[MAX_NAME];printf("请输入你要删的名字:>");scanf("%s", name);int pos = FindContact(ps, name);if (pos == -1){printf("你要删除的人不存在n");}else{int j = 0;for (j = pos; j < ps->size - 1; j++){ps->date[j] = ps->date[j + 1];}ps->size--;printf("删除成功n");}}void SearchContact(const struct Contact* ps){char name[MAX_NAME];printf("请输入你要查找的人名字:>");scanf("%s", name);int pos = FindContact(ps, name);if (pos == -1){printf("你要查找的人不存在n");}else{printf("查找成功n");printf("%-20st%-5st%-4st%-12st%-30sn","名字", "年龄", "性别", "电话号码", "住址");printf("%-20st%-5dt%-4st%-12st%-30sn",ps->date[pos].name, ps->date[pos].age,ps->date[pos].sex, ps->date[pos].tele,ps->date[pos].addr);}}void ModifyContact(struct Contact* ps){char name[MAX_NAME];printf("请输入你要修改人的名字n");scanf("%s", name);int pos = FindContact(ps, name);if (pos == -1){printf("你要修改的人信息不存在n");}else{printf("请输入要修改的名字:");scanf(" %s", ps->date[pos].name);printf("请输入要修改的年龄:");scanf(" %d", &ps->date[pos].age);printf("请输入要修改的性别:");scanf(" %s", ps->date[pos].sex);printf("请输入要修改的电话:");scanf("%s", ps->date[pos].tele);printf("请输入要修改的住址:");scanf("%s", ps->date[pos].addr);printf("修改成功n");}}void FreeContact(struct Contact* ps){free(ps->date);ps->date = NULL;}

二、测试结果
1、添加一个人
2、打印通讯录结果

3、删除一个人
先添加一个人

删除之后:
只有原来的一个了。

(4)修改信息
进行修改

修改之后:

(6)增容
我设置的通讯录初使大小是5;当超过5之后会自动扩容
当已经有5个时,在添加会扩容。

(7)保存在文件中

(8)再一次运行时会将文件中的内容放进通讯录中
这是上次运行时保存的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。