通讯录(数组实现)

通讯录(数组实现)

#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");
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值