通讯录功能:
- 保存1000个联系人的信息
- 增加联系人
- 删除联系人
- 修改联系人
- 查找联系人
一个人的信息包含:
- 名字
- 性别
- 年龄
- 电话
- 住址
contact.h
#include<stdio.h>
#include<string.h>
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
enum option {//将这些操作对应为数字,将原本case后面的数字换为操作名,增加代码可读性
exit,//0
add,//1
del,//2
search,//3
modify,//4
print//5
};
typedef struct peoinfo {
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];//手机号码11位,最后一位'\0'
char addr[ADDR_MAX];
}peoinfo;
typedef struct contact {//结构体的嵌套定义
peoinfo data[MAX]; //存放1000个人的信息
int sz; //记录已经保存在同讯录中信息的个数
}contact;
//初始化通讯录
void initcontact(contact* p);
//添加联系人
void addcontact(contact* p);
//打印通讯录
void printcontact(contact* p);
//删除联系人
void delcontact(contact* p);
//查找指定联系人
void searchcontact(const contact* p);
//修改指定联系人
void modifycontact(contact* p);
contact.c
#include"contact.h"
void initcontact(contact* p) {
p->sz = 0;
memset(p->data,0, sizeof(p->data));
}
void addcontact(contact* p) {
if (p->sz == MAX) {
printf("通讯录已满,无法添加\n");
return;
}
//录入信息
printf("请输入名字:");
scanf("%s", p->data[p->sz].name);//此处name是数组首地址,在scanf中不用取地址
printf("请输入性别:");
scanf("%s", p->data[p->sz].sex);
printf("请输入年龄:");
scanf("%d", &(p->data[p->sz].age));//此处的age是一个变量,在函数scanf中要取地址
printf("请输入电话:");
scanf("%s", p->data[p->sz].tele);
printf("请输入地址:");
scanf("%s", p->data[p->sz].addr);
p->sz++;
printf("添加成功\n");
}
void printcontact(const contact* p) {
int i = 0;
printf("%-10s %-5s %-3s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0;i < p->sz;i++) {
printf("%-10s %-5s %-3d %-12s %-20s\n", p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
}
}
int findbyname(const contact* p, char name[]) {
int i = 0;
for (i = 0;i < p->sz;i++) {
if (0 == strcmp(p->data[i].name, name)) {
return i;
}
}
return -1;
}
void delcontact(contact* p) {
if (p->sz == 0) {
printf("通讯录以空,无法删除\n");
return;
}
char name[20] = { 0 };
printf("请输入要删除的联系人\n");
scanf("%s", name);
int pos = findbyname(p , name);
if (pos == -1) {
printf("要删除的联系人不在\n");
return;
}
int j = 0;
for (j = pos;j < p->sz-1 ;j++) {
p->data[j] = p->data[j + 1];
}
p->sz--;
printf("删除成功\n");
}
void searchcontact(const contact* p) {
if (p->sz == 0) {
printf("通讯录为空\n");
return;
}
char name[20] = { 0 };
printf("请输入要查找的联系人\n");
scanf("%s", name);
int pos = findbyname(p, name);
if (pos == -1) {
printf("要查找的联系人不在\n");
return;
}
printf("%-10s %-5s %-3s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-10s %-5s %-3d %-12s %-20s\n", p->data[pos].name, p->data[pos].sex, p->data[pos].age, p->data[pos].tele, p->data[pos].addr);
}
void modifycontact(contact* p) {
char name[20] = { 0 };
printf("请输入要修改的联系人\n");
scanf("%s", name);
int pos = findbyname(p, name);
if (pos == -1) {
printf("要修改的联系人不在\n");
return;
}
printf("请输入名字:");
scanf("%s", p->data[pos].name);
printf("请输入性别:");
scanf("%s", p->data[pos].sex);
printf("请输入年龄:");
scanf("%d", &(p->data[pos].age));
printf("请输入电话:");
scanf("%s", p->data[pos].tele);
printf("请输入地址:");
scanf("%s", p->data[pos].addr);
printf("修改成功\n");
}
test.c
#include"contact.h"
void menu() {
printf("*********************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("**** 5.print 0.exit ****\n");
printf("*********************************\n");
}
void test() {
int input = 0;
//创建通讯录
contact con;
//初始化通讯录
initcontact(&con);
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case add:
addcontact(&con);
break;
case del:
delcontact(&con);
break;
case search:
searchcontact(&con);
break;
case modify:
modifycontact(&con);
break;
case print:
printcontact(&con);
break;
case exit:
printf("退出系统\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}
动态增长版本
在上一个通讯录中我们默认设定了一个元素个数是1000,每个元素都是一个结构体的数组
实际上我们用不了这么多空间,这样做比较耗空间,我们是否能做一个随着我们添加人数的增多,容量也增大的方式?
contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
//通讯录初始化默认的人数
#define INITIAL_SZ 3
enum option { //将这些操作对应为数字,将原本case后面的数字换为操作名,增加代码可读性
Exit,//0
add,//1
del,//2
search,//3
modify,//4
print//5
};
typedef struct peoinfo {
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];//手机号码11位,最后一位'\0'
char addr[ADDR_MAX];
}peoinfo;
//静态的版本
//typedef struct contact {//结构体的嵌套定义
// peoinfo data[MAX]; //存放1000个人的信息
// int sz; //记录已经保存在同讯录中信息的个数
//}contact;
//动态版本
typedef struct contact {
peoinfo* data;
int sz;
int capacity;
}contact;
//初始化通讯录
void initcontact(contact* p);
//销毁通讯录
void destroy(contact* p);
//添加联系人
void addcontact(contact* p);
//打印通讯录
void printcontact(contact* p);
//删除联系人
void delcontact(contact* p);
//查找指定联系人
void searchcontact(const contact* p);
//修改指定联系人
void modifycontact(contact* p);
contact.c
#include"contact.h"
//静态版本
//void initcontact(contact* p) {
// p->sz = 0;
// memset(p->data,0, sizeof(p->data));
//}
//动态版本
void initcontact(contact* p)
{
p->sz = 0;
p->capacity = INITIAL_SZ;
p->data = (peoinfo*)malloc(p->capacity*sizeof(peoinfo));//开辟空间
if (p->data == NULL) {
perror("initcontact");
return;
}
memset(p->data, 0, p->capacity * sizeof(peoinfo));//初始化
}
void change_capacity(contact* p) {
if (p->sz == p->capacity) {
peoinfo* tmp =(peoinfo*)realloc(p->data ,(p->capacity + 2) * sizeof(peoinfo));
if (tmp != NULL) {
p->data = tmp;
}
p->capacity += 2;
printf("增容成功\n");
}
}
void addcontact(contact* p) {
//静态版本
//if (p->sz == MAX) {
// printf("通讯录已满,无法添加\n");
// return;
//}
//动态版本
change_capacity(p);
//录入信息
printf("请输入名字:");
scanf("%s", p->data[p->sz].name);//此处name是数组首地址,在scanf中不用取地址
printf("请输入性别:");
scanf("%s", p->data[p->sz].sex);
printf("请输入年龄:");
scanf("%d", &(p->data[p->sz].age));//此处的age是一个变量,在函数scanf中要取地址
printf("请输入电话:");
scanf("%s", p->data[p->sz].tele);
printf("请输入地址:");
scanf("%s", p->data[p->sz].addr);
p->sz++;
printf("添加成功\n");
}
void printcontact(const contact* p) {
int i = 0;
printf("%-10s %-5s %-3s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0;i < p->sz;i++) {
printf("%-10s %-5s %-3d %-12s %-20s\n", p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
}
}
int findbyname(const contact* p, char name[]) {
int i = 0;
for (i = 0;i < p->sz;i++) {
if (0 == strcmp(p->data[i].name, name)) {
return i;
}
}
return -1;
}
void delcontact(contact* p) {
if (p->sz == 0) {
printf("通讯录以空,无法删除\n");
return;
}
char name[20] = { 0 };
printf("请输入要删除的联系人\n");
scanf("%s", name);
int pos = findbyname(p , name);
if (pos == -1) {
printf("要删除的联系人不在\n");
return;
}
int j = 0;
for (j = pos;j < p->sz-1 ;j++) {
p->data[j] = p->data[j + 1];
}
p->sz--;
printf("删除成功\n");
}
void searchcontact(const contact* p) {
if (p->sz == 0) {
printf("通讯录为空\n");
return;
}
char name[20] = { 0 };
printf("请输入要查找的联系人\n");
scanf("%s", name);
int pos = findbyname(p, name);
if (pos == -1) {
printf("要查找的联系人不在\n");
return;
}
printf("%-10s %-5s %-3s %-12s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-10s %-5s %-3d %-12s %-20s\n", p->data[pos].name, p->data[pos].sex, p->data[pos].age, p->data[pos].tele, p->data[pos].addr);
}
void modifycontact(contact* p) {
char name[20] = { 0 };
printf("请输入要修改的联系人\n");
scanf("%s", name);
int pos = findbyname(p, name);
if (pos == -1) {
printf("要修改的联系人不在\n");
return;
}
printf("请输入名字:");
scanf("%s", p->data[pos].name);
printf("请输入性别:");
scanf("%s", p->data[pos].sex);
printf("请输入年龄:");
scanf("%d", &(p->data[pos].age));
printf("请输入电话:");
scanf("%s", p->data[pos].tele);
printf("请输入地址:");
scanf("%s", p->data[pos].addr);
printf("修改成功\n");
}
void destroycontact(contact* p) {
free(p->data);
p->data = NULL;
p->sz = 0;
p->capacity = 0;
}
test.c
#include"contact.h"
void menu() {
printf("*********************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("**** 5.print 0.exit ****\n");
printf("*********************************\n");
}
void test() {
int input = 0;
//创建通讯录
contact con;
//初始化通讯录
initcontact(&con);
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case add:
addcontact(&con);
break;
case del:
delcontact(&con);
break;
case search:
searchcontact(&con);
break;
case modify:
modifycontact(&con);
break;
case print:
printcontact(&con);
break;
case Exit:
printf("退出系统\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}