一. 增加需求
在学习了动态开辟内存之后 我们对于通讯录产生了新的需求
要求我们做出一个动态增长的版本
即 随着我们储存联系人的增加 储存的空间增加
要求 :
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"); } else pc->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. 头文件
#include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> #include<stdlib.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 #include"contact.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"); } else pc->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); //}
以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言