实现一个通讯录

目录

项目要求及功能实现

通讯录的代码实现

contact.h:

contanct.c

main.c


项目要求及功能实现

1、可以存放100个人的信息

2、每个人的信息

名字

性别

年龄

电话

地址

3、增加联系人

4、删除指定联系人

5、查找指定联系人

6、修改指定联系人

7、显示联系人信息

8、排序联系人(按照年龄/名字)

main.c //测试通讯录的相关功能

contact.h //通讯录的声明

contanct.c //通讯录的实现模块

通讯录的代码实现

如果是静态版本的设计的话会有以下的问题

1、通讯录的大小是固定大小 - 100个元素

2、当通讯录退出后,重新运行,之前的信息都丢了

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

数据能够永久的保存? -文件

所以引入了动态版本的设计

contact.h:

//
// Created by yiming Zhang on 11/28/23.
//

#ifndef ADDRESS_BOOK_CONTACT_H
#define ADDRESS_BOOK_CONTACT_H

#endif //ADDRESS_BOOK_CONTACT_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 5
#define MAX_ADDR 5

//动态使用:
#define DEFAULT_SZ 3//默认容量
#define INC_SZ 2    //每次扩充那么多

//表示一个人的信息
typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;//使用typedef进行重命名

//静态版本的设计
//typedef struct Contact
//{
//    PeoInfo data[MAX];//存放数据
//    int sz;//记录通讯录中的
//}Contact,*pContact;

//动态的版本
//1、默认能够存放3个人的信息
//2、不够的话,每次增加2个人信息
typedef struct Contact
{
    PeoInfo *data;//data指向了存放数据的空间
    int sz;//记录通讯录中的有效信息个数
    int capacity;//通讯录当前的容量
}Contact,*pContact;

//初始化通讯录
void InitContact(Contact *pc);

//增加指定联系人
void AddContact(Contact* pc);

//显示联系人的信息
void ShowContact(const Contact *pc);

//删除指定联系人
void DelContact(pContact pc);

//查找指定联系人
void SearchContact(const pContact pc);

//修改通讯录
void ModifyContact(pContact pc);

//排序通讯录元素
void SortContact(pContact pc);

//销毁通讯录
void DestroyContact(pContact pc);

contanct.c

//
// Created by yiming Zhang on 11/28/23.
//
#include "contact.h"

//静态的版本
//void InitContact(Contact *pc)
//{
//    pc->sz = 0;
//    memset(pc->data,0,sizeof (pc->data));
//}

//动态的版本
void InitContact(Contact *pc)
{
    pc->data = (PeoInfo*)malloc(DEFAULT_SZ* sizeof(PeoInfo));
    if(pc->data == NULL)
    {
        printf("通讯录初始化失败:%s\n", strerror(errno));
        return;
    }
    pc->sz = 0;
    pc->capacity = DEFAULT_SZ;
}

//静态的版本
//void AddContact(Contact* pc)
//{
//    if(pc->sz == MAX)
//    {
//        printf("通讯录已满,无法增加\n");
//        return;
//    }
//    printf("请输入名字:>\n");
//    scanf("%s",pc->data[pc->sz].name);
//    printf("请输入年龄:>\n");
//    scanf("%d",&(pc->data[pc->sz].age));
//    printf("请输入性别:>\n");
//    scanf("%s",pc->data[pc->sz].sex);
//    printf("请输入电话:>\n");
//    scanf("%s",pc->data[pc->sz].tele);
//    printf("请输入地址:>\n");
//    scanf("%s",pc->data[pc->sz].addr);
//    pc->sz++;
//    printf("添加成功\n");
//}

//动态的版本
void CheckCapacity(Contact * pc)
{
    if(pc->sz == pc->capacity)//判断是不是容量满了
    {
        PeoInfo *ptr = (PeoInfo*)realloc(pc->data,(pc->capacity + INC_SZ)* sizeof(PeoInfo));
        if(ptr == NULL)
        {
            printf("CheckCapacity:%s\n", strerror(errno));
            return;
        } else
        {
            pc->data = ptr;
            pc->capacity += INC_SZ;
            printf("扩容成功,当前容量:%d\n",pc->capacity);
        }

    }
}
void AddContact(Contact* pc)
{
    CheckCapacity(pc);
    printf("请输入名字:>\n");
    scanf("%s",pc->data[pc->sz].name);
    printf("请输入年龄:>\n");
    scanf("%d",&(pc->data[pc->sz].age));
    printf("请输入性别:>\n");
    scanf("%s",pc->data[pc->sz].sex);
    printf("请输入电话:>\n");
    scanf("%s",pc->data[pc->sz].tele);
    printf("请输入地址:>\n");
    scanf("%s",pc->data[pc->sz].addr);
    pc->sz++;
    printf("添加成功\n");
}
void ShowContact(const Contact *pc)
{
    int i;
    //姓名    //年龄    //性别    //电话    //地址
    //zhangsan 20      男        123456    北京

    //打印标题
    printf("%-11s %-4s %-5s %-12s %-30s\n","姓名","年龄","性别","电话","地址");
    //打印数据
    for (i = 0;i < pc->sz;i ++)
    {
        printf("%-10s %-4d %-5s %-12s %-30s\n",
               pc->data[i].name,
               pc->data[i].age,
               pc->data[i].sex,
               pc->data[i].tele,
               pc->data[i].addr);
    }
}

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

void DelContact(Contact *pc)
{
    char name[MAX_NAME] = {0};
    if(pc->sz == 0)
    {
        printf("通讯录为空,无法删除\n");
        return;
    }
    //删除
    //1、找到要删除的人 — 位置(下标)
    printf("输入要删除人的名字:>");
    scanf("%s",name);
    int pos =FindByname(pc,name);
    if(pos == -1)
    {
        printf("要删除的人不存在\n");
        return;
    }
    int i;
    //2.删除 - 删除pos位置上的数据
    for (i = pos;i<pc->sz-1;i++)
    {
        pc->data[i] = pc->data[i+1];
    }
    pc->sz--;
    printf("删除成功\n");
}

void SearchContact(const pContact pc)
{
    char name[MAX_NAME] = {0};
    printf("请输入要查找人的名字:>");
    scanf("%s",name);
    int pos = FindByname(pc,name);
    if (pos == -1)
    {
        printf("要查找的人不存在\n");
        return;
    } else
    {
        //打印
        //打印标题
        printf("%-11s %-4s %-5s %-12s %-30s\n","姓名","年龄","性别","电话","地址");
        //打印数据
        printf("%-10s %-4d %-5s %-12s %-30s\n",
               pc->data[pos].name,
               pc->data[pos].age,
               pc->data[pos].sex,
               pc->data[pos].tele,
               pc->data[pos].addr);
    }
}

void ModifyContact(pContact pc)
{
    char name[MAX_NAME] = {0};
    printf("请输入要修改人的名字:>");
    scanf("%s",name);
    int pos = FindByname(pc,name);
    if (pos == -1)
    {
        printf("要修改的人不存在\n");
        return;
    }
    //修改
    printf("请输入名字:>\n");
    scanf("%s",pc->data[pos].name);
    printf("请输入年龄:>\n");
    scanf("%d",&(pc->data[pos].age));
    printf("请输入性别:>\n");
    scanf("%s",pc->data[pos].sex);
    printf("请输入电话:>\n");
    scanf("%s",pc->data[pos].tele);
    printf("请输入地址:>\n");
    scanf("%s",pc->data[pos].addr);
    printf("修改成功\n");
}

//按名字来排序
static int cmp_by_name(const void* e1,const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}
void SortContact(pContact pc)
{
    qsort(pc->data,pc->sz, sizeof(PeoInfo),cmp_by_name);
    printf("排序成功\n");
}

void DestroyContact(pContact pc)
{
    free(pc->data);
    pc->data = NULL;
    pc->capacity = 0;
    pc->sz = 0;
    printf("释放内存\n");
}

main.c

#include "contact.h"

void menu()
{
    printf("****************************\n");
    printf("****** 1.add     2.del   ***\n");
    printf("****** 3.search  4.modify***\n");
    printf("****** 5.show   6.sort   ***\n");
    printf("****** 0.exit            ***\n");
    printf("****************************\n");
}
enum    Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT

};

int main()
{
    int input;
    Contact con;//通讯录
    //初始化通讯录
    InitContact(&con);
    do
    {
        menu();
        printf("请输入:>\n");
        scanf("%d",&input);

        switch (input)
        {
            case ADD:
                AddContact(&con);
                break;
            case DEL:
                DelContact(&con);
                break;
            case SEARCH:
                SearchContact(&con);
                break;
            case MODIFY:
                ModifyContact(&con);
                break;
            case SHOW:
                ShowContact(&con);
                break;
            case SORT:
                SortContact(&con);
                break;
            case EXIT:
                DestroyContact(&con);
                printf("退出通讯录\n");
                break;
            default:
                printf("输入错误\n");
                break;
        }
    }
    while (input);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KrisZhang10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值