【C语言】简单实现通讯录

【C语言】简单实现通讯录

已实现功能

  新建联系人
  删除指定联系人
  查找指定联系人
  修改指定联系人
  显示所有联系人
  清空所有联系人
  按姓名排序联系人

待实现功能

  通讯录加密
  通讯录联网保存
  通讯录导入导出

实现效果展示

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

头文件

#ifndef __TONYXUNLU_H__
#define __TONGXUNLU_H__

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>

#define DEFAULT 2      //通信录默认大小
#define NAME_MAX 10
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDRESS_MAX 50   
#define ADD_NUM 2      //每次扩容默认步长

enum OPTION
{
    EXIT,
    ADD,
    DEL,
    FIND,
    MODIFY,
    DISPLAY,
    EMPTY,
    SORT
};

typedef struct PLEINFO  //通讯录个人信息结构体
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    unsigned char age;
    char telephone[TELE_MAX];
    char address[ADDRESS_MAX];
}PLEINFO;

typedef struct CONTACT   //通讯录结构体
{
    unsigned int count;
    unsigned int capacity;
    PLEINFO *data;
}CONTACT;

CONTACT my_contact;

void InitContact(CONTACT *pcontact);    //初始化通讯录

void Modify(CONTACT *pcontact);   //修改联系人信息

void SubCapacity(CONTACT *pcontact);  //核查缩小通讯录容量

void AddCapacity(CONTACT *pcontact);  //核查增加通讯录容量

void Add(CONTACT *pcontact);  //新建联系人

void Del(CONTACT *pcontact);   //删除联系人

int Find(CONTACT *pcontact);  //查找联系人

void Display(CONTACT *pcontact);  //显示所有联系人

void Sort(CONTACT *pcontact);  //按姓名排序联系人

void Empty(CONTACT *pcontact);   //清空联系人

void menu();  //菜单

void Exit(CONTACT *pcontact);  //关闭通讯录

#endif //_TONGXUNLU_H__

功能实现文件

#include "tongxunlu.h"


void InitContact(CONTACT *pcontact)    //初始化通讯录
{
    pcontact->capacity = DEFAULT;
    pcontact->count = 0;
    pcontact->data = (PLEINFO *)calloc(sizeof(PLEINFO), pcontact->capacity);
    if (pcontact->data == NULL)
    {
        printf("\n初始化通讯录失败\n");
        system("pause");
        exit(-1);
    }
}

void SubCapacity(CONTACT *pcontact)  //核查缩小通讯录容量
{
    if (pcontact->capacity > pcontact->count && pcontact->count != 0)
    {
        int result = pcontact->capacity - pcontact->count;
        PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity - result)*sizeof(PLEINFO));
        if (tmp != NULL)
        {
            pcontact->data = tmp;
            tmp = NULL;
            pcontact->capacity -= result;
        }
        else
        {
            perror("缩容失败");
            Exit(pcontact);
            exit(-1);
        }
    }
}

void AddCapacity(CONTACT *pcontact)  //核查增加通讯录容量
{
    if (pcontact->capacity == pcontact->count)
    {
        PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity + ADD_NUM)*sizeof(PLEINFO));
        if (tmp != NULL)
        {
            pcontact->data = tmp;
            tmp = NULL;
            pcontact->capacity += ADD_NUM;
        }
        else
        {
            perror("扩容失败");
            Exit(pcontact);
            exit(-1);
        }
    }
}

void Add(CONTACT *pcontact)  //新建联系人
{
    AddCapacity(pcontact);

    printf("\n\t新建联系人\n\n");
    printf("请输入联系人姓名:>");
    scanf("%s", (pcontact->data[pcontact->count].name));
    printf("请输入联系人性别:>");
    scanf("%s", (pcontact->data[pcontact->count].sex));
    printf("请输入联系人年龄:>");
    scanf("%d", &((pcontact->data[pcontact->count].age)));
    printf("请输入联系人电话:>");
    scanf("%s", (pcontact->data[pcontact->count].telephone));
    printf("请输入联系人住址:>");
    scanf("%s", (pcontact->data[pcontact->count].address));

    ++pcontact->count;
    printf("\n\t联系人增加成功\n");
    system("pause");
}

void Del(CONTACT *pcontact)   //删除联系人
{
    int i = Find(pcontact);

    if (i == -1)
    {
        printf("\n没有找到该联系人\n");
        system("pause");
        return;
    }
    else
    {
        pcontact->data[i] = pcontact->data[--pcontact->count];
    }
    SubCapacity(pcontact);
    printf("\n删除成功\n");
    system("pause");
}

unsigned int Find(CONTACT *pcontact)  //查找联系人
{
    char name[10];
    unsigned int i = 0;

    printf("请输入你要操作的联系人的姓名:>");
    scanf("%s", name);

    for (i = 0; i < pcontact->count; i++)
    {
        if (!strcmp(pcontact->data[i].name, name))
        {
            return i;
        }
    }
    return -1;
}

void Modify(CONTACT *pcontact)   //修改联系人信息
{
    int i = Find(pcontact);

    if (i == -1)
    {
        printf("\n没有找到该联系人\n");
        system("pause");
        return;
    }
    else
    {
        int input = 0;
        printf("\n---------------------------------------------\n");
        printf("\n\t已找到该联系人\n\n姓名:%s\n性别:%s\n年龄:%d\n电话:%s\n住址:%s\n",
            pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
            pcontact->data[i].telephone, pcontact->data[i].address);
        printf("\n---------------------------------------------\n");
        do
        {
            printf("\n1.姓名\t2.性别\t3.年龄\t4.电话\t5.住址\t0.退出\n\n你要修改联系人的哪一个信息呢?:>");
            scanf("%d", &input);
            switch (input)
            {
                case 1:
                {
                    printf("姓名修改为:>");
                    scanf("%s", pcontact->data[i].name);
                }
                    break;
                case 2:
                {
                    printf("性别修改为:>");
                    scanf("%s", pcontact->data[i].sex);
                }
                    break;
                case 3:
                {
                    printf("年龄修改为:>");
                    scanf("%d", &(pcontact->data[i].age));
                }
                    break;
                case 4:
                {
                    printf("电话修改为:>");
                    scanf("%s", pcontact->data[i].telephone);
                }
                    break;
                case 5:
                {
                    printf("住址修改为:>");
                    scanf("%s", pcontact->data[i].address);
                }
                    break;
                case 0: printf("\n退出修改\n");
                    break;
                default: printf("\n选择错误,请重新选择\n");
                    break;
            }
        } while (input);
    }
    printf("\n联系人修改成功\n");
    system("pause");
}

void Display(CONTACT *pcontact)  //显示所有联系人
{
    unsigned int i = 0;

    printf("\n通讯录当前 存放联系人数量/总容量\t%d/%d\n", pcontact->count, pcontact->capacity);
    printf("\n---------------------------------------------\n");
    printf("\n%-10s%-8s%-9s%-15s%-50s\n\n", "姓名", "性别", "年龄", "电话", "住址");
    for (i = 0; i < pcontact->count; i++)
    {
        printf("%-10s%-8s%-9d%-15s%-50s\n",
            pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
            pcontact->data[i].telephone, pcontact->data[i].address);
    }
    printf("\n---------------------------------------------\n");
    system("pause");
}

void Empty(CONTACT *pcontact)   //清空联系人
{

    PLEINFO *tmp = (PLEINFO *)calloc(sizeof(PLEINFO), DEFAULT);
    if (!tmp)
    {
        printf("\n清空失败,请稍后重新清空\n");
        system("pause");
        return;
    }

    free(pcontact->data);
    pcontact->data = tmp;
    tmp = NULL;

    pcontact->capacity = DEFAULT;
    pcontact->count = 0;
    printf("\n联系人清空成功\n");
    system("pause");
}

void Sort(CONTACT *pcontact)  //按姓名排序联系人  //冒泡排序
{
    unsigned int i = 0;

    for (i = 0; i < pcontact->count - 1; i++)
    {
        unsigned int j = 0;
        for (j = 0; j < pcontact->count - i - 1; j++)
        {
            if (strcmp(pcontact->data[j].name, pcontact->data[j + 1].name) > 0)
            {
                PLEINFO tmp = pcontact->data[j];
                pcontact->data[j] = pcontact->data[j + 1];
                pcontact->data[j + 1] = tmp;
            }
        }
    }
}

void menu()  //菜单
{
    printf("***********************\n");
    printf("***   1.新建联系人  ***\n");
    printf("*** 2.删除指定联系人***\n");
    printf("*** 3.查找指定联系人***\n");
    printf("*** 4.修改指定联系人***\n");
    printf("*** 5.显示所有联系人***\n");
    printf("*** 6.清空所有联系人***\n");
    printf("****7.排序所有联系人***\n");
    printf("****  0.退出通讯录  ***\n");
    printf("***********************\n\n");
}

void Exit(CONTACT *pcontact)  //关闭通讯录
{
    free(pcontact->data);
    pcontact->data = NULL;
    pcontact->capacity = 0;
    pcontact->count = 0;
    printf("\n已退出通讯录\n");
    system("pause");
}

主函数文件

#include "tongxunlu.h"


int main()
{
    int input = 0;

    InitContact(&my_contact);
    do
    {
        system("cls");
        menu();
        printf("你想干嘛?:>");
        scanf("%d", &input);

        switch (input)
        {
        case EXIT: Exit(&my_contact);
            break;
        case ADD: Add(&my_contact);
            break;
        case DEL: Del(&my_contact);
            break;
        case FIND:
        {
            unsigned int i = Find(&my_contact);
            if (i == -1)
            {
                printf("\n没有找到联系人\n");
                system("pause");
                break;
            }
            printf("\n---------------------------------------------\n");
            printf("\n姓名:%-10s\n性别:%-8s\n年龄:%-9d\n电话:%-15s\n住址:%-50s\n",
                my_contact.data[i].name, my_contact.data[i].sex, my_contact.data[i].age,
                my_contact.data[i].telephone, my_contact.data[i].address);
            printf("\n---------------------------------------------\n");
            system("pause");
        }
            break;
        case MODIFY: Modify(&my_contact);
            break;
        case DISPLAY:Display(&my_contact);
            break;
        case EMPTY: Empty(&my_contact);
            break;
        case SORT: Sort(&my_contact);
            break;
        default: printf("\n你输错了,重新输入吧!\n");
            break;
        }
    } while (input);
    return 0;
}




全文完,感谢浏览

猜你喜欢

转载自blog.csdn.net/qq_41866437/article/details/80284393