通讯录(数组实现)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX 40
typedef struct
{
char name[50]; //姓名
char phone[15]; //联系手机
}AddressInfo;
//增加联系人
int AddNew_AeerInfo(AddressInfo f[]);
//输出主菜单
int Select_Menu();
//输出一个联系人的信息
void Output_AddInfo(AddressInfo addrinfo);
//查找
int Find_AddrInfo(AddressInfo f[], int n, char *k);
//删除联系人
int Delete_AddrInfo(AddressInfo f[], int countPerson);
//插入联系人
int Insert_AddrInfo(AddressInfo f[], int countPerson);
//保存文件
void Save_AddrInfo(AddressInfo f[], int countPerson);
//查找联系人
void Search_AddInfo(AddressInfo f[],int countPerson);
//从文件读取联系人信息
int Read_AddrInfo(AddressInfo f[]);
//输出所有联系人信息
void DisplayAll_AddrInfo(AddressInfo f[], int countPerson);
int main()
{
AddressInfo addrinfo[MAX];
int countPerson = 0;
do
{
switch (Select_Menu())
{
case 0: //增加联系人
countPerson = AddNew_AeerInfo(addrinfo);
break;
case 1: //删除联系人
countPerson = Delete_AddrInfo(addrinfo, countPerson);
break;
case 2: //查找联系人
Search_AddInfo(addrinfo, countPerson);
break;
case 3: //插入联系人
countPerson = Insert_AddrInfo(addrinfo, countPerson);
break;
case 4: //保存联系人
Save_AddrInfo(addrinfo, countPerson);
break;
case 5: //从文件加载联系人
countPerson = Read_AddrInfo(addrinfo);
break;
case 6: //显示所有联系人
DisplayAll_AddrInfo(addrinfo, countPerson);
break;
case 7: //退出循环
exit(0);
break;
}
} while (1);
return 0;
}
//增加联系人
int AddNew_AeerInfo(AddressInfo f[])
{
int i=0, n=0;
char *s = 0;
printf("请输入当前增加联系人总个数\n");
scanf("%d", &n);
printf("请输入记录:\n");
printf("姓名 联系电话\n");
printf("====================\n");
for (i=0; i<n; i++)
{
scanf("%s", f[i].name);
scanf("%s", f[i].phone);
printf("====================\n");
}
return n;
}
//输出主菜单
int Select_Menu()
{
char s[80]; //以一行80个字符为限,多余部分不从键盘读取
int c = 0;
system("cls");
printf("\n");
printf(" *****************************************\n");
printf(" * *\n");
printf(" * 通 讯 录 管 理 系 统 *\n");
printf(" * 主 菜 单 *\n");
printf(" * 0.增加联系人信息 *\n");
printf(" * 1.删除联系人信息 *\n");
printf(" * 2.查找联系人信息 *\n");
printf(" * 3.插入联系人信息 *\n");
printf(" * 4.保存联系人信息 *\n");
printf(" * 5.从文件加载联系人信息 *\n");
printf(" * 6.显示所有联系人信息 *\n");
printf(" * 7.退出管理系统 *\n");
printf(" * *\n");
printf(" *****************************************\n\n");
do
{
printf("\n 请选择对应的序号(0~7): ");
scanf("%s", s);
c = atoi(s); //将输入的字符串转化为整数
} while (c<0 || c>7); //选择项不在0-7之间重新输入
return c; //返回选择项,主程序根据该数调用相应的函数
}
//输出一个联系人的信息
void Output_AddInfo(AddressInfo addrinfo)
{
printf("\n\n ********************\n");
printf(" 姓名\t联系电话\n");
printf(" --------------------\n");
printf(" %s\t%s\n", addrinfo.name, addrinfo.phone);
printf(" ********************\n\n");
printf("按任意键继续...\n");
getch();
}
//查找
int Find_AddrInfo(AddressInfo f[], int n, char *k)
{
int i;
for (i=0; i<n; i++)
{
if (strcmp(k, f[i].phone) == 0)
return i;
}
return i;
}
//删除联系人
int Delete_AddrInfo(AddressInfo f[], int countPerson)
{
char k[15];
int i, j;
int ch = 0;
printf("请输入要删除的联系人的手机号:\n");
scanf("%s", k);
i = Find_AddrInfo(f, countPerson, k); //调用查询函数
if (i > countPerson - 1)
printf("没有找到要删除的联系人。\n");
else
{
Output_AddInfo(f[i]); //调用输出函数显示该条记录信息
printf("输入1确认删除,输入0不删除{1/0): \n");
scanf("%d", &ch);
if (ch == 1)
{
for (j=i+1; j<countPerson; j++) //删除该记录,实际后续记录前移
{
memcpy(&(f[j-1]), &f[j], sizeof(AddressInfo));
}
countPerson--; //记录数减1
}
}
return countPerson;
}
//插入联系人
int Insert_AddrInfo(AddressInfo f[], int countPerson)
{
int i, j;
char s[15]; //确定插入在哪个记录之前
AddressInfo tempinfo;
memset(&tempinfo, 0, sizeof(AddressInfo));
printf("请输入记录:\n");
printf("姓名 联系电话\n");
printf("====================\n");
scanf("%s", tempinfo.name);
scanf("%s", tempinfo.phone);
printf("====================\n");
printf("要在哪个联系人信息前面插入,请输入该联系人的手机号:\n");
scanf("%s", s);
i = Find_AddrInfo(f, countPerson, s);
for (j=countPerson-1; j>=i; j--) //从最后一个节点开始向后移动一条
{
memcpy(&(f[j+1]), &(f[j]), sizeof(AddressInfo));
}
memcpy(&(f[i]), &(tempinfo), sizeof(AddressInfo));
countPerson++;
return countPerson;
}
//保存文件
void Save_AddrInfo(AddressInfo f[], int countPerson)
{
int i;
FILE *fp;
if ((fp=fopen("AddrInfo.txt", "wb")) == NULL)
{
printf("不能打开文件!\n");
exit(1);
}
printf("\n**********开始保存文件**********\n");
fprintf(fp, "%d", countPerson); //将记录数写入文件
fprintf(fp, "\r\n"); //将换行符号写入文件
for (i=0; i<countPerson; i++)
{
fprintf(fp, "%s\t%s", f[i].name, f[i].phone);
fprintf(fp, "\r\n"); //记录每行一个回车换行符
}
fclose(fp);
printf("\n**********保存文件成功**********\n");
printf("按任意键继续...\n");
getch();
}
//查找联系人
void Search_AddInfo(AddressInfo f[],int countPerson)
{
int i=0; //保存查找到的节点序号
char k[15]; //记录要查找的联系人手机号
printf("请输入要查找的联系人手机号:\n");
scanf("%s", k);
i = Find_AddrInfo(f, countPerson, k);
if ((i+1) > countPerson)
printf("未找到,请确认是否有此用户存在!\n");
else
Output_AddInfo(f[i]);
}
//从文件读取联系人信息
int Read_AddrInfo(AddressInfo f[])
{
FILE *fp = NULL;
int i = 0, countPerson = 0;
if ((fp=fopen("AddrInfo.txt", "rb")) == NULL)
{
printf("不能打开文件!\n");
exit(1);
}
fscanf(fp, "%d", &countPerson); //从文件读取联系人总数
printf("\n**********开始读取文件**********\n");
for (i=0; i<countPerson; i++)
{
fscanf(fp, "%s\t%s\n", f[i].name, f[i].phone);
}
fclose(fp);
printf("\n**********读取文件成功**********\n");
return countPerson;
}
//输出所有联系人信息
void DisplayAll_AddrInfo(AddressInfo f[], int countPerson)
{
int i;
for (i=0; i<countPerson; i++)
{
Output_AddInfo(f[i]);
}
printf("\n");
}