通讯录(动态内存、文件)

C语言实现通讯录

功能:
  1. 增加联系人信息
  2. 删除联系人信息
  3. 修改联系人信息
  4. 查询联系人信息
  5. 显示所有联系人信息
  6. 清空联系人
  7. 将联系人按照名字进行排序
  8. 联系人信息包括姓名、年龄、性别、电话、住址
要求:
  1. 运用动态内存开辟的方法,而不是运用数组给定一个确定大小的空间
  2. 可以将联系人储存在文件中,当下一次打开时,上一次录入的联系人依旧存在
头文件

Contact.h

    #ifndef __CONTACT_H__
    #define __CONTACT_H__

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

    #define NAME_MAX 30
    #define SEX_MAX 5
    #define TEL_MAX 12
    #define ADDR_MAX 30
    #define CAPACITY 3   //第一次所开辟的空间能够储存联系人的个数
    #define ADD_CAP 2    //每次开辟空间增加所能存储联系人的个数(每次增加两个)

    typedef struct PeoInfo  //联系人信息
    {
        char name[NAME_MAX];
        int age;
        char sex[SEX_MAX];
        char tel[TEL_MAX];
        char addr[ADDR_MAX];
    }PeoInfo;

    typedef struct contact  //定义一个结构体
    {
        PeoInfo *data;  //联系人信息
        int sz;         //联系人个数
        int capacity;  //目前的容量
    }contact, *pContact;

    void init_contact(pContact pc); //初始化通讯录
    void load_contact(pContact pc); //加载通讯录
    void add_contact(pContact pc); //添加联系人信息
    void del_contact(pContact pc); //删除联系人信息
    void modify_contact(pContact pc); //修改联系人信息
    void sel_contact(pContact pc); //查询联系人信息
    void show_contact(pContact pc); //显示所有联系人的信息
    void empty_contact(pContact pc); //清空通讯录
    void sort_contact(pContact pc); //排序
    void destory_contact(pContact pc); //销毁通讯录
    void save_contact(pContact pc);  //将联系人保存在文件中

    #endif
源文件:

Contact.c

    #define _CRT_SECURE_NO_WARNINGS 1

    #include "Contact.h"

    void init_contact(pContact pc)
    {
        PeoInfo *tmp = NULL;
        assert(pc);
        pc->sz = 0;
        pc->capacity = CAPACITY;
        tmp = (PeoInfo *)calloc(pc->capacity, sizeof(PeoInfo));
        if (tmp == NULL)
        {
            perror("use calloc");
            system("pause");
            exit(EXIT_FAILURE);
        }
        pc->data = tmp;
        load_contact(pc);
    }

    int espand(pContact pc)
    {
        PeoInfo *tmp = { 0 };
        assert(pc);
        if (pc->sz == CAPACITY)
        {
            tmp = (PeoInfo *)realloc(pc->data, (pc->sz + ADD_CAP) * sizeof(PeoInfo));
            if (tmp == NULL)
            {
                printf("增容失败\n");
                return 0;
            }
            else
            {
                pc->data = tmp;
                pc->capacity += ADD_CAP;
                printf("增容成功\n");
                return 1;
            }
        }
        return 1;
    }

    void load_contact(pContact pc)
    {
        PeoInfo tmp = { 0 };
        assert(pc);
        FILE *pf = fopen("contact.txt", "rb");
        if (pf == NULL)
        {
            perror("open file for read");
            system("pause");
            exit(EXIT_FAILURE);
        }
        while (fread(&tmp, sizeof(PeoInfo), 1, pf))
        {
            if (espand(pc) == 0)
            {
                system("pause");
                exit(EXIT_FAILURE);
            }
            pc->data[pc->sz] = tmp;
            pc->sz++;
        }
        fclose(pf);
        pf = NULL;
    }

    void add_contact(pContact pc)
    {
        int judge = 0;
        assert(pc);
        judge = espand(pc);
        if (!judge)
        {
            return;
        }
        assert(pc);
        printf("请输入姓名:");
        scanf("%s", pc->data[pc->sz].name);
        printf("请输入年龄:");
        scanf("%d", &pc->data[pc->sz].age);
        printf("请输入性别:");
        scanf("%s", pc->data[pc->sz].sex);
        printf("请输入电话:");
        scanf("%s", pc->data[pc->sz].tel);
        printf("请输入住址:");
        scanf("%s", pc->data[pc->sz].addr);
        pc->sz++;
        printf("增加成功\n");
    }

    int find_data(pContact pc, char name[])
    {
        for (int i = 0; i < pc->sz; i++)
        {
            if (strcmp(pc->data[i].name, name) == 0)
            {
                return i;
            }
        }
        return -1;
    }

    void del_contact(pContact pc)
    {
        char name[NAME_MAX] = { 0 };
        int ret = 0;
        assert(pc);
        if (pc->sz == 0)
        {
            printf("通讯录为空,无法删除\n");
            return;
        }
        printf("请输入要删除人的姓名: ");
        scanf("%s", name);
        ret = find_data(pc, name);
        if (ret == -1)
        {
            printf("要删除的人不存在\n");
            return;
        }
        else
        {
            for (int i = ret; i < pc->sz - 1; i++)
            {
                pc->data[i] = pc->data[i + 1];
            }
            pc->sz--;
            printf("删除成功\n");
        }
    }

    void modify_contact(pContact pc)
    {
        char name[NAME_MAX] = { 0 };
        int ret = 0;
        assert(pc);
        if (pc->sz == 0)
        {
            printf("通讯录为空,无法修改\n");
            return;
        }
        printf("请输入要修改人的名字:");
        scanf("%s", name);
        ret = find_data(pc, name);
        if (ret == -1)
        {
            printf("要修改的人不存在\n");
            return;
        }
        else
        {
            int input = 0;
            printf("1. name   2. age   3.sex   4.tel   5.addr   0.exit\n");
            printf("请输入要修改的选项:");
            scanf("%d", &input);
            switch (input)
            {
                case 1:
                {
                    printf("请输入修改后的名字:");
                    scanf("%s", pc->data[ret].name);
                }
                break;
                case 2:
                {
                    printf("请输入修改后的年龄:");
                    scanf("%d", &pc->data[ret].age);
                }
                break;
                case 3:
                {
                    printf("请输入修改后的性别:");
                    scanf("%s", pc->data[ret].sex);
                }
                break;
                case 4:
                {
                    printf("请输入修改后的电话:");
                    scanf("%s", pc->data[ret].tel);
                }
                break;
                case 5:
                {
                    printf("请输入修改后的住址:");
                    scanf("%s", pc->data[ret].addr);
                }
                break;
                case 0:
                    printf("修改成功\n");
                    break;
                default:
                    printf("请重新输入:");
                    break;
            }
        }
    }

    void sel_contact(pContact pc)
    {
        char name[NAME_MAX] = { 0 };
        int ret = 0;
        assert(pc);
        if (pc->sz == 0)
        {
            printf("通讯录为空,无法查询\n");
            return;
        }
        printf("请输入要查询人的名字:");
        scanf("%s", name);
        ret = find_data(pc, name);
        if (ret == -1)
        {
            printf("要查询的人不存在\n");
            return;
        }
        else
        {
            printf("%6s\t%4s\t%3s\t%11s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "住址");
            printf("%6s\t%4d\t%3s\t%11s\t%15s\t\n", pc->data[ret].name,
                pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tel, pc->data[ret].addr);
        }
    }

    void show_contact(pContact pc)
    {
        assert(pc);
        printf("%6s\t%4s\t%3s\t%11s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "住址");
        for (int i = 0; i < pc->sz; i++)
        {
            printf("%6s\t%4d\t%3s\t%11s\t%15s\t\n", pc->data[i].name,
                pc->data[i].age, pc->data[i].sex, pc->data[i].tel, pc->data[i].addr);
        }
    }

    void empty_contact(pContact pc)
    {
        assert(pc);
        pc->sz = 0;
        printf("已清空\n");
    }

    void sort_contact(pContact pc)
    {
        for (int i = 0; i < pc->sz - 1; i++)
        {
            for (int j = 0; j < pc->sz - 1 - i; j++)
            {
                PeoInfo tmp = pc->data[j];
                pc->data[j] = pc->data[j + 1];
                pc->data[j + 1] = tmp;
            }
        }
        printf("排序成功\n");
    }

    void destory_contact(pContact pc)
    {
        assert(pc);
        free(pc->data);
        pc->data = NULL;
        pc->capacity = 0;
        pc->sz = 0;
    }

    void save_contact(pContact pc)
    {
        FILE *pf = fopen("contact.txt", "wb");
        assert(pc);
        if (pf == NULL)
        {
            perror("open file of write");
            system("pause");
            exit(EXIT_FAILURE);
        }
        for (int i = 0; i < pc->sz; i++)
        {
            fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
        }
        fclose(pf);
        pf = NULL;
    }
测试代码:

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "Contact.h"

void menu()
{
    printf("******************************************\n");
    printf("****    1.增加              2.删除    ****\n");
    printf("****    3.修改              4.查询    ****\n");
    printf("****    5.显示              6.清空    ****\n");
    printf("****    7.排序              0.退出    ****\n");
    printf("******************************************\n");
}

enum option
{
    EXIT,
    ADD,
    DEL,
    MODIFY,
    SEL,
    SHOW,
    EMPTY,
    SORT
};

void test()
{
    int input = 0;
    contact Con;
    init_contact(&Con);
    do
    {
        menu();
        printf("请选择: ");
        scanf("%d", &input);
        switch (input)
        {
        case ADD:
            add_contact(&Con);
            break;
        case DEL:
            del_contact(&Con);
            break;
        case MODIFY:
            modify_contact(&Con);
            break;
        case SEL:
            sel_contact(&Con);
            break;
        case SHOW:
            show_contact(&Con);
            break;
        case EMPTY:
            empty_contact(&Con);
            break;
        case SORT:
            sort_contact(&Con);
            break;
        case EXIT:
            save_contact(&Con); //退出之前将联系人保存在文件中
            destory_contact(&Con); 
            break;
        default:
            printf("输入选项不存在,请重新输入: \n");
            break;
        }
    } while (input);
}

int main()
{
    test();
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/aixiaodeshushu/article/details/81480986