最简易版本的通信录的实现!!!

本节讲解的是最初阶通信录的实现,只是运用了结构体、指针等等,还有另一版的通信录,是运用了malloc等函数实现的动态通信录,但是它也是以这一版通信录为基础改进的。

1、contact.h

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX_DATA 100

//创建联系人结构体
typedef struct Peoinfo
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    char call[MAX_TELE];
    char addr[MAX_ADDR];
    int age;
}Peoinfo;

//创建通讯录结构体
typedef struct Contact
{
    Peoinfo data[MAX_DATA];//存放数据
    int sz;//记录通讯录中的有效信息个数
    //int capcity;
}Contact;

//初始化通讯录
void Init_contact(Contact* con);
//添加联系人
void add(Contact* con);
//删除联系人
void delet(Contact* con);
//查找联系人
void search(Contact* con);
//修改联系人
void change(Contact* con);
//显示联系人信息
void show(Contact* con);
//排序联系人(按照年龄、名字、地址)
void sort(Contact* con);
//清空联系人
void clean(Contact* con);
//寻找联系人 
static int find(const Contact* con, char* name);

2、contact.c

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
//初始化通讯录
void Init_contact(Contact* con)
{
    assert(con);
    con->sz = 0;
    memset(con->data,0,sizeof(Peoinfo)* MAX_DATA);
}

//寻找联系人是否存在——因为有多个功能都需要我们先去确认是否存在联系人,
//所以干脆把这个功能作为一个函数独立出去
static int find(const Contact* con, char* name)
//加上static之后就不会被别人看到,只能在该源文件使用
{
    assert(con,name);
    for (int i = 0; i < con->sz; i++)
    {
        if (0 == (strcmp(con->data[i].name, name)))
        {
            return i;
        }
    }
    return -1;
}

//添加联系人
void add(Contact* con)
{
    assert(con);
    //先判断一下通讯录还存不存的下?
    if (con->sz == MAX_DATA)
    {
        printf("通讯录已满,无法添加!\n");
        return;
    }
    else
    {
        /*char name[MAX_NAME];
        char sex[MAX_SEX];
        char call[MAX_TELE];
        char addr[MAX_ADDR];
        int age;*/
        printf("请输入联系人的姓名:\n");
        scanf("%s", con->data[con->sz].name);
        printf("请输入联系人的性别:\n");
        scanf("%s", con->data[con->sz].sex);
        printf("请输入联系人的电话号码:\n");
        scanf("%s", con->data[con->sz].call);
        printf("请输入联系人的住址:\n");
        scanf("%s", con->data[con->sz].addr);
        printf("请输入联系人的年龄:\n");
        scanf("%d", &(con->data[con->sz].age));
        con->sz++;
        printf("添加联系人成功!\n");
        return;
    }
}

//删除联系人
void delet(Contact* con)
{
    assert(con);
    if (con->sz == 0)
    {
        printf("该通讯录为空,无法进行删除操作\n");
        return;
    }
    printf("请输入想要删除的联系人的名字:\n");
    char name[MAX_NAME];
    scanf("%s", name);
    int aa = find(con, name);
    if (aa == -1)
    {
        printf("没有找到该联系人\n");
        return ;
    }
    else
    {
        int i = 0;
        for (i = 0; i < con->sz-aa; i++)
        {
            con->data[aa+i]=con->data[aa+i+1];
        }
        con->sz--;
        printf("删除联系人成功!\n");
    }
}

//修改联系人
void change(Contact* con)
{
    assert(con);
    printf("请输入想要修改信息的联系人的名字:\n");
    char name[MAX_NAME];
    scanf("%s", name);
    int aa = find(con, name);
    if (aa == -1)
    {
        printf("没有找到该联系人\n");
        return;
    }
    else
    {
        printf("请输入联系人的姓名:\n");
        scanf("%s", con->data[aa].name);
        printf("请输入联系人的性别:\n");
        scanf("%s", con->data[aa].sex);
        printf("请输入联系人的电话号码:\n");
        scanf("%s", con->data[aa].call);
        printf("请输入联系人的住址:\n");
        scanf("%s", con->data[aa].addr);
        printf("请输入联系人的年龄:\n");
        scanf("%d", &(con->data[aa].age));
        printf("修改联系人信息成功!\n");
    }
}

//查找联系人
void search(Contact* con)
{
    assert(con);
    printf("请输入想要查找信息的联系人的名字:\n");
    char name[MAX_NAME];
    scanf("%s", name);
    int aa = find(con, name);
    if (aa == -1)
    {
        printf("没有找到该联系人\n");
        return;
    }
    else
    {
        printf("%-20s\t%-10s\t%-30s\t%-30s\t%-5s\n",
            "姓名", "性别", "电话号码", "住址", "年龄");
        printf("%-20s\t%-10s\t%-30s\t%-30s\t%-5d\n",
            con->data[aa].name, con->data[aa].sex, con->data[aa].call,
            con->data[aa].addr, con->data[aa].age);
    }

}

//显示联系人
void show(Contact* con)
{
    assert(con);
    printf("%-20s\t%-10s\t%-30s\t%-30s\t%-5s\n", 
        "姓名", "性别", "电话号码", "住址", "年龄");
    for (int i = 0;i < con->sz; i++)
    {
        printf("%-20s\t%-10s\t%-30s\t%-30s\t%-5d\n",
            con->data[i].name, con->data[i].sex, con->data[i].call, 
            con->data[i].addr, con->data[i].age );
    }
}

//按姓名排序
int cmp_name(const void* e1, const void* e2)
{
    return strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name);
}
//按地址排序
int cmp_addr(const void* e1, const void* e2)
{
    return strcmp(((Peoinfo*)e1)->addr, ((Peoinfo*)e2)->addr);
}
//按年龄排序
int cmp_age(const void* e1, const void* e2)
{
    return ((Peoinfo*)e1)->age - ((Peoinfo*)e2)->age;
}
//排序通讯录
void sort(Contact* con)
{
    assert(con);
    int bb = 0;
    printf("******1.按姓名方式排序******\n");
    printf("******2.按年龄方式排序******\n");
    printf("******3.按地址方式排序******\n");
    printf("请输入想要的排序方式:\n");
    scanf("%d",&bb);
    switch (bb)
    {
        case 1:
            qsort(con->data ,con->sz,sizeof(con->data[0]),cmp_name);
            break;
        case 2:
            qsort(con->data, con->sz, sizeof(con->data[0]), cmp_age);
            break;
        case 3:
            qsort(con->data, con->sz, sizeof(con->data[0]), cmp_addr);
            break;
        default:
            printf("输入错误,请重新输入:\n");
            break;
    }
    printf("排序成功!\n");
    show(con);
}
//清空联系人
//感觉和初始化通讯录的功能其实相差不大
void clean(Contact* con)
{    
    assert(con);
    memset(con->data, 0, sizeof(Peoinfo) * MAX_DATA);
    con->sz = 0;
    printf("清空联系人成功!\n");
}

3、test.c

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"

void Menu()
{
    printf("************ 请选择您想要的功能     ************\n");
    printf("************ 1.ADD      2.DELET     ************\n");
    printf("************ 3.SEARCH   4.CHANGE    ************\n");
    printf("************ 5.SHOW     6.SORT      ************\n");
    printf("************ 7.CLEAN    0.EXIT      ************\n");
}

int main()
{
    int input=0;
    enum Choice
    {
        EXIT,
        ADD,
        DELET,
        SEARCH,
        CHANGE,
        SHOW,
        SORT,
        CLEAN,
    };
    Contact con;//通信录
    Init_contact(&con);//初始化通信录    
    do
    {
        Menu();
        scanf("%d", &input);
        switch (input)
        {
        case EXIT:
            printf("退出通信录!\n");
            break;
        case ADD:
            add(&con);
            break;
        case DELET:
            delet(&con);
            break;
        case SEARCH:
            search(&con);
            break;
        case CHANGE:
            change(&con);
            break;
        case SHOW:
            show(&con);
            break;
        case SORT:
            sort(&con);
            break;
        case CLEAN:
            clean(&con);
            break;
        default:
            printf("输入错误!\n");
            break;
        }
    } while (input);
    return 0;
}

注意,在定义结构体时,直接重命名结构体和结构体指针,这样代码会更加简单:

//创建联系人结构体
typedef struct Peoinfo
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    char call[MAX_TELE];
    char addr[MAX_ADDR];
    int age;
}Peoinfo;

//创建通讯录结构体
typedef struct Contact
{
    Peoinfo data[MAX_DATA];//存放数据
    int sz;//记录通讯录中的有效信息个数
    //int capcity;
}Contact;

每个功能的显示结果如下:

1、添加联系人:

2、删除联系人:

3、修改联系人:

4、查找联系人:

5、显示联系人:

6、排序联系人:

7、清空联系人:

8、退出:

但是,这种静态版本的通讯录是有局限性的:

  1. 通讯录的大小是固定大小——100个元素;

  1. 当通讯录退出后,重新运行,之前的信息都丢了。当前通讯录中的信息都是保存在内存中的,程序退出,内存就回收,下一次重新运行程序时,内存重新分配,之前的信息就全都不见了。

如何让数据永久保存?——文件操作

如何使通讯录更加灵活?——动态内存分配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值