C语言实现一个简易的通讯录

功能

实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

代码片

CONTACT.H

#ifndef __CONTACT_H__
#define __CONTACT_H__

#include<stdio.h>
#define MAX 1000

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 20

//枚举对联系人要做的操作
enum OPtion
{
    EXIT,//退出程序
    ADD,//添加联系人
    DEL,//删除联系人
    SEARCH,//查询联系人
    MODIFY,//修改联系人的信息
    SHOW,//打印联系人的信息
    CLEAR,//清除联系人的信息
    SORT,//排序
};

//联系人信息的结构体
typedef struct PeoInfo
{
    char name[NAME_MAX];
    int age;
    char sex[SEX_MAX];
    char tele[TELE_MAX];
    char addr[ADDR_MAX];
};

typedef struct Contact
{
    struct PeoInfo* _data;
    size_t _size;
    size_t _capacity;
}Contact, *pContact;//结构体定义的一个指针类型的别名


void InitContact(pContact pc);
void AddContact(pContact pc);
void ShowContact(pContact pc);
void DelContact(pContact pc);
int SearchContact(pContact pc);
void sort_contact(pContact pc);
void ModdifyContact(pContact pc);
void ClearContact(pContact pc);

#endif

people.c

#define _CRT_SECURE_NO_WARNINGS 

#include"CONTACT.h"
#include<assert.h>
#include<Windows.h>
#include<string.h>
#include<stdio.h>

//初始化通讯录
void InitContact(pContact pc)
{
    assert(pc);
    pc->_data = (pContact**)malloc(MAX*sizeof(pContact*));
    if (pc->_data == NULL)
    {
        printf("%s\n", strerror(errno));//获取系统错误信息或打印用户程序错误信息
    }
    pc->_size = 0;
    pc->_capacity = MAX;
}

//展示通讯录信息
void ShowContact(pContact pc)
{
    assert(pc);
    printf("%10s\t%5s\t%5s\t%12s\t%12s\t\n", "name", "age", "sex", "tele", "addr");
    for (int i = 0; i < pc->_size; i++)
    {
        printf("%10s\t%5d\t%5s\t%12s\t%12s\t\n", pc->_data[i].name,
            pc->_data[i].age,
            pc->_data[i].sex,
            pc->_data[i].tele,
            pc->_data[i].addr);
    }
}

//检查开辟的空间是否够用
void CheckCapacity(pContact pc)
{
    if (pc->_size >= pc->_capacity)
    {
        pContact new = (pContact**)realloc(pc->_data, 2 * pc->_capacity*sizeof(pContact*));
        assert(new);
        for (int i = 0; i < pc->_size; i++)
        {
            new->_data[i] = pc->_data[i];
        }
        new->_size = pc->_size;
        new->_capacity = pc->_capacity * 2;
        free(pc);
        pc = new;
    }
}

//通讯录中添加联系人
void AddContact(pContact pc)
{
    assert(pc);
    CheckCapacity(pc);
    printf("请输入名字:>");
    scanf("%s", pc->_data[pc->_size].name);
    printf("请输入年龄:>");
    scanf("%d", &pc->_data[pc->_size].age);
    printf("请输入性别:>");
    scanf("%s", pc->_data[pc->_size].sex);
    printf("请输入电话:>");
    scanf("%s", pc->_data[pc->_size].tele);
    printf("请输入地址:>");
    scanf("%s", pc->_data[pc->_size].addr);
    pc->_size++;
}

//查找联系人
int Find(pContact pc, char* name)
{
    assert(pc&&name);
    for (int i = 0; i < pc->_size; i++)
    {
        if (strcmp(pc->_data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

//删除通讯录
void DelContact(pContact pc)
{
    char name[NAME_MAX];

    //如果通讯为空就不能进行删除操作
    if (pc->_size == 0)
    {
        printf("通讯为空就不能进行删除操作\n");
        return;
    }

    printf("请输入你要删除的联系人的名字>");
    scanf("%s", name);

    //找联系人
    //联系人不存在
    if (Find(pc, name) == -1)
    {
        printf("联系人不存在\n");
    }
    else
    {
        //找到联系人
        //进行删除操作
        //删除方法很多,在这里我用的方法是:将要删除的联系人的位置与最后一个交换,删除最后一个
        pc->_data[Find(pc, name)] = pc->_data[pc->_size];
        pc->_size--;
    }
}

//查找指定的联系人联系人
int SearchContact(pContact pc)
{
    char name[NAME_MAX];
    int pos = 0;
    assert(pc);

    //如果通讯为空就不能进行查找操作
    if (pc->_size == 0)
    {
        printf("通讯为空就不能进行查找操作\n");
        return 0;
    }

    printf("请输入你要查找的联系人姓名>");
    scanf("%s", name);
    pos = Find(pc, name);
    if (pos!=-1)
    {
        printf("%10s\t%5d\t%5s\t%12s\t%12s\t\n", pc->_data[pos].name,
            pc->_data[pos].age,
            pc->_data[pos].sex,
            pc->_data[pos].tele,
            pc->_data[pos].addr);
        return pos;
    }
    printf("查找的联系人不存在\n");
    return -1;
}

//修改通讯录信息
void ModdifyContact(pContact pc)
{
    int ret = SearchContact(pc);
    if (ret!=-1)
    {
        printf("请输入要修改联系人的信息:>");
        printf("请输入修改的名字:>");
        scanf("%s", pc->_data[ret].name);
        printf("请输入修改的年龄:>");
        scanf("%d", &pc->_data[ret].age);
        printf("请输入修改的性别:>");
        scanf("%s", pc->_data[ret].sex);
        printf("请输入修改的电话:>");
        scanf("%s", pc->_data[ret].tele);
        printf("请输入修改的地址:>");
        scanf("%s", pc->_data[ret].addr);
    }
    else
    {
        printf("该联系人不存在,无法修改\n");
    }
}

//按名字排序通讯录
int  Find_Min(pContact pc, int left)
{
    int min = left;
    for (int i = left; i < pc->_size - 1; i++)
    {
        if (strcmp(pc->_data[min].name, pc->_data[i + 1].name)>0)
        {
            min = i + 1;
        }
    }
    return min;
}

void sort_contact(pContact pc)
{
    assert(pc);
    for (int i = 0; i < pc->_size; i++)
    {
        int min = Find_Min(pc, i);
        struct PeoInfo p = pc->_data[min];
        pc->_data[min] = pc->_data[i];
        pc->_data[i] = p;
    }
}


//清空通讯录
void ClearContact(pContact pc)
{
    pc->_size = 0;
    printf("已清空通讯录\n");
}

main.c

#define _CRT_SECURE_NO_WARNINGS  
#include"CONTACT.h"
#include<stdio.h>

//菜单
void menu()
{
    printf("****************************\n");
    printf("*** 1.ADD        2.DEL   ***\n");
    printf("*** 3.SEARCH     4.MODIFY***\n");
    printf("*** 5.SHOW       6.CLEAR ***\n");
    printf("*** 7.SORT       0.EXIT  ***\n");
    printf("****************************\n");
}

void test()
{
    int input = 0;
    struct Contact con;
    InitContact(&con);
    menu();
    do{
        printf("请选择>");
        scanf("%d", &input);
        switch (input)
        {
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DelContact(&con);
            break;
        case SEARCH:
            SearchContact(&con);
            break;
        case MODIFY:
            ModdifyContact(&con);
            break;
        case SHOW:
            ShowContact(&con);
            break;
        case CLEAR:
            ClearContact(&con);
        case SORT:
            sort_contact(&con);
        default:
            break;
        }

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

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/81508739