一. 增加需求
在学习了动态开辟内存之后 我们对于通讯录产生了新的需求
要求我们做出一个动态增长的版本
即 随着我们储存联系人的增加 储存的空间增加
要求 :
1 初始空间为3
2 每次达到上限之后 扩容两个内存
二. 动手实施
我们首先要创建一个结构体
结构体的代码暂定为这样子
struct contact { struct address* date; int sz; int max; };
既然结构体改变了 那么我们的初始化也需要改变一下
void inicontact(struct contact* pc) { pc->sz = 0; pc-> max = 3; pc->date = (struct address*)calloc(3,sizeof(struct address)); }
这样我们就初始化出来了 一块新的空间
那么这个时候我们开始设计增加联系人的功能
主要思路就是 如果联系人到了上线的话 那么realloc增容上线+2
另外 上线也加上2
代码表示如下
void addpeople(struct contact* pc) { if ((pc->sz)>=(pc->max)) { pc=(struct address*)realloc(pc->date, (pc->max + 2)*sizeof(struct address)); printf("扩容成功\n"); pc->max += 2; } printf("请输入姓名\n"); scanf("%s", &(pc->date[pc->sz].name)); printf("请输入性别\n"); scanf("%s", &(pc->date[pc->sz].sex)); printf("请输入年龄\n"); scanf("%d", &(pc->date[pc->sz].age)); printf("请输入电话\n"); scanf("%s", &(pc->date[pc->sz].tel)); printf("请输入住址\n"); scanf("%s", &(pc->date[pc->sz].address)); printf("添加联系人完毕\n"); pc->sz++; }
代码显示效果如下
三. 回收空间
其他要修改的地方只是一个回收动态开辟的空间 防止内存泄漏
void killpeople(struct contact* pc) { free(pc->date); pc->date = NULL; pc->max = 0; pc->sz = 0; }
代码很简单 只需要这样子就好啦
四. 所有代码文件
1. 头文件
#define _CRT_SECURE_NO_WARNINGS 1 #define max 3 #pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include <windows.h> void menu(); void inicontact(struct contact * pc); void addpeople(struct contact* pc); void delpeople(struct contact* pc); void srhpeople(struct contact* pc); void revpeople(struct contact* pc); void showpeople(struct contact* pc); void sortpeople(struct contact* pc); void killpeople(struct contact* pc); int cmp(struct contact* pc); struct address { char name[10]; char sex[5]; int age; char tel[15]; char address[20]; }; struct contact { struct address *date; int sz; int max; };
2. 主函数文件
#define _CRT_SECURE_NO_WARNINGS 1 #include "address.h" 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"); } // 初版初始化 //void inicontact(struct contact* pc) //{ // pc->sz = 0; // memset(pc->date, 0, 100*sizeof(struct address)); //} // void inicontact(struct contact* pc) { pc->sz = 0; pc-> max = 3; pc->date = (struct address*)calloc(3,sizeof(struct address)); } // 初始版本的增加联系人 //void addpeople(struct contact* pc) //{ // if (pc->sz==100) // { // printf("通讯录已满 无法继续添加"); // return 0; // } // printf("请输入姓名\n"); // scanf("%s", &(pc->date[pc->sz].name)); // printf("请输入性别\n"); // scanf("%s", &(pc->date[pc->sz].sex)); // printf("请输入年龄\n"); // scanf("%d", &(pc->date[pc->sz].age)); // printf("请输入电话\n"); // scanf("%s", &(pc->date[pc->sz].tel)); // printf("请输入住址\n"); // scanf("%s", &(pc->date[pc->sz].address)); // printf("添加联系人完毕\n"); // pc->sz++; //} void addpeople(struct contact* pc) { if ((pc->sz)>=(pc->max)) { pc=(struct address*)realloc(pc->date, (pc->max + 2)*sizeof(struct address)); printf("扩容成功\n"); pc->max += 2; } printf("请输入姓名\n"); scanf("%s", &(pc->date[pc->sz].name)); printf("请输入性别\n"); scanf("%s", &(pc->date[pc->sz].sex)); printf("请输入年龄\n"); scanf("%d", &(pc->date[pc->sz].age)); printf("请输入电话\n"); scanf("%s", &(pc->date[pc->sz].tel)); printf("请输入住址\n"); scanf("%s", &(pc->date[pc->sz].address)); printf("添加联系人完毕\n"); pc->sz++; } void delpeople(struct contact* pc) { char name1[10]; int input1; printf("请输入你要删除的联系人\n"); scanf("%s", &name1); int i; for ( i = 0; i <(pc->sz); i++) { if (strcmp(pc->date[i].name, name1) == 0) { printf("查到到联系人%s是否确认删除(1or0)\n", name1); scanf("%d", &input1); if (input1==1) { for (int j = i; j < ((pc->sz)-1); j++) { (pc->date[j]) = (pc->date[j + 1]); pc->sz--; } printf("删除成功\n"); } else { printf("成功取消\n"); } } } if (i>=(pc->sz)) { printf("联系人%s不存在\n", name1); } } void srhpeople(struct contact* pc) { char name1[10]; printf("请输入你要查找的联系人\n"); scanf("%s", &name1); int i; for ( i = 0; i < (pc->sz); i++) { if (strcmp(pc->date[i].name, name1) == 0) { printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n", "name", "sex", "age", "tel", "address"); printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n", pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].tel, pc->date[i].address); } } if (i > pc->sz) { printf("不存在此联系人%s\n", name1); } } void revpeople(struct contact* pc) { char name1[10]; printf("请输入你要修改的联系人\n"); scanf("%s", &name1); int i; for ( i = 0; i < (pc->sz); i++) { if (strcmp(pc->date[i].name, name1) == 0) { printf("请输入姓名\n"); scanf("%s", &(pc->date[i].name)); printf("请输入性别\n"); scanf("%s", &(pc->date[i].sex)); printf("请输入年龄\n"); scanf("%d", &(pc->date[i].age)); printf("请输入电话\n"); scanf("%s", &(pc->date[i].tel)); printf("请输入住址\n"); scanf("%s", &(pc->date[i].address)); printf("修改联系人完毕\n"); } } if (i > pc->sz) { printf("不存在此联系人%s\n", name1); } } void showpeople(struct contact* pc) { int i; printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n", "name", "sex", "age", "tel", "address"); for (i = 0; i < (pc->sz); i++) { printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n", pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].tel, pc->date[i].address); } } int cmp(void *e1,void *e2) { struct address* p1 = (struct address*)e1; struct address* p2 = (struct address*)e2; return strcmp(p1->name, p2->name); } void sortpeople(struct contact* pc) { qsort(pc, pc->sz, sizeof(struct address), cmp); } void killpeople(struct contact* pc) { free(pc->date); pc->date = NULL; pc->max = 0; pc->sz = 0; }
3. 测试文件
#define _CRT_SECURE_NO_WARNINGS 1 #include "address.h" int main() { struct contact c1; inicontact(&c1); int input=1; do { menu(); scanf("%d", &input); switch (input) { case 1: system("cls"); addpeople(&c1); break; case 2: system("cls"); delpeople(&c1); break; case 3: system("cls"); srhpeople(&c1); break; case 4: system("cls"); revpeople(&c1); break; case 5: system("cls"); showpeople(&c1); break; case 6: system("cls"); inicontact(&c1); break; case 7: system("cls"); sortpeople(&c1); break; case 0: system("cls"); killpeople(&c1); break; default: break; } } while (input); return 0; }
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯