网站维护的意义,企业网站的建设过程,美丽说网站代码与蘑菇街网站代码是用什么网站语言做的,中兴的网站谁做的一. 增加需求
在学习了动态开辟内存之后 我们对于通讯录产生了新的需求
要求我们做出一个动态增长的版本
即 随着我们储存联系人的增加 储存的空间增加
要求 #xff1a; 1 初始空间为3 2 每次达到上限之后 扩容两个内存 二. 动手实施
我们首先要创建一个结构体
结构体…一. 增加需求
在学习了动态开辟内存之后 我们对于通讯录产生了新的需求
要求我们做出一个动态增长的版本
即 随着我们储存联系人的增加 储存的空间增加
要求 1 初始空间为3 2 每次达到上限之后 扩容两个内存 二. 动手实施
我们首先要创建一个结构体
结构体的代码暂定为这样子
typedef struct Contact
{PeoInfo* date;//存放人的信息int sz;//当前已经放的信息个数int capacity;//当前通信录的最大容量
}Contact; 既然结构体改变了 那么我们的初始化也需要改变一下
void InitContact(Contact* pc)
{assert(pc);pc-sz 0;PeoInfo* ptr (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo*));if (ptr NULL){perror(InitContact::calloc);return ;}pc-date ptr;pc-capacity DEFAULT_SZ;
}
这样我们就初始化出来了 一块新的空间
那么这个时候我们开始设计增加联系人的功能
主要思路就是 如果联系人到了上线的话 那么realloc增容上线2
另外 上线也加上2
代码表示如下
void check_capacity(Contact* pc)
{if (pc-sz pc-capacity){//增容PeoInfo* ptr (PeoInfo*)realloc(pc-date, (pc-capacity INC_SZ) * sizeof(PeoInfo));if (ptr NULL){perror(check_capacity::realloc);}elsepc-date ptr;pc-capacity INC_SZ;printf(增容成功\n);}
}
//动态版本
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);//增加一个人的信息printf(请输入名字:);scanf(%s, pc-date[pc-sz].name);printf(请输入年龄:);scanf(%d, (pc-date[pc-sz].age));printf(请输入性别:);scanf(%s, pc-date[pc-sz].sex);printf(请输入地址:);scanf(%s, pc-date[pc-sz].addr);printf(请输入电话:);scanf(%s, pc-date[pc-sz].tele);pc-sz;}
代码显示效果如下 三. 回收空间
其他要修改的地方只是一个回收动态开辟的空间 防止内存泄漏
void DestroyContact(Contact* pc)
{free(pc-date);pc-date NULL;pc-capacity 0;pc-sz 0;pc NULL;
}
代码很简单 只需要这样子就好啦
四. 所有代码文件
1. 头文件
#includestdio.h
#includeassert.h
#includestring.h
#includestdlib.h
#includestdlib.h#define MAX 100
#define MAX_NEME 20
#define MAX_SEX 5
#define MAX_ADDR 30
#define MAX_TELE 12
#define DEFAULT_SZ 3
#define INC_SZ 2//人的信息
typedef struct PeoInfo
{char name[MAX_NEME];int age;char sex[MAX_SEX];char addr[MAX_ADDR];char tele[MAX_TELE];
}PeoInfo;
//静态版本
//typedef struct Contact
//{
// PeoInfo date[MAX];//存放人的信息
// int sz;//当前已经放的信息个数
//}Contact;
//动态版本
typedef struct Contact
{PeoInfo* date;//存放人的信息int sz;//当前已经放的信息个数int capacity;//当前通信录的最大容量
}Contact;
2. 主函数文件
void memu()
{printf(********************************\n);printf(***** 1.add 2.del *****\n);printf(***** 3.search 4.modify *****\n);printf(***** 5.show 6.sort *****\n);printf(***** 0.exit *****\n);printf(********************************\n);
}
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
void test()
{int input 0;//创建通信录Contact con;//初始化通信录InitContact(con);do{memu();printf(请选择:);scanf(%d, input);switch (input){case ADD:AddContact(con);break;case DEL:DelContact(con);break;case SEARCH:SearchContact(con);break;case MODIFY:ModityContact(con);break;case SHOW:ShowContact(con);break;case SORT://SortContact(con);break;case EXIT:DestroyContact(con);printf(退出通信录\n);break;default:printf(选择错误请重新选择\n);break;}} while (input);
}
int main()
{test();return 0;
}3. 测试文件
#define _CRT_SECURE_NO_WARNINGS
#includecontact.h
//静态版本
//void InitContact(Contact* pc)
//{
// assert(pc);
// pc-sz 0;
// memset(pc-date, 0, sizeof(pc-date));
//}
//动态版本
void InitContact(Contact* pc)
{assert(pc);pc-sz 0;PeoInfo* ptr (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo*));if (ptr NULL){perror(InitContact::calloc);return ;}pc-date ptr;pc-capacity DEFAULT_SZ;
}//静态版本
//void AddContact(Contact* pc)
//{
// assert(pc);
// if (pc-sz MAX)
// {
// printf(通信录已满无法添加\n);
// return ;
// }
// //增加一个人的信息
// printf(请输入名字:);
// scanf(%s, pc-date[pc-sz].name);
// printf(请输入年龄:);
// scanf(%d, (pc-date[pc-sz].age));
// printf(请输入性别:);
// scanf(%s, pc-date[pc-sz].sex);
// printf(请输入地址:);
// scanf(%s, pc-date[pc-sz].addr);
// printf(请输入电话:);
// scanf(%s, pc-date[pc-sz].tele);
// pc-sz;
//
//}void check_capacity(Contact* pc)
{if (pc-sz pc-capacity){//增容PeoInfo* ptr (PeoInfo*)realloc(pc-date, (pc-capacity INC_SZ) * sizeof(PeoInfo));if (ptr NULL){perror(check_capacity::realloc);}elsepc-date ptr;pc-capacity INC_SZ;printf(增容成功\n);}
}
//动态版本
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);//增加一个人的信息printf(请输入名字:);scanf(%s, pc-date[pc-sz].name);printf(请输入年龄:);scanf(%d, (pc-date[pc-sz].age));printf(请输入性别:);scanf(%s, pc-date[pc-sz].sex);printf(请输入地址:);scanf(%s, pc-date[pc-sz].addr);printf(请输入电话:);scanf(%s, pc-date[pc-sz].tele);pc-sz;}void DestroyContact(Contact* pc)
{free(pc-date);pc-date NULL;pc-capacity 0;pc-sz 0;pc NULL;
}void ShowContact(const Contact* pc)
{assert(pc);int i 0;printf(%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n, 名字, 年龄, 性别, 地址, 电话);for (i 0; i pc-sz; i){printf(%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n, pc-date[i].name,pc-date[i].age,pc-date[i].sex,pc-date[i].addr,pc-date[i].tele);}
}int FindByName(Contact* pc, char name[])
{int i 0;for (i 0; i pc-sz; i){if (strcmp(pc-date[i].name, name) 0){return i;}}return -1;
}void DelContact(Contact* pc)
{assert(pc);int i 0;char name[MAX_NEME];if (pc-sz 0){printf(通讯录为空,无法删除\n);}printf(请输入要删除人的名字:);scanf(%s, name);int del 0;//找到删除人的名字int ret FindByName(pc, name);if (-1 ret){printf(要删除的人不存在\n);}//删除for (i ret; i pc-sz - 1; i){pc-date[i] pc-date[i 1];}pc-sz--;printf(删除成功\n);
}void SearchContact(const Contact* pc)
{char name[MAX_NEME] { 0 };printf(请输入查找人的名字:);scanf(%s, name);int pos FindByName(pc, name);if (-1 pos){printf(查找人的信息不存在\n);return ;}//打印信息printf(%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n, 名字, 年龄, 性别, 地址, 电话);printf(%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n, pc-date[pos].name,pc-date[pos].age,pc-date[pos].sex,pc-date[pos].addr,pc-date[pos].tele);}void ModityContact(Contact* pc)
{assert(pc);char name[MAX_NEME] { 0 };printf(请输入修改人的名字:);scanf(%s, name);int pos FindByName(pc, name);if (-1 pos){printf(修改人的信息不存在\n);return;}//录入信息printf(请输入名字:);scanf(%s, pc-date[pos].name);printf(请输入年龄:);scanf(%d, (pc-date[pos].age));printf(请输入性别:);scanf(%s, pc-date[pos].sex);printf(请输入地址:);scanf(%s, pc-date[pos].addr);printf(请输入电话:);scanf(%s, pc-date[pos].tele);printf(修改完成\n);
}//int cmp(void* a, void* b)
//{
// Contact* p1 (Contact*)a;
// Contact* p2 (Contact*)b;
// return strcmp(p1-date-name, p2-date-name);
//}
//
//void SortContact(Contact* pc)
//{
//
// qsort(pc, pc-sz, sizeof(Contact*), cmp);
//}
以上便是本文所有内容如有错误请各位大佬不吝赐教感谢留言