您的位置:首页 > 其它

通讯录的实现(动态实现)

2016-05-17 00:56 351 查看
在静态实现1000人通讯录的基础上,这次我们来动态实现,可以动态开辟内存空间,不受人数的限制,但此处的不受限制是相对的,如果内存用完了,那也不能再添加联系人了;

这次我们在静态实现的基础上再次优化,使用了枚举,以及对每次执行完一个功能时的页面进行优化,让使用者不再麻烦的去看最顶上的操作目录;

首先定义了头文件:contacts.h

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>

#define MAX 2
#define NAME_LENGTH 20
#define SEX_LENGTH 5
#define AGE_LENGTH 3
#define TELE_LENGTH 20
#define ADDR_LENGTH 30

/*
结构体 用于储存通讯录人员信息
*/
typedef struct ContactsUser
{
char name[NAME_LENGTH];
char sex[SEX_LENGTH];
/*
VS编译器下scanf_s对于长度有安全保护 因此采用字符数组保存年龄
*/
char age[AGE_LENGTH];
char tele[TELE_LENGTH];
char addr[ADDR_LENGTH];
}ContactsUser;
//
//    结构体 将上一个结构体装起来 同时创建变量记录人数
//
typedef struct Contacts
{

ContactsUser *person;
int user_count;//确定当前容量
int capa;//电话本容量,动态
}Contacts,*pContacts;

enum op
{
EXIT,
ADD,
DELE,
CLEAR,
FID,
MODIFY,
SHOW,
SORT
};

//typedef struct Contacts *pContacts;

int add_contacts(pContacts pcon);//添加函数
int dele_contacts(pContacts pcon);//删除函数
int clear_contacts(pContacts pcon);//清空函数
int find_contacts(pContacts pcon);//查找函数
int modify_contacts(pContacts pcon);//修改函数
void sort_contacts(pContacts pcon);//排序函数
void show_contacts(pContacts pcon);//显示函数
void check(pContacts pcon);
void menu();//主菜单


然后建立test1.c文件:

#include "contacts.h"
void menu()
{
printf("------------ 服务菜单 ---------------\n");
printf("-------------------------------------\n");
printf("           1.添加联系人\n");
printf("           2.删除联系人\n");
printf("           3.清空联系人\n");
printf("           4.查找联系人\n");
printf("           5.修改联系人\n");
printf("           6.显示所有联系人\n");
printf("           7.排序联系人\n");
printf("           0.退出\n");
printf("-------------------------------------\n");
}
/*
查询实体函数  用于将输入的用户特征和储存进行比较(strcmp)
方便其他功能函数的调用
*/
int find_entry(pContacts pcon)
{

int i = 0;
char name[NAME_LENGTH];
printf("请输入名字:");
scanf_s("%s", name,NAME_LENGTH);
for (i = 0; i < pcon->user_count; i++)
{
if (strcmp(pcon->person[i].name, name) == 0) //输入和存储进行比较
{
return i;
}
}
return -1;
}

/*
增添函数
*/
int add_contacts(pContacts pcon)
{
if (pcon->user_count==pcon->capa)
{
ContactsUser *tmp = (ContactsUser*)realloc (pcon->person,(pcon->capa +3)*sizeof(ContactsUser));
if(tmp == NULL)
{
printf("内存不足\n");
return -1;
}
else
{
pcon->person = tmp;
(pcon->capa)+= 3;
return 1;
}

}
else
{
printf("请输入名字:");
/*
scanf_s安全函数  应该添加控制长度的参数
*/
scanf_s("%s", pcon->person[pcon->user_count].name, NAME_LENGTH);
/*
数组从下标为0到下标为user_count-1 ,则在user_count处操作
*/
printf("请输入性别:");
scanf_s("%s", pcon->person[pcon->user_count].sex, SEX_LENGTH);
printf("请输入年龄:");
scanf_s("%s", pcon->person[pcon->user_count].age, AGE_LENGTH);
printf("请输入电话:");
scanf_s("%s", pcon->person[pcon->user_count].tele,TELE_LENGTH);
printf("请输入地址:");
scanf_s("%s", pcon->person[pcon->user_count].addr, ADDR_LENGTH);
printf("添加成功!\n");

pcon->user_count++;//添加结束 人员数目增加1
return 1;
}

}

/*
删除函数
*/
int dele_contacts(pContacts pcon)
{
int i = 0;
int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置

if (ret != -1)
{
for (i = ret; i < pcon->user_count - 1; i++)
{
pcon->person[i] = pcon->person[i + 1];
}
printf("删除成功!\n");
pcon->user_count--;
return 1;

}
else
{
printf("找不到联系人\n");
return -1;
}
}

/*
清空函数
*/
int clear_contacts(pContacts pcon)
{
/*memset(pcon->person,0,MAX);*/
/*
memset函数 在一段内存中填充给定的值
是对较大结构体或数组清零的最快方法
*/
pcon->user_count = 0;//count 赋值0  进行清零
printf("清空成功!");
return 1;
}

/*
查找函数
*/
int find_contacts(pContacts pcon)
{
int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置
if (ret != -1)
{
printf("该联系人的信息为:\n");
printf("姓名:%-5s\n", pcon->person[ret].name, NAME_LENGTH);
printf("性别:%-5s\n", pcon->person[ret].sex, SEX_LENGTH);
printf("年龄:%-5s\n", pcon->person[ret].age, AGE_LENGTH);
printf("电话:%-5s\n", pcon->person[ret].tele, TELE_LENGTH);
printf("地址:%-5s\n", pcon->person[ret].addr, ADDR_LENGTH);
return 1;
}
else
{
printf("找不到该联系人\n");
return -1;
}
}

/*
修改函数
*/
int modify_contacts(pContacts pcon)
{
int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置
if (ret != -1)
{
printf("请重新编辑该联系人信息:\n");
printf("请输入姓名:");
scanf_s("%s", pcon->person[ret].name, NAME_LENGTH);
printf("请输入性别:");
scanf_s("%s", pcon->person[ret].sex, SEX_LENGTH);
printf("请输入年龄:");
scanf_s("%s", pcon->person[ret].age, AGE_LENGTH);
printf("请输入电话:");
scanf_s("%s", pcon->person[ret].tele, TELE_LENGTH);
printf("请输入地址:");
scanf_s("%s", pcon->person[ret].addr, ADDR_LENGTH);
printf("修改成功!");
return 1;
}
else
{
printf("找不到该联系人\n");
return -1;
}
}

/*
显示函数
*/
void show_contacts(pContacts pcon)
{
int i = 0;
printf("%10s\t%4s\t%3s\t%13s\t%10s\n","姓名","性别","年龄","电话","地址");
for (i = 0;i< pcon->user_count;i++)
{
printf("%10s\t%4s\t%3s\t%13s\t%10s\n", pcon->person[i].name, pcon->person[i].sex, pcon->person[i].age,pcon->person[i].tele, pcon->person[i].addr);
}
printf("\n");
}

//排序函数
void sort_contacts(pContacts pcon)
{
int i=0;
int j=0;
for(i=0;i<(pcon->user_count-1);i++)
{

for(j=0;j<(pcon->user_count-1)-i;j++)
{
if((strcmp(pcon->person[j].name,pcon->person[j+1].name))>0)
{
ContactsUser  tmp=pcon->person[j];
pcon->person[j]=pcon->person[j+1];
pcon->person[j+1]=tmp;

}
}
}
printf("排序完成!");

}


test2.c

#include "contacts.h"

/*
主函数
*/
int main()
{
int input = 1;//定义一个输入初始化
Contacts user = {0};
user.capa = MAX;
user.user_count = 0;//为user_count进行初始化
user.person = (ContactsUser*)malloc(sizeof(ContactsUser)*MAX);
if(user.person==NULL)
{
printf("内存不足\n");
}
else
{
menu();

while (input)
{
printf("\n  请选择数字编号:\n");
scanf("%d", &input);
switch (input)  //switch-case 使用不同的功能函数
{
case ADD:
add_contacts(&user);
menu();
break;
case DELE:
dele_contacts(&user);
menu();
break;
case CLEAR:
clear_contacts(&user);
menu();
break;
case FID:
find_contacts(&user);
menu();
break;
case MODIFY:
modify_contacts(&user);
menu();
break;
case SHOW:
show_contacts(&user);
menu();
break;
case SORT:
show_contacts(&user);
menu();
break;
case EXIT:
printf("感谢使用!\n");
break;
default:
printf("输入有误!\n");
break;
}
}
}
free(user.person);
user.person=NULL;

return 0;
}
ok!!!come on!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: