简易通讯录实现-----------动态数组(malloc)篇

先分析一波:

之前数组篇已经对通讯录进行了整体分析,由于之前是直接创建了一个大小为1000的数组,因此可能会存在空间浪费和存储上限的问题,因此对其升级,将其改造为动态数组版。下面分析需要注意的问题:
- 由于是动态数组,所以不会有上限,当空间满时,只需要扩充空间即可。
- 我们可以先动态开辟默认大小合适的空间,等不足时再扩充即可。默认的空间和添加的空间在前面宏定义。
由于之前已经做过分析,所以这次直接上代码:

Contact.h
#ifndef __Contact_H__
#define __Contact_H__

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


#define NAME_MAX 20         //姓名字符串最大值
#define SEX_MAX 5           //性别字符串最大值  
#define TELE_MAX 12         //电话字符串最大值
#define ADDR_MAX 25         //地址字符串最大值
#define DEFAULT_CAPACITY 3  //初始化时空间默认值
#define ADD_CAPACITY 2      //扩容空间默认值

typedef struct PeoInfo            //联系人信息
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char tele[TELE_MAX];
    char addr[ADDR_MAX];
}PeoInfo, *pPeoInfo;

typedef struct Contact           //通讯录信息
{
    pPeoInfo data;
    int sz;
    int capacity;
}Contact, *pContact;
void Choose_menu();    //打印选择菜单
void Initialize_Contact(pContact pcon);     //初始化通讯录
void Choose();      //选择功能
void Add_Peoinfo(pContact pcon);       //添加人信息
void Delete_Peoinfo(pContact pcon);   //删除人信息
void Search_Peoinfo(const pContact pcon);    //查找人的信息 
void Modify_Peoinfo(pContact pcon);    //修改人的信息 
void Show_Peoinfo(const pContact pcon);    //输出人的信息 
void Sort_Peoinfo(pContact pcon);    //排序人的信息 
void Empty_Contact(pContact pcon);     //清空通讯录
void Destroy_Contact(pContact pcon);          //销毁通讯录
#endif // !__Contact_H__

Contact.c

#include"Contact.h"

enum Option
{
    EXIT,
    ADD,
    DETELE,
    SEARCH,
    MODIFY,
    SHOW,
    SORT,
    EMPTY
};

void Choose_Menu()
{
    printf("*********************************************\n");
    printf("********* 1.add           2.delete **********\n");
    printf("********* 3.search        4.modify **********\n");
    printf("********* 5.show          6.sort   **********\n");
    printf("********* 7.empty         0.exit   **********\n");
    printf("*********************************************\n");
    printf("Please input ->_:");
}
void Choose(pContact pcon)
{
    int input = 0;
    do
    {
        Choose_Menu();
        scanf("%d", &input);
        switch (input)
        {
            case ADD:
                Add_Peoinfo(pcon);
                break;
            case DETELE:
                Delete_Peoinfo(pcon);
                break;
            case SEARCH:
                Search_Peoinfo(pcon);
                break;
            case MODIFY:
                Modify_Peoinfo(pcon);
                break;
            case SHOW:
                Show_Peoinfo(pcon);
                break;
            case SORT:
                Sort_Peoinfo(pcon);
                break;
            case EMPTY:
                Empty_Contact(pcon);
                break;
            case EXIT:
                Destroy_Contact(pcon);
                printf("EXIT SUCCESS!!!\n");
                break;
            default:
                printf("INPUT ERROR !!!\n");
                break;
        }
    } while (input);
}


void Initialize_Contact(pContact pcon)
{
    pcon->data = (pPeoInfo) malloc (DEFAULT_CAPACITY * sizeof(PeoInfo));
    pcon->sz = 0;
    pcon->capacity = DEFAULT_CAPACITY;
}

static int Check_Capacity(pContact pcon)
{
    assert(pcon);
    if (pcon->sz == pcon->capacity)
    {
        //增容
        pPeoInfo tmp = (pPeoInfo) realloc (pcon->data, (pcon->capacity + ADD_CAPACITY) * sizeof(PeoInfo));
        if (tmp != NULL)
        {
            pcon->data = tmp;
            pcon->capacity += ADD_CAPACITY;
            printf("ADD_CAPACITY_SUCCESS!\n");
            return 1;
        }
        else
        {
            printf("ADD_CAPACITY_FAILURE!\n");
            return 0;
        }
    }
    return 1;
}
void Add_Peoinfo(pContact pcon)
{
    pPeoInfo tmp = 0;
    assert(pcon);
    if (Check_Capacity(pcon) == 0)
        return;
    printf("Please input Name:");
    scanf("%s", pcon->data[pcon->sz].name);
    printf("Please input Sex :");
    scanf("%s", pcon->data[pcon->sz].sex);
    printf("Please input Age :");
    scanf("%d", &pcon->data[pcon->sz].age);
    printf("Please input Tele:");
    scanf("%s", pcon->data[pcon->sz].tele);
    printf("Please input Addr:");
    scanf("%s", pcon->data[pcon->sz].addr);
    pcon->sz++;
}
static int Find_Peoinfo(const pContact pcon)
{
    int i = 0;
    char name[NAME_MAX] = { 0 };
    assert(pcon);
    printf("Please input name->_:");
    scanf("%s", name);
    for (i = 0; i < pcon->sz; i++)
    {
        if (strcmp(name, pcon->data[i].name) == 0)
            return i;
    }
    return -1;
}
void Delete_Peoinfo(pContact pcon)
{
    int i = 0;
    int ret = 0;
    assert(pcon);
    ret = Find_Peoinfo(pcon);
    if (ret == -1)
    {
        printf("DELETE FAILURE, CAN'T FIND!\n");
        return;
    }
    else
    {
        for (i = ret; i < pcon->sz - 1; i++)
        {
            pcon->data[i] = pcon->data[i + 1];
        }
        pcon->sz--;
        printf("DELETE SUCCESS!\n");
    }

}
void Search_Peoinfo(const pContact pcon)
{
    int ret = 0;
    assert(pcon);
    ret = Find_Peoinfo(pcon);
    if (ret == -1)
    {
        printf("SEARCH FAILURE, CAN'T FIND!\n");
    }
    else
    {
        printf("%10s %5s %5s %15s %25s\n", "Name", "Sex", "Age", "Tele", "Addr");
        printf("%10s %5s %5d %15s %25s\n", pcon->data[ret].name, pcon->data[ret].sex, pcon->data[ret].age, pcon->data[ret].tele, pcon->data[ret].addr);
    }
}
void Modify_Peoinfo(pContact pcon)
{
    int ret = 0;
    assert(pcon);
    ret = Find_Peoinfo(pcon);
    if (ret == -1)
    {
        printf("MODIFY FAILURE, CAN'T FIND!\n");
        return;
    }
    else
    {
        printf("Please input Name:");
        scanf("%s", pcon->data[ret].name);
        printf("Please input Sex :");
        scanf("%s", pcon->data[ret].sex);
        printf("Please input Age :");
        scanf("%d", &pcon->data[ret].age);
        printf("Please input Tele:");
        scanf("%s", pcon->data[ret].tele);
        printf("Please input Addr:");
        scanf("%s", pcon->data[ret].addr);
        printf("MODIFY SUCCESS!\n");
    }
}
void Sort_Peoinfo(pContact pcon)
{
    int i = 0;
    int j = 0;
    int flag = 0;
    assert(pcon);
    for (i = 0; i < pcon->sz - 1; i++)
    {
        for (j = 0; j < pcon->sz - i - 1; j++)
        {
            if (strcmp(pcon->data[j].name, pcon->data[j + 1].name) > 0)
            {
                PeoInfo tmp = pcon->data[j];
                pcon->data[j] = pcon->data[j + 1];
                pcon->data[j + 1] = tmp;
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
    printf("SORT SUCCESS!\n");
}
void Empty_Contact(pContact pcon)
{
    assert(pcon);
    pcon->sz = 0;
    pcon->capacity = 0;
    printf("EMPTY SUCCESS!\n");
}
void Destroy_Contact(pContact pcon)
{
    free(pcon->data);
    pcon->data = NULL;
    pcon->capacity = 0;
    pcon->sz = 0;
}
void Show_Peoinfo(const pContact pcon)
{
    assert(pcon);
    int i = 0;
    if (pcon->sz == 0)
    {
        printf("NO PEOINFO!\n");
        return;
    }
    printf("%10s %5s %5s %15s %25s\n", "Name", "Sex", "Age", "Tele", "Addr");
    for (i = 0; i < pcon->sz; i++)
    {
        printf("%10s %5s %5d %15s %25s\n", pcon->data[i].name, pcon->data[i].sex, pcon->data[i].age, pcon->data[i].tele,pcon->data[i].addr);
    }
}

test.c

#include"Contact.h"
void test()
{
    Contact con;
    Initialize_Contact(&con);
    Choose(&con);
}

int main()
{
    test();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值