(C语言)通讯录动态申请内存版

  1. contact.h

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <string.h>
#include<assert.h>
#include <stdlib.h>
//创建宏方便修改;
#define MAX 3
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

#define EXTAR_CAPACITY 2

struct PeoInfo//个人信息结构体
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    int age;
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
};

struct contact //通讯录结构体
{
    struct PeoInfo *date;//指向了存放数据的空间
    int sz;//已经放进去的信息
    int capacity;//容量
};
void InitContact(struct contact* pc);//初始化

void menu();//菜单

void AddContact(struct contact* pc);//添加联系人

void DelContact(struct contact* pc);//删除联系人

void ShowContact(const struct contact* pc);//显示所有联系人

void SearContact(const struct contact* pc);//查找联系人

void ModiContact(struct contact* pc);//修改联系人

void SortContact(struct contact* pc);//排序联系人

void ClearContact(struct contact* pc);//清空联系人

void DestoryContact(struct contact* pc);//退出并返回申请空间;
  1. contact.c

#include "contact.h"


//enum INFO info;

//初始化函数
void InitContact(struct contact* pc)
{
    assert(pc);//防止出现空指针;
    pc->date=(struct PeoInfo*)malloc(MAX* sizeof(struct PeoInfo));//malloc申请一块内存空间,并返回申请到的空间的地址;
    if (pc->date == NULL)
    {
        perror("InitContact");
        return;
    }
    pc->sz = 0;
    pc->capacity = MAX;
    
}



//菜单
void menu()
{
    printf("********************************************************\n");
    printf("********************************************************\n");
    printf("************  1.add             2.del   ****************\n");
    printf("************  3.sear            4.modify  **************\n");
    printf("************  5.show            6.sort  ****************\n");
    printf("***********   7.clear           0.exit *****************\n");

}


//检查容量函数
int check_capacity(struct contact *pc)
{
    if (pc->sz == pc->capacity)
    {
        //增加容量
        struct PeoInfo* str = (struct PeoInfo*)realloc(pc->date, (pc->capacity + 2) * sizeof(struct PeoInfo));
        //realloc如果当前后面连续的空间足够就在后面继续开辟新的空间,指针变量str指向的地址不变,否则,寻找新的地址并把原来数据存入,销毁上次申请的空间;
        if (str != NULL)
        {
            pc->date = str;
            pc->capacity += EXTAR_CAPACITY;
            printf("增容成功,请输入新的联系人信息!\n");
            return 1;
        }
        else
        {
            perror(" AddContact");
            return 0;
        }
    }
    else 
    {
        return 1;
    }
}
//动态增长添加联系人
void AddContact(struct contact* pc)
{
    assert(pc);//防止出现空指针;
    int ret=check_capacity(pc);//检查容量,不够就增容;
    if (ret == 1)
    {
        printf("请输入名字>:");
        scanf("%s", pc->date[pc->sz].name);//数组名就是地址,所以不用取地址&;
        printf("请输入性别>:");
        scanf("%s", pc->date[pc->sz].sex);
        printf("请输入年龄>:");
        scanf("%d", &pc->date[pc->sz].age);
        printf("请输入电话号码>:");
        scanf("%s", pc->date[pc->sz].tele);
        printf("请输入地址>:");
        scanf("%s", pc->date[pc->sz].addr);
        (pc->sz)++;
        printf("成功添加联系人!\n");
    }
    else
    {
        printf("增容失败,无法添加新的联系人!\n");
        return;
    }
}



//显示所有联系人
void ShowContact(const struct contact* pc)
{
    assert(pc);//防止出现空指针;
    if (pc->sz == 0)
    {
        printf("您的通讯录中不存在任何联系人!\n");
        return;
    }
    printf("%-10s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话号码", "地址");
    for (int i = 0; i < pc->sz; i++)
    {

        printf("%-10s\t%-5s\t%-5d\t%-12s\t%-30s\n",
            pc->date[i].name,
            pc->date[i].sex,
            pc->date[i].age,
            pc->date[i].tele,
            pc->date[i].addr);
    }

}

//查找函数
static int FindByName(const struct contact* pc, char name[MAX_NAME])
{
    assert(pc);
    for (int i = 0; i < pc->sz; i++)
    {
        //使用strcmp函数
        if (strcmp(pc->date[i].name, name) == 0)
        {
            return i;
        }

    }
    return -1;
}


//查找联系人
void SearContact(const struct contact* pc)
{
    assert(pc);

    printf("请输入需要查找的人的姓名:>\n");
    char name[MAX_NAME];
    scanf("%s", name);
    //查找联系人是否存在
    int ret = FindByName(pc, name);
    if (ret == -1)
    {
        printf("联系人不存在!\n");
    }
    else
    {
        printf("%-10s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话号码", "地址");
        printf("%-10s\t%-5s\t%-5d\t%-12s\t%-30s\n",
            pc->date[ret].name,
            pc->date[ret].sex,
            pc->date[ret].age,
            pc->date[ret].tele,
            pc->date[ret].addr);
    }

}


//删除联系人
void DelContact(struct contact* pc)
{
    assert(pc);
    printf("请输入需要删除的人的姓名:>\n");
    char name[MAX_NAME];
    scanf("%s", name);
    //查找联系人是否存在
    int ret = FindByName(pc, name);
    if (ret == -1)
    {
        printf("联系人不存在!\n");

    }
    else
    {
        //删除
        for (int i = ret; i < (pc->sz) - 1; i++)
        {
            pc->date[i] = pc->date[i + 1];
        }

        printf("成功删除指定联系人!\n");
        pc->sz--;
    }
}


//修改联系人信息
void ModiContact(struct contact* pc)
{
    assert(pc);
    char name[MAX_NAME];
    printf("请输入需要修改的人的姓名:>\n");
    scanf("%s", name);
    int ret = FindByName(pc, name);
    if (ret == -1)
    {
        printf("联系人不存在!\n");

    }
    else
    {
        //需要修改的具体信息;
        printf("开始修改:\n");
        printf("请输入名字>:");
        scanf("%s", pc->date[ret].name);//数组名就是地址,所以不用取地址&;
        printf("请输入性别>:");
        scanf("%s", pc->date[ret].sex);
        printf("请输入年龄>:");
        scanf("%d", &pc->date[ret].age);
        printf("请输入电话号码>:");
        scanf("%s", pc->date[ret].tele);
        printf("请输入地址>:");
        scanf("%s", pc->date[ret].addr);
        printf("成功修改联系人信息!\n");

    }

}


//用年龄排序所有联系人
int cmpbyage(const void* e1, const void* e2)
{
    return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}

void SortContact(const struct contact* pc)
{
    assert(pc);
    qsort(pc->date, pc->sz, sizeof(struct PeoInfo), cmpbyage);


}

//清空联系人
void ClearContact(struct contact* pc)
{
    assert(pc);
    int n = pc->sz;
    memset(pc->date, 0, n * sizeof(struct PeoInfo));
    pc->sz = 0;
    printf("已清空所有联系人!\n");
}


//销毁通讯录
void DestoryContact(struct contact* pc)
{
    free(pc->date);
    pc->date = NULL;
    pc->sz = 0;
    pc->capacity = 0;

}
  1. test.c

#include "contact.h"


int main()
{
    //创建一个通讯录;
    struct contact con;//通讯录


    //初始化通讯录;
    InitContact(&con);

    int input = 0;
    //do while循环至少进入一次;
    do {
        menu();
        //n个信息
        //在增加就放到下标为n的位置上去;
        printf("请选择>:");
        scanf("%d", &input);

        switch (input)
        {
        case 1:
            AddContact(&con);
            break;
        case 2:
            DelContact(&con);
            break;
        case 3:
            SearContact(&con);
            break;
        case 4:
            ModiContact(&con);
            break;
        case 5:
            ShowContact(&con);
            break;
        case 6:
            SortContact(&con);
            break;
        case 7:
            ClearContact(&con);
            break;
        case 0:
            DestoryContact(&con);
            printf("您已退出!\n");
            break;
        default:
            printf("您的选择不在菜单中,请重新输入!\n");
            break;
        }
    } while (input);


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值