热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模拟实现通讯录动态的方法

模拟实现通讯录-静态的方法:http:blog.csdn.netqq_34328833articledetails51377345题目描述:实现一个通讯

    模拟实现通讯录-静态的方法:

    


http://blog.csdn.net/qq_34328833/article/details/51377345

题目描述:

实现一个通讯录:通讯录可以用于存储1000个人的信息:每个人的信息包括:姓名,性别,年龄,电话,住址

 提供的方法:

1.添加联系人信息

2.删除指定联系人信息

3.查找指定联系人信息

4.修改指定联系人信息

5.显示所有联系人信息

6.清空联系人信息

7.以名字排序所有联系人

模拟实现通讯录-动态的方法:

【题目分析】:

要理解动态实现通讯录首先必须了解动态内存开辟的几个常见的函数,在我们的代码实现过程中我们用到了 free,malloc,realloc 这几个动态内存开辟的函数,下面我们就来介绍这几个函数的功能以及如何使用:

        malloc :打开MSDN我们发现malloc它的函数原型为:void *malloc(size_t size) ,size它是你要分配的字节数,而malloc它的返回值类型是void *,所以一般情况下我们都把分配好的空间强制类型转化成你要使用的类型,用malloc分配的空间要判断是否为空的情况,下面提供一种判断空的方法:

        

char *p=(char *)malloc(10*sizeof(char));if(p == NULL){printf("out of menory");exit(EXIT_FAILURE);}


        free: 它的函数原型为:void free(void *memblock), free一般和malloc配套使用,用于释放堆上的空间;

        realloc: 它的函数原型为:void *realloc(void *memblock,size_t size), realloc函数用于修改一个原本已经分配的内存块的大小,使用这个函数,你可以使一块内存扩大或者缩小;realloc使内存扩大,那仫这块内存的内容依然保留,新增加的内容添加到原先内存块的后面,在实现通讯录的添加联系人功能时,我们设置的初始容量是2,那仫是不是就不可以继续添加了呢?此时我们的realloc就闪亮登场了,我们知道realloc有一个功能就是用于扩容这不就解决了增容的问题了吗?实现如下:

       

void Add(Pcon pcon) //添加联系人
{if(pcon->size >= pcon->capacity){PerInfo *tmp=(PerInfo *)realloc(pcon->data,(pcon->capacity+MAX_RISE)*sizeof(PerInfo)); //当实际联系人个数和初始化的容量相等时用realloc增容if(tmp == NULL){printf("out of menory\n");exit(EXIT_FAILURE);}else{pcon->data=tmp;pcon->capacity+=MAX_RISE;}}printf("请输入你添加之后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");scanf("%s",pcon->data[pcon->size].name);scanf("%d",&(pcon->data[pcon->size].age));scanf("%s",pcon->data[pcon->size].sex);scanf("%s",pcon->data[pcon->size].tele);scanf("%s",pcon->data[pcon->size].addr);pcon->size++;printf("添加成功\n");
}
         realloc的另一个功能就是用于缩小一个内存块:此时该内存的尾部内存便会被拿掉,剩余部分内存原先的内容会依然保留; 如果realloc函数的第一个参数是NULL,那仫此时它的操作就和malloc一样


          calloc: 它的函数原型为:void *calloc(size_t num,size_t size) ,num:所需元素的数量,size:每个元素的字节数它的作用和malloc类似, calloc将分配好的内存初始化为0而malloc并没有将内存初始化为0 ,也就是说calloc=malloc+memset ;




  

好了理解了这下常见的内存分配函数我们就来实现动态的通讯录吧!得意

在这里附上程序源代码便于读者理解:微笑

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define NAME_MAXNUM 20
#define SEX_MAXNUM 5
#define TELE_MAXNUM 12
#define ADDR_MAXNUM 10
#define MAX 1000
#define MAX_INIT 2
#define MAX_RISE 2
enum OP
{EXIT, ADD,DEL,SEARCH,REVISE,DISPLAY,EMPTY,SORT
};
typedef struct PerInfo
{char name[NAME_MAXNUM];int age;char sex[SEX_MAXNUM];char tele[TELE_MAXNUM];char addr[ADDR_MAXNUM];
}PerInfo;
typedef struct Contact
{PerInfo *data; //存储所有联系人的所有信息int size; //记录联系人的个数int capacity; //通讯录的容量
}Contact,*Pcon;void init(Pcon pcon)
{//memset(pcon->data,0,MAX*sizeof(PerInfo));//pcon->size=0;pcon->data=(PerInfo *)malloc(MAX_INIT*sizeof(PerInfo));if(pcon->data == NULL){printf("out of menory");exit(EXIT_FAILURE);}pcon->size=0;pcon->capacity=MAX_INIT;
}void menu()
{printf("***************简易通讯录***************\n");printf("****1.添加联系人*******2.删除联系人****\n");printf("****3.查找联系人*******4.修改联系人****\n");printf("****5.显示联系人*******6.清空联系人****\n");printf("****7.以名字排序联系人*0.退出**********\n");printf("***************************************\n");
}void Add(Pcon pcon) //添加联系人
{if(pcon->size >= pcon->capacity){PerInfo *tmp=(PerInfo *)realloc(pcon->data,(pcon->capacity+MAX_RISE)*sizeof(PerInfo)); //当实际联系人个数和初始化的容量相等时用realloc增容if(tmp == NULL){printf("out of menory\n");exit(EXIT_FAILURE);}else{pcon->data=tmp;pcon->capacity+=MAX_RISE;}}printf("请输入你添加之后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");scanf("%s",pcon->data[pcon->size].name);scanf("%d",&(pcon->data[pcon->size].age));scanf("%s",pcon->data[pcon->size].sex);scanf("%s",pcon->data[pcon->size].tele);scanf("%s",pcon->data[pcon->size].addr);pcon->size++;printf("添加成功\n");
}int Find_position(Pcon pcon,char *str) //查找联系人函数
{int i=0;for(i=0;i

size;i++){if(strcmp(pcon->data[i].name,str) == 0) //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标{return i;}}return -1;
}void Del(Pcon pcon) //删除指定联系人
{int ret=0;int i=0;char str[NAME_MAXNUM]={0};printf("请输入你要删除的联系人姓名:");scanf("%s",str);ret=Find_position(pcon,str);if(ret != -1){for(i=ret;i

size;i++){pcon->data[i]=pcon->data[i+1]; //删除的元素之后的元素往前挪一个位置}pcon->size--;}else{printf("通讯录里没有此联系人\n");return ;}
}void Search(Pcon pcon) //查找指定联系人
{int ret=0;char str[NAME_MAXNUM]={0};printf("请输入你要查找的联系人的名字:");scanf("%s",str);ret=Find_position(pcon,str);if(ret != -1){printf("查找成功\n");}else{printf("通讯录里无此人\n");return ;}
}void Revise(Pcon pcon) //修改指定联系人
{int ret=0;char str[NAME_MAXNUM]={0};printf("请输入你要修改的联系人的姓名:");scanf("%s",str);ret=Find_position(pcon,str);if(ret != -1){int input=0;printf("请输入你要修改的信息:1.姓名2.年龄3.性别4.联系电话5.住址\n");scanf("%d",&input);switch(input){case 1:printf("请输入修改后的名字:\n");scanf("%s",pcon->data[ret].name);break;case 2:printf("请输入修改后的年龄:\n");scanf("%d",&(pcon->data[ret].age));break;case 3:printf("请输入修改后的性别:\n");scanf("%s",pcon->data[ret].sex);break;case 4:printf("请输入修改后的联系电话:\n");scanf("%s",pcon->data[ret].tele);break;case 5:printf("请输入修改后的住址:\n");scanf("%s",pcon->data[ret].addr);break;default:printf("error");break;}}else{printf("通讯录里无此人\n");return ;}
}void Display(Pcon pcon) //显示联系人信息
{int i=0;for(i=0;i

size;i++){printf("%s %d %s %s %s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex,\pcon->data[i].tele,pcon->data[i].addr);}
}void Empty(Pcon pcon) //清空联系人
{pcon->size=0;
}void Sort_name(Pcon pcon) //以名字排序联系人
{int flag=0;int i=0;int j=0;for(i=0;i

size-1;i++){flag=0; //对冒泡排序的优化for(j=0;j

size-1-i;j++){if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列{PerInfo tmp=pcon->data[j];pcon->data[j]=pcon->data[j+1];pcon->data[j+1]=tmp;flag=1;}}if(flag == 0)break;}
}void Free(Pcon pcon)
{free(pcon->data);pcon->data=NULL;exit(0);
}int main()
{Contact pcon;int intput=1;init(&pcon);while(intput){menu();printf("请输入一个你要选择的操作:");scanf("%d",&intput);if(intput >= 0 && intput <= 7){switch(intput){case ADD:Add(&pcon);break;case DEL:Del(&pcon);break;case SEARCH:Search(&pcon);break;case REVISE:Revise(&pcon);break;case DISPLAY:Display(&pcon);break;case EMPTY:Empty(&pcon);break;case SORT:Sort_name(&pcon);break;case EXIT:Free(&pcon);break;}}}system("pause");return 0;
}
          在这里以一句话勉励自己:敢于尝试才可能成功,加油!


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
李国龙度_476
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有