通讯录——动态版
2016-05-25 19:22
274 查看
实现了静态版本以后,要实现动态增容版只要在之前的基础上增加增容函数和缩容函数即可,在此主要使用realloc函数实现。
"Contact.h"
#define _CRT_SECURE_NO_WARNINGS
#ifndef _CONTACT_H__
#define _CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum po
{
EXIT,
ADD,
DELET,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
#define MAX 1000 //通讯录最大容量
#define NAME_MAX 10 //姓名最大长度
#define SEX_MAX 5 //性别
#define TELE_MAX 13 //电话
#define ADDR_MAX 20 //住址
#define DEFAULT 2 //通讯录首次的默认大小
#define ADD_SZ 2 //增容时每次增加的个数
#define DELE_SZ 1 //缩容时每次减小的个数
typedef struct Perfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}Perfo;
typedef struct Contact
{
Perfo *data; //结构体类型的指针
int size; //有效信息的个数
int capacity; //容量
}Con,*Pcon;
void _init(Pcon pcon); //初始化结构体
void _destory(Pcon pcon); //释放
void _add(Pcon pcon); //增加
void _dele(Pcon pcon); //删除
void _search(Pcon pcon); //查找
void _modify(Pcon pcon); //修改
void _display(Pcon pcon); //显示
void _clear(Pcon pcon); //清空
void _sort(Pcon pcon); //排序
#endif // _CONTACT_H__
"Contact.c"
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
void _init(Pcon pcon)
{
pcon->size = 0;
pcon->capacity = DEFAULT;
pcon->data = (Perfo*)malloc(pcon->capacity * sizeof(Perfo));
if(pcon->data == NULL)
{
printf("out of memory!\n");
exit(0);
}
memset(pcon->data,0,pcon->capacity*sizeof(Perfo));
}
void _expan(Pcon pcon)
{
Perfo *temp = (Perfo *)realloc(pcon->data,sizeof(Perfo)*(pcon->capacity+ADD_SZ));
if(temp == NULL)
{
printf("out of memory!\n");
exit(0);
}
else
{
pcon->data = temp;
}
}
void _add(Pcon pcon) //插入
{
if(pcon->size <= pcon->capacity)
{
_expan(pcon);
}
printf("请输入信息:姓名 性别 年龄 电话 住址\n");
scanf("%s",pcon->data[pcon->size].name);
scanf("%s",pcon->data[pcon->size].sex);
scanf("%d",&pcon->data[pcon->size].age);
scanf("%s",pcon->data[pcon->size].tele);
scanf("%s", pcon->data[pcon->size].addr);
pcon->size++;
printf("插入成功!\n");
}
int _find(char *name,Pcon pcon) //serch、delet、modify函数的功用函数
{
int i = 0;
for (i=0; i<pcon->size; i++)
{
if(strcmp(name,pcon->data[i].name) == 0)
return i;
}
return -1;
}
void _shrink(Pcon pcon) //减小容量
{
Perfo *temp = (Perfo *)realloc(pcon->data,(pcon->capacity-DELE_SZ)*sizeof(Perfo));
if(temp == NULL)
{
printf("电话本已空!\n");
return ;
}
else
pcon->data = temp;
}
void _dele(Pcon pcon) //删除
{
char name[NAME_MAX] = {0};
int ret = 0;
int i = 0;
printf("请输入要删除的人姓名:\n");
scanf("%s",name);
ret = _find(name,pcon);
if(ret == -1)
{
printf("不存在此人!\n");
}
else
{
for(i=ret; i<pcon->size; i++)
{
pcon->data[i] = pcon->data[i+1];
}
pcon->size--;
printf("删除成功!\n");
_shrink(pcon);
}
}
void _search(Pcon pcon) //查找
{
char name[NAME_MAX] = {0};
int ret = 0;
printf("输入要查找的人姓名:");
scanf("%s",name);
ret = _find(name,pcon);
if(ret == -1)
{
printf("不存在此人!\n");
}
else
{
printf("姓名\t性别\t年龄\t电话\t住址\n");
printf("%9s\t%6s\t%4d\t%13s\t%15s\n",
pcon->data[ret].name,
pcon->data[ret].sex,
pcon->data[ret].age,
pcon->data[ret].tele,
pcon->data[ret].addr);
}
}
void _modify(Pcon pcon) //修改
{
int ret = 0;
char name[NAME_MAX] = {0};
printf("请输入要修改的人的姓名:\n");
scanf("%s",name);
ret = _find(name,pcon);
if(ret == -1)
{
printf("不存在此人!\n");
}
else
{
printf("请输入名字:>");
scanf("%s",pcon->data[ret].name);
printf("请输入年龄:>");
scanf("%d",&(pcon->data[ret].age));
printf("请输入性别:>");
scanf("%s",pcon->data[ret].sex);
printf("请输入电话:>");
scanf("%s",pcon->data[ret].tele);
printf("请输入地址:>");
scanf("%s",pcon->data[ret].addr);
}
}
void _display(Pcon pcon) //显示
{
int n = 0;
if(pcon->size <= 0)
{
printf("电话本空!\n");
}
else
{
printf("%10s\t%4s\t%3s\t%13s\t%10s\n","姓名","性别","年龄","电话","地址");
for(n = 0;n<pcon->size;n++)
{
printf("%10s\t%4s\t%3d\t%13s\t%10s\n",
pcon->data
.name,
pcon->data
.sex,
pcon->data
.age,
pcon->data
.tele,
pcon->data
.addr);
}
}
}
void _clear(Pcon pcon) //清空
{
pcon->size= 0;
printf("电话本已空!\n");
}
void _sort(Pcon pcon) //排序————冒泡排序
{
int i = 0;
int j = 0;
for(i = 0;i<pcon->size-1;i++)
{
for(j = 0;j<pcon->size-1-i;j++)
{
Perfo temp = {0};
if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
{
temp = pcon->data[j];
pcon->data[j] = pcon->data[j+1];
pcon->data[j+1] = temp;
}
}
}
}
void _destory(Pcon pcon) //释放内存
{
if(pcon->data != NULL)
{
free(pcon->data);
pcon->data = NULL;
}
}
"test.c"
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
void menu()
{
printf("-------- 0.exit ----------\n");
printf("-------- 1.add ----------\n");
printf("-------- 2.dele ----------\n");
printf("-------- 3.search --------\n");
printf("-------- 4.modify --------\n");
printf("-------- 5.display -------\n");
printf("-------- 6.clear ---------\n");
printf("-------- 7.sort ---------\n");
}
int main()
{
Con con;
int input = 1;
_init(&con);
while(input)
{
menu();
printf("请输入要操作的数:");
scanf("%d",&input);
printf("\n");
switch(input)
{
case ADD:
_add(&con);
break;
case DELET:
_dele(&con);
break;
case SEARCH:
_search(&con);
break;
case MODIFY:
_modify(&con);
break;
case DISPLAY:
_display(&con);
break;
case CLEAR:
_clear(&con);
break;
case SORT:
_sort(&con);
break;
case EXIT:
_destory(&con);
break;
default:
printf("输入错误!\n");
break;
}
}
system("pause");
return 0;
}
"Contact.h"
#define _CRT_SECURE_NO_WARNINGS
#ifndef _CONTACT_H__
#define _CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum po
{
EXIT,
ADD,
DELET,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
#define MAX 1000 //通讯录最大容量
#define NAME_MAX 10 //姓名最大长度
#define SEX_MAX 5 //性别
#define TELE_MAX 13 //电话
#define ADDR_MAX 20 //住址
#define DEFAULT 2 //通讯录首次的默认大小
#define ADD_SZ 2 //增容时每次增加的个数
#define DELE_SZ 1 //缩容时每次减小的个数
typedef struct Perfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}Perfo;
typedef struct Contact
{
Perfo *data; //结构体类型的指针
int size; //有效信息的个数
int capacity; //容量
}Con,*Pcon;
void _init(Pcon pcon); //初始化结构体
void _destory(Pcon pcon); //释放
void _add(Pcon pcon); //增加
void _dele(Pcon pcon); //删除
void _search(Pcon pcon); //查找
void _modify(Pcon pcon); //修改
void _display(Pcon pcon); //显示
void _clear(Pcon pcon); //清空
void _sort(Pcon pcon); //排序
#endif // _CONTACT_H__
"Contact.c"
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
void _init(Pcon pcon)
{
pcon->size = 0;
pcon->capacity = DEFAULT;
pcon->data = (Perfo*)malloc(pcon->capacity * sizeof(Perfo));
if(pcon->data == NULL)
{
printf("out of memory!\n");
exit(0);
}
memset(pcon->data,0,pcon->capacity*sizeof(Perfo));
}
void _expan(Pcon pcon)
{
Perfo *temp = (Perfo *)realloc(pcon->data,sizeof(Perfo)*(pcon->capacity+ADD_SZ));
if(temp == NULL)
{
printf("out of memory!\n");
exit(0);
}
else
{
pcon->data = temp;
}
}
void _add(Pcon pcon) //插入
{
if(pcon->size <= pcon->capacity)
{
_expan(pcon);
}
printf("请输入信息:姓名 性别 年龄 电话 住址\n");
scanf("%s",pcon->data[pcon->size].name);
scanf("%s",pcon->data[pcon->size].sex);
scanf("%d",&pcon->data[pcon->size].age);
scanf("%s",pcon->data[pcon->size].tele);
scanf("%s", pcon->data[pcon->size].addr);
pcon->size++;
printf("插入成功!\n");
}
int _find(char *name,Pcon pcon) //serch、delet、modify函数的功用函数
{
int i = 0;
for (i=0; i<pcon->size; i++)
{
if(strcmp(name,pcon->data[i].name) == 0)
return i;
}
return -1;
}
void _shrink(Pcon pcon) //减小容量
{
Perfo *temp = (Perfo *)realloc(pcon->data,(pcon->capacity-DELE_SZ)*sizeof(Perfo));
if(temp == NULL)
{
printf("电话本已空!\n");
return ;
}
else
pcon->data = temp;
}
void _dele(Pcon pcon) //删除
{
char name[NAME_MAX] = {0};
int ret = 0;
int i = 0;
printf("请输入要删除的人姓名:\n");
scanf("%s",name);
ret = _find(name,pcon);
if(ret == -1)
{
printf("不存在此人!\n");
}
else
{
for(i=ret; i<pcon->size; i++)
{
pcon->data[i] = pcon->data[i+1];
}
pcon->size--;
printf("删除成功!\n");
_shrink(pcon);
}
}
void _search(Pcon pcon) //查找
{
char name[NAME_MAX] = {0};
int ret = 0;
printf("输入要查找的人姓名:");
scanf("%s",name);
ret = _find(name,pcon);
if(ret == -1)
{
printf("不存在此人!\n");
}
else
{
printf("姓名\t性别\t年龄\t电话\t住址\n");
printf("%9s\t%6s\t%4d\t%13s\t%15s\n",
pcon->data[ret].name,
pcon->data[ret].sex,
pcon->data[ret].age,
pcon->data[ret].tele,
pcon->data[ret].addr);
}
}
void _modify(Pcon pcon) //修改
{
int ret = 0;
char name[NAME_MAX] = {0};
printf("请输入要修改的人的姓名:\n");
scanf("%s",name);
ret = _find(name,pcon);
if(ret == -1)
{
printf("不存在此人!\n");
}
else
{
printf("请输入名字:>");
scanf("%s",pcon->data[ret].name);
printf("请输入年龄:>");
scanf("%d",&(pcon->data[ret].age));
printf("请输入性别:>");
scanf("%s",pcon->data[ret].sex);
printf("请输入电话:>");
scanf("%s",pcon->data[ret].tele);
printf("请输入地址:>");
scanf("%s",pcon->data[ret].addr);
}
}
void _display(Pcon pcon) //显示
{
int n = 0;
if(pcon->size <= 0)
{
printf("电话本空!\n");
}
else
{
printf("%10s\t%4s\t%3s\t%13s\t%10s\n","姓名","性别","年龄","电话","地址");
for(n = 0;n<pcon->size;n++)
{
printf("%10s\t%4s\t%3d\t%13s\t%10s\n",
pcon->data
.name,
pcon->data
.sex,
pcon->data
.age,
pcon->data
.tele,
pcon->data
.addr);
}
}
}
void _clear(Pcon pcon) //清空
{
pcon->size= 0;
printf("电话本已空!\n");
}
void _sort(Pcon pcon) //排序————冒泡排序
{
int i = 0;
int j = 0;
for(i = 0;i<pcon->size-1;i++)
{
for(j = 0;j<pcon->size-1-i;j++)
{
Perfo temp = {0};
if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
{
temp = pcon->data[j];
pcon->data[j] = pcon->data[j+1];
pcon->data[j+1] = temp;
}
}
}
}
void _destory(Pcon pcon) //释放内存
{
if(pcon->data != NULL)
{
free(pcon->data);
pcon->data = NULL;
}
}
"test.c"
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
void menu()
{
printf("-------- 0.exit ----------\n");
printf("-------- 1.add ----------\n");
printf("-------- 2.dele ----------\n");
printf("-------- 3.search --------\n");
printf("-------- 4.modify --------\n");
printf("-------- 5.display -------\n");
printf("-------- 6.clear ---------\n");
printf("-------- 7.sort ---------\n");
}
int main()
{
Con con;
int input = 1;
_init(&con);
while(input)
{
menu();
printf("请输入要操作的数:");
scanf("%d",&input);
printf("\n");
switch(input)
{
case ADD:
_add(&con);
break;
case DELET:
_dele(&con);
break;
case SEARCH:
_search(&con);
break;
case MODIFY:
_modify(&con);
break;
case DISPLAY:
_display(&con);
break;
case CLEAR:
_clear(&con);
break;
case SORT:
_sort(&con);
break;
case EXIT:
_destory(&con);
break;
default:
printf("输入错误!\n");
break;
}
}
system("pause");
return 0;
}
相关文章推荐
- Android Handler个人见解
- 面试题:一个数组插入另一个数组指定的位置
- 分布式session
- ABBYY FineReader 12 软件推荐(图片文字识别)
- 常用快捷键—Webstorm入门指南
- gradle和gradle plugin对应表
- linux使用ipvsadm实现LVS
- Ubuntu Android 开发(三) 使用SDK更新SDK 镜像
- hihocoder 1057 : Performance Log
- 正则表达式 U贪婪模式
- photoshop 常用快捷键
- mongodb 分组查询
- Mysqldump原理
- STORM_0002_在做好的zookeeper集群上搭建storm的开发环境
- Tomcat- javax.servlet.ServletException: java.lang.AbstractMethodError处理记录
- linux下编译Hive 源码并导入eclipse中(使用maven)
- 产品经理文档功底
- python 中变量的命名规范
- 第13周实践项目1分数类中的运算符重载(1)
- 使用mysql交互