本程程序实现了几个功能
1.增加成员 2.删除成员
3.修改 4.查找
5.排序 6.清空通讯录
程序如下所示
本程序分为三个文件
contact.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NAME_MAX 10
#define SEX_MAX 3
#define TELE_MAX 12
#define ADDR_MAX 20
#define INIT_GROSS 3
typedef struct PeoInf
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInf;
//静态版
//typedef struct Contact
//{
// PeoInf data[1000];
// int Sub;
//}Contact;
//动态版
typedef struct Contact
{
PeoInf* data;
int Sub;
int gross;
}Contact;
enum menu
{
Exit,
Add,
Dele,
Reverse,
Find,
Sort,
Dtl,
Print
};
//初始化通讯录
void Initinal_Contact(Contact* p);
//通过名称查找成员
int FindName(Contact* p);
//通讯录添加成员
void Add_Contact(Contact* p);
//通讯录删除成员
void Dele_Contact(Contact* p);
//通讯录成员信息修改
void Reverse_Contact(Contact* p);
//通讯录成员查找
void Find_Contact(Contact* p);
//对于通讯录成员排序
void Sort_Contact(Contact* p);
//打印通讯录所有成员
void Print_Contact(Contact* p);
text.c
#include"contact.h"
void menu()
{
printf("*******************************\n");
printf("*** 1.Add 2.Dele ***\n");
printf("*** 3.Reverse 4.Find ***\n");
printf("*** 5.Sort 6.Dtl ***\n");
printf("*** 7.print 0.Exit ***\n");
printf("*******************************\n");
}
void text()
{
int input = 0;
Contact contact;
Initinal_Contact(&contact);
do
{
menu();
scanf("%d", &input);
switch (input)
{
case Add:
Add_Contact(&contact);
break;
case Dele:
Dele_Contact(&contact);
break;
case Reverse:
Reverse_Contact(&contact);
break;
case Find:
Find_Contact(&contact);
break;
case Sort:
Sort_Contact(&contact);
break;
case Dtl:
Dtl_Contact(&contact);
break;
case Print:
Print_Contact(&contact);
break;
case Exit:
break;
default:
printf("输入错误,请重新输入\n");
}
} while (input);
free(contact.data);
}
int main()
{
text();
return 0;
}
contact.c
#include"contact.h"
//初始化通讯录
void Initinal_Contact(Contact* p)
{
//总量初始化
p->gross = INIT_GROSS;
//下标初始化
p->Sub = 0;
//申请一块空间并初始化
p->data = (PeoInf*)malloc(p->gross * sizeof(PeoInf));
if (p->data == NULL)
{
perror("Initial_Contact malloc");
return;
}
memset(p->data, 0, sizeof(PeoInf)*p->gross);
}
//通过姓名查找成员
int FindName(Contact* p)
{
char name[20];
scanf("%s", name);
int i = 0;
for (i = 0; i < p->Sub; i++)
{
if (strcmp(p->data[i].name, name) == 0)
return i;
}
return -1;
}
//增容
void CheckCapacity(Contact* p)
{
if (p->Sub == p->gross)
{
PeoInf* tmp = (PeoInf*)realloc(p->data, sizeof(PeoInf) * (p->gross+2));
if (tmp != NULL)
{
p->data = tmp;
printf("存储空间已满,已增容\n");
p->gross += 2;
}
}
}
//通讯录添加成员
void Add_Contact(Contact* p)
{
//空间已满 增容
CheckCapacity(p);
//成员信息录入
printf("请输入姓名:");
scanf("%s", p->data[p->Sub].name);
printf("请输入性别:");
scanf("%s", p->data[p->Sub].sex);
printf("请输入年龄:");
scanf("%d", &p->data[p->Sub].age);
printf("请输入电话:");
scanf("%s", p->data[p->Sub].tele);
printf("请输入住址:");
scanf("%s", p->data[p->Sub].addr);
printf("成员信息录入成功\n");
//成员数增加
p->Sub++;
}
//通讯录删除成员
void Dele_Contact(Contact* p)
{
//通讯录为空的情况
if (p->Sub == 0)
printf("通讯录为空,无法删除\n");
//通讯录非空的情况
else
{
printf("请输入要删除的成员姓名\n");
int ret = FindName(p);
if (ret == -1)
printf("查无此人\n");
else
{
int i = 0;
for (i = ret; i < p->Sub-1; i++)
p->data[i] = p->data[i + 1];
p->Sub--;
printf("删除成功\n");
}
}
}
//通讯录成员信息修改
void Reverse_Contact(Contact* p)
{
printf("请输入要修改的成员的姓名\n");
int ret = FindName(p);
if (ret == -1)
printf("查无此人\n");
else
{
printf("请重新输入信息\n");
printf("请输入姓名:");
scanf("%s", p->data[ret].name);
printf("请输入性别:");
scanf("%s", p->data[ret].sex);
printf("请输入年龄:");
scanf("%d", &p->data[ret].age);
printf("请输入电话:");
scanf("%s", p->data[ret].tele);
printf("请输入住址:");
scanf("%s", p->data[ret].addr);
printf("成员信息录入成功\n");
}
}
//通信录成员查找
void Find_Contact(Contact* p)
{
printf("请输入要查找的成员的姓名\n");
int ret = FindName(p);
if (ret == -1)
printf("查无此人\n");
else
{
printf("该成员的信息为\n");
//上标识
printf("%-20s %-20s %-20s %-20s %-30s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-20s %-20s %-20d %-20s %-20s\n", p->data[ret].name, p->data[ret].sex, p->data[ret].age, p->data[ret].tele, p->data[ret].addr);
}
}
//data的排序方法
int* PeoInf_Cmp(const void* e1, const void* e2)
{
return strcmp((PeoInf*)e1, (PeoInf*)e2);
}
//对于通讯录成员排序
void Sort_Contact(Contact* p)
{
qsort(p->data, p->Sub, sizeof(PeoInf), PeoInf_Cmp);
printf("已排序\n");
}
//删库
void Dtl_Contact(Contact* p)
{
memset(p->data, 0, sizeof(p->data));
p->Sub = 0;
p->gross = INIT_GROSS;
realloc(p->data, sizeof(PeoInf) * p->gross);
printf("已删库\n");
}
//打印通讯录所有成员
void Print_Contact(Contact* p)
{
if (p->Sub == 0)
printf("无联系人\n");
else
{
//上标识
printf("%-20s %-20s %-20s %-20s %-30s\n", "姓名", "性别", "年龄", "电话", "住址");
//成员打印
int i = 0;
for (i = 0; i < p->Sub; i++)
printf("%-20s %-20s %-20d %-20s %-20s\n", p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
}
}