C语言实现通讯录-动态内存
来源:互联网 发布:淘宝卖家的卡片祝福语 编辑:程序博客网 时间:2024/05/29 04:53
在之前的基础上,通过动态内存来进行优化,避免了内存的浪费,更加灵活的实现管理,且思路简单,只需将原来的数组改为指针,再使用 realloc 函数来进行内存分配。
优化方式如下:
首先将
struct Address_Lsit AL[1000];
改成了
struct Address_Lsit *AL = NULL;
数组空间是固定的所以改成用指针的方式,这样方便我们来分配内存空间,更改完成后添加了 extend 函数来进行内存空间的扩大:
void extend(struct Address_Lsit **ALp){ static int num = 0; num++; if(num != (People_num_all + 1)) { struct Address_Lsit *p = NULL; p = realloc(*ALp, (People_num_all + 1) * sizeof(struct Address_Lsit)); if (NULL != p) { *ALp = p; } }}
完成上面两部就已经完成了动态分布内存来实现通讯录的功能
ps:在最后我们可别忘记释放内存,因为那是由我们自己申请下来的,所应该有我们自己来释放,避免造成内存泄漏!!!
在结尾的后面加 free 函数即可
代码实现(环境 Visual Studio 2017)
#include <stdio.h>#include <windows.h>#include <string.h>#pragma warning(disable: 4996)static int People_num_all = 0;//通讯录人数struct Address_Lsit{ int age; int phone_num; char name[20]; char sex[3]; char Address[50];};void menu(){ printf("----------------------------------------------\n"); printf("-------------- 通讯录菜单 -------------\n"); printf("----------------------------------------------\n"); printf("\n"); printf(" 1.添加联系人信息\n 2.删除指定联系人信息\n 3.查找指定联系人信息\n 4.修改指定联系人信息\n 5.显示所有联系人信息\n 6.清空所有联系人\n 7.以名字排序所有联系人\n 0.退出"); printf("\n"); printf("----------------------------------------------\n"); printf("请选择:");}//交换两个联系人信息void exchange(struct Address_Lsit *AL1, struct Address_Lsit *AL2){ struct Address_Lsit AL3; strcpy(AL3.name, AL1->name);//交换名字 strcpy(AL1->name, AL2->name); strcpy(AL2->name, AL3.name); strcpy(AL3.sex, AL1->sex);//交换性别 strcpy(AL1->sex, AL2->sex); strcpy(AL2->sex, AL3.sex); AL3.age = AL1->age;//交换年龄 AL1->age = AL2->age; AL2->age = AL3.age; AL3.phone_num = AL1->phone_num;//交换电话 AL1->phone_num = AL2->phone_num; AL2->phone_num = AL3.phone_num; strcpy(AL3.Address, AL1->Address);//交换地址 strcpy(AL1->Address, AL2->Address); strcpy(AL2->Address, AL3.Address);}void show(struct Address_Lsit *AL)//----------显示信息{ printf("姓名:%s\t", AL->name); printf("性别:%s\t", AL->sex); printf("年龄:%d\t", AL->age); printf("电话:%d\t", AL->phone_num); printf("地址:%s\n", AL->Address);}void add(struct Address_Lsit * AL)////----------------------添加联系人信息{ AL += People_num_all++; printf("请输入:姓名\n"); scanf("%s", AL->name); printf("请输入:性别\n"); scanf("%s", AL->sex); printf("请输入:年龄\n"); scanf("%d", &(AL->age)); printf("请输入:电话\n"); scanf("%d", &(AL->phone_num)); printf("请输入:地址\n"); scanf("%s", AL->Address); printf("添加完成\n");}void del(struct Address_Lsit * AL)//----------------------删除指定联系人信息{ int flag = 0;//标志位 char w_name[20] = { 0 }; printf("请输入删除联系人的姓名\n"); scanf("%s", w_name); for (int i = 0; i < People_num_all; i++) { if (!(strcmp((AL + i)->name, w_name))) { flag = 1;//找到了 if(i != People_num_all) exchange((AL + i), (AL + People_num_all - 1));//和最后一个交换 break; } } if (flag) { printf("删除完成\n"); People_num_all--;//总人数减一 } else { printf("没有找到\n"); }}void find(struct Address_Lsit * AL)//---------------------------------查找指定联系人信息{ char w_name[20] = { 0 }; printf("请输入要查找联系人的姓名\n"); scanf("%s", w_name); for (int i = 0; i < People_num_all; i++) { if (!(strcmp((AL + i)->name, w_name))) { printf("已找到:\n"); show((AL + i)); return 0; } } printf("不存在该联系人\n");}void amend(struct Address_Lsit * AL)//-----------------------修改指定联系人信息{ char w_name[20] = { 0 }; printf("请输入要修改联系人的姓名\n"); scanf("%s", w_name); for (int i = 0; i < People_num_all; i++) { if (!(strcmp((AL + i)->name, w_name))) { AL += i; printf("请输入:新姓名\n"); scanf("%s", AL->name); printf("请输入:新性别\n"); scanf("%s", AL->sex); printf("请输入:新年龄\n"); scanf("%d", &(AL->age)); printf("请输入:新电话\n"); scanf("%d", &(AL->phone_num)); printf("请输入:新地址\n"); scanf("%s", AL->Address); printf("添加完成\n"); return 0; } } printf("不存在该联系人\n");}void show_all(struct Address_Lsit * AL)//显示所有联系人信息{ for (int i = 0; i < People_num_all; i++) { show(AL + i); } printf("显示完成\n");}void empty(struct Address_Lsit * AL)//清空所有联系人{ People_num_all = 0; printf("完成清空\n");}void sort(struct Address_Lsit * AL)//以名字排序所有联系人{ int i = 0; int j = 0; int k = 0; char exname[20] = {0}; for ( i = 0; i < People_num_all - 1; i++) { k = 0; strcpy(exname, (AL + i)->name); for (j = i+1,k=i; j < People_num_all; j++) { if (strcmp((AL + j)->name, exname) < 0) { k = j; strcpy(exname, (AL + j)->name); } } if (k) { exchange((AL + i), (AL + k)); } } printf("排序完成\n");}void operation(int x, struct Address_Lsit * AL){ switch (x) { case 1: add(AL); break; case 2: del(AL); break; case 3: find(AL); break; case 4: amend(AL); break; case 5: show_all(AL); break; case 6: empty(AL); break; case 7: sort(AL); break; case 0: break; default: printf("请重新输入"); }}void extend(struct Address_Lsit **ALp){ static int num = 0; num++; if(num != (People_num_all + 1)) { struct Address_Lsit *p = NULL; p = realloc(*ALp, (People_num_all + 1) * sizeof(struct Address_Lsit)); if (NULL != p) { *ALp = p; } }}int main(){ int x = 1; struct Address_Lsit *AL = NULL; while (x) { menu(); scanf("%d", &x); extend(&AL); operation(x, AL); Sleep(500); } system("pause"); free(AL); return 0;}
阅读全文
0 0
- c语言实现通讯录(动态内存开辟)
- C语言实现通讯录-动态内存
- 通讯录c语言实现(动态内存开辟&文件存储)
- c语言实现动态通讯录
- 【C语言】C语言实现动态通讯录
- c语言实现动态版本通讯录
- c语言通讯录的简单实现文件版本(动态开辟内存)
- 【C语言】通讯录:动态开辟内存版和文件版本
- c语言实现----通讯录
- C语言实现通讯录
- C语言实现通讯录
- c语言实现通讯录
- C语言实现通讯录
- 【C语言】实现一个通讯录(二:动态的实现)
- C语言---静态内存结构体实现通讯录
- C语言实现通讯录—动态顺序表
- 【c语言】实现一个通讯录
- c语言实现通讯录系统
- ACM复习(13)8612 发牌
- java并发中的CAS
- 0-1背包回溯【Java】
- 外卖哥
- Qt获取所有进程、终止某个进程
- C语言实现通讯录-动态内存
- 用于目标检测的rcnn,fast-rcnn,faster-rcnn
- 姿态论文整理--04-Human pose estimation using global and local normalization
- 渗透入门学习之http数据包
- B OOXX Game(FZU 2151)
- 最小的k个数
- HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法
- LeetCode.402 Remove K Digits
- 笔试题3