您的位置:首页 > 其它

通讯录——动态版

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  通讯录动态增长