c语言实现通讯录(动态内存开辟)
来源:互联网 发布:2011年网络春晚 编辑:程序博客网 时间:2024/05/16 17:41
在上个通讯录版本中,运用了事先定义通讯录的大小,再向固定大小的内存里不断的填充每个人的信息,一方面,当我们将开辟的内存用完的时候,将没有办法继续存放信息。另一方面,一般的,我们将通讯录定义的比较大,然而当我们存放的联系人又比较少时,事先开辟的内存又极大的被浪费。因此,他存在很大的缺陷。。。
在这个版本中,为了解决这个问题,运用malloc()和realloc()等用于开辟动态内存的函数。在程序的实现时,先 初始化开辟一个较小的内存用来存放联系人的信息,当内存达上限还需存放信息时,再将原先的内存扩大一些,用于存放要存的联系人,这样需要存放多少联系人就开辟多大的空间。
在实现时,我们不仅关心存放了多少个联系人,更关心通讯录的容量,因此,在上个版本的基础上,我们只需再定义一个保存容量的变量,然后添加容量判断函数,将初始化和最后销毁大小修改即可。
以下,源程序:
1.头文件部分:Contact.h
#ifndef __CONTACT_H__#define __CONTACT_H__#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>#define NAME_MAX 20#define SEX_MAX 5#define TELE_MAX 20#define ADD_MAX 50#define INIT_NUM 5 //初始化容量#define INC_NUM 3 //每次通讯录扩容大小typedef struct peo{ char name[NAME_MAX]; char sex[SEX_MAX]; int age; char tele[TELE_MAX]; char address[ADD_MAX];}peo;typedef struct contact{ peo *arr; int count;int capacity;}contact;void Add(contact *pcon); //添加联系人void check_capacity(contact *pcon);//判断容量是否满void print_contact(contact *pcon);//打印int find_position(contact *pcon);//查找指定联系人所在位置int delete_contact(contact *pcon);//删除联系人信息int find_contacts(contact *pcon);//查找并且输出这个找到的信息。int revise_contact(contact *pcon);//修改指定联系人的信息void put_empty(contact *pcon);//清空所有联系人void sort_name(contact *pcon);//以名字排序所有联系人void init_contact(contact *pcon);//初始化通讯录void print_menu();//打印菜单#endif //_CONTACT_H__
2.函数实现部分:Contact.c
#include "Contact.h"void print_menu()//打印菜单{printf("*******************************************\n");printf("***** 1.add 2.del 3.clear *****\n");printf("***** 4.modify 5.show 6.search *****\n");printf("***** 7.sort 0.exit *****\n");printf("*******************************************\n");}void init_contact(contact *pcon){pcon->count = 0;pcon->arr = (peo *)malloc(sizeof(peo)*INIT_NUM);memset(pcon->arr, 0, INIT_NUM*sizeof(peo));pcon->capacity = INIT_NUM;}void check_capacity(contact *pcon) //判断容量是否满{if (pcon->count < pcon->capacity){pcon->arr = (peo *)realloc(pcon->arr,sizeof(peo)*INC_NUM);pcon->capacity = pcon->capacity + INC_NUM;}}void Add(contact *pcon) //添加{printf("请输入名字>");scanf("%s",pcon->arr[pcon->count].name);printf("请输入性别>");scanf("%s",pcon->arr[pcon->count].sex);printf("请输入年龄>");scanf("%d",&(pcon->arr[pcon->count].age));printf("请输入电话>");scanf("%s",pcon->arr[pcon->count].tele);printf("请输入住址>");scanf("%s",pcon->arr[pcon->count].address);pcon->count++;}void print_contact(contact *pcon){int i = 0;for (i=0; i<pcon->count; i++){printf("姓名:%s性别:%s年龄:%d电话:%s地址:%s\n",pcon->arr[i].name,pcon->arr[i].sex,pcon->arr[i].age,pcon->arr[i].tele,pcon->arr[i].address);}}int find_position(contact *pcon)//查找指定联系人所在位置{int i = 0;char name[NAME_MAX];int ret = 0;printf("请输入名字:");scanf("%s",name);for (i=0; i<pcon->count; i++){ret = strcmp(name,pcon->arr[i].name);if (ret == 0){return i;}}return -1;}int delete_contact(contact *pcon)//删除指定联系人信息{int i = 0;int ret = 0;printf("删除联系人\n");ret = find_position(pcon);if (ret == -1){printf("你要删除的姓名不存在!!!\n");return -1;}else{for(i=ret; i<pcon->count-1; i++){pcon->arr[i] = pcon->arr[i+1];}pcon->count--;return 0;}}int revise_contact(contact *pcon)//修改指定联系人的信息{int ret = 0;printf("修改联系人信息>");ret = find_position(pcon);if (ret == -1){printf("你要修改的联系人不存在!!!\n");return -1;}else{printf("请输入要修改的数据:\n");printf("请输入名字>");scanf("%s",pcon->arr[ret].name);printf("请输入性别>");scanf("%s",pcon->arr[ret].sex);printf("请输入年龄>");scanf("%d",&(pcon->arr[ret].age));printf("请输入电话>");scanf("%s",pcon->arr[ret].tele);printf("请输入住址>");scanf("%s",pcon->arr[ret].address);return 0;}}void put_empty(contact *pcon)//清空所有联系人(还原成初始化状态){pcon->count = 0;pcon->arr = (peo *)malloc(sizeof(peo)*INIT_NUM);memset(pcon->arr, 0, INIT_NUM*sizeof(peo));pcon->capacity = INIT_NUM;}int find_contacts(contact *pcon)//查找并且输出这个找到的信息。{int ret = 0;ret = find_position(pcon);if (ret == -1){printf("你要查找的名字不存在!!!\n");return -1;}else{printf("姓名:%s性别:%s年龄:%d电话:%s地址:%s\n",pcon->arr[ret].name,pcon->arr[ret].sex,pcon->arr[ret].age,pcon->arr[ret].tele,pcon->arr[ret].address);return 0;}}void sort_name(contact *pcon)//以名字排序所有联系人{int i = 0;int j = 0;int flag = 0;printf("以名字进行排序(a-->z)\n");while(1){flag = 0;for (j = 0; j < pcon->count - 1; j++){if (strcmp(pcon->arr[j].name, pcon->arr[j + 1].name)>0){peo tmp = pcon->arr[j];pcon->arr[j] = pcon->arr[j + 1];pcon->arr[j + 1] = tmp;flag = 1;}}if (flag == 0)break;}}
3.测试部分:test.c
#include "Contact.h"int main(){contact con;int input = 1;init_contact(&con);do {print_menu();printf("请选择>");scanf("%d",&input);switch(input){case 1:Add(&con);break;case 2:delete_contact(&con);break;case 3:put_empty(&con);break;case 4:revise_contact(&con);break;case 5:print_contact(&con);break;case 6:find_contacts(&con);break;case 7:sort_name(&con);break;default:break;}} while (input);return 0;}
0 0
- c语言实现通讯录(动态内存开辟)
- 通讯录c语言实现(动态内存开辟&文件存储)
- 【C语言】通讯录:动态开辟内存版和文件版本
- c语言通讯录的简单实现文件版本(动态开辟内存)
- c语言动态开辟内存
- c语言动态开辟内存
- c语言动态内存开辟
- C语言实现通讯录-动态内存
- (C语言)动态内存开辟
- 通讯录动态版(动态内存开辟)
- c语言实现动态通讯录
- C语言内存管理和动态内存开辟
- 【C语言】C语言实现动态通讯录
- C语言动态内存开辟malloc, realloc ,calloc,free详解
- 动态内存开辟(c)
- 通讯录动态开辟版本
- c语言实现动态版本通讯录
- C语言指针开辟内存释放内存
- 学习Layout总结
- 字符串面试题
- PAT算法笔记(四)————锤子剪刀布
- 【bzoj3531】[SDOI2014]旅行
- android 获取HOME组件的Activity信息
- c语言实现通讯录(动态内存开辟)
- 抢救DB2数据之终极工具:db2dart
- 前端clearfix的理解
- MySQL安装配置,命令,异常纪要
- 栈与队列
- js中取json对象的键和值以及取数组的索引和值
- 装Vmware的体会
- CreateThread用法详解
- 华为机试-汽水瓶