通讯录(静态+动态)

简介: 👩‍💻博客主页:[风起 风落](https://blog.csdn.net/qq_62939852?spm=1001.2101.3001.5343)的博客主页✨欢迎关注🖱点赞🎀收藏⭐留言✒👕参考网站:牛客网🎨你的收入跟你的不可替代成正比🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦💬给大家介绍一个求职刷题收割offer的地方👉[点击进入网站](https://www.nowcoder.com/link/pc_csdncpt_fqfl_c)

👩‍💻博客主页:风起 风落的博客主页

✨欢迎关注🖱点赞🎀收藏⭐留言✒

👕参考网站:牛客网

🎨你的收入跟你的不可替代成正比

🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦

💬给大家介绍一个求职刷题收割offer的地方👉点击进入网站

@TOC

一、静态通讯录

主要是嵌套调用关于一个人信息的机构体数组

##  1.contact.h

主要是类型的定义和函数的声明

#define _CRT_SECURE_NO_WARNINGS
#define max 1000
#include<stdio.h>
#include<string.h>
struct people
{
    char name[20];
    int age;
    char sex[20];
    char tele[20];
    char addr[20];
};
typedef struct contact
{
    struct people data[max];
    int sz;
}contact;
void init(contact* p);//初始化
void addcontact(contact* p);//增加
void delcontact(contact* p);//删除
void searchcontact(const contact* p);//这里我们只是寻找数据 不修改 用const修饰结构体本身内容不能被修改 起到保护数据的作用
void modifycontact(contact* p);//修改
void printcontact(contact* p);//打印
void sortcontact(contact* p);//排序--按照名字来排

2. contact.c

函数的实现

#include"contact.h"
void init(contact* p)//初始化
{
    p->sz = 0;
    memset(p->data, 0, sizeof(p->data));//将整个结构体数组中的元素全部初始化为0
}
void addcontact(contact* p)//增加通讯录成员
{
    if (p->sz == max)
    {
        printf("通讯录已满\n");
        return;
    }
    printf("请输入名字:>");
    scanf("%s", p->data[p->sz].name);
    printf("请输入年龄:>");
    scanf("%d", &p->data[p->sz].age);
    printf("请输入性别:>");
    scanf("%s", p->data[p->sz].sex);
    printf("请输入电话:>");
    scanf("%s", p->data[p->sz].tele);
    printf("请输入地址:>");
    scanf("%s", p->data[p->sz].addr);
    p->sz++;
}
int find(contact*p,char name[])
{
    int i = 0;
    for (i = 0; i < p->sz; i++)
    {
        if (strcmp(name, p->data[i].name) == 0)
        {
            return i;
        }
    }
    return -1;
}
void delcontact(contact* p)//删除通讯录成员
{
    if (p->sz == 0)
    {
        printf("没有数据可以删除\n");
        return;
    }
    char name[20];
    printf("请删除输入名字:>");
    scanf("%s", name);
    int ret=find(p,name);
    if (ret == -1)
    {
        printf("没找到\n");
        return;
    }
    else
    {
        int i = 0;
        for (i = 0; i < p->sz - 1; i++)//数据到达倒数第二个就会把倒数第一个数传过来
        {
            p->data[i] = p->data[i + 1];
        }
        p->sz--;//一共有两个倒数第一个的数的值 故删去最后一个数
    }
}
void searchcontact(const contact* p)//查找通讯录成员
{
    char name[20];
    printf("输入要查找的名字:>");
    scanf("%s", name);
    int ret=find(p, name);
    if (ret == -1)
    {
        printf("没找到\n");
        return;
    }
    else
    {
        printf("%20s\t %5s\t %5s\t %20s\t %20s\n", "名字", "年龄", "性别", "电话", "地址");
        printf("%20s\t", p->data[ret].name);
        printf("%5d\t", p->data[ret].age);
        printf("%5s\t", p->data[ret].sex);
        printf("%20s\t", p->data[ret].tele);
        printf("%20s\n", p->data[ret].addr);
    }
}
void modifycontact(contact* p)//修改通讯录成员
{
    char name[20];
    printf("输入名字:>");
    scanf("%s", name);
    int ret=find(p, name);
    if (ret == -1)
    {
        printf("没找到该成员\n");
    }
    else
    {
        printf("请输修改入名字:>");
        scanf("%s", p->data[ret].name);
        printf("请输入修改年龄:>");
        scanf("%d", &p->data[ret].age);
        printf("请输入修改性别:>");
        scanf("%s", p->data[ret].sex);
        printf("请输入修改电话:>");
        scanf("%s", p->data[ret].tele);
        printf("请输入修改地址:>");
        scanf("%s", p->data[ret].addr);
    }
}
void printcontact(contact* p)//输出所有成员
{
    int i = 0;
    printf("%20s\t %5s\t %5s\t %20s\t %20s\n", "名字", "年龄", "性别", "电话", "地址");
    for (i = 0; i < p->sz; i++)
    {
        printf("%20s\t", p->data[i].name);
        printf("%5d\t", p->data[i].age);
        printf("%5s\t", p->data[i].sex);
        printf("%20s\t", p->data[i].tele);
        printf("%20s\n", p->data[i].addr);
    }
}
void sortcontact(contact* p)//将结构体成员排序
{
    int i = 0;//类似冒泡排序 将比较改成字符串比较的方法 
    int j = 0;//比较两个名字的大小 来交换两个结构体中所有的东西
    for (i = 0; i < p->sz - 1; i++)
    {
        for (j = 0; j < p->sz - 1 - i; j++)
        {
            if (strcmp(p->data[j].name, p->data[j+1].name) > 0)
            {
                struct people tmp  = p->data[j];
                p->data[j] = p->data[j + 1];
                p->data[j + 1] = tmp;
            }
        }
    }
}

3.test.c

测试通讯录的模块

#include"contact.h"
void menu()
{
    printf("********1.add       2.del********\n");
    printf("********3.search    4.modify*****\n");
    printf("********5.sort      6.print******\n");
    printf("********0.ex*******************\n");
}
enum day//使用枚举 运行后更加简单明了
{
    ex,//从0开始
    add,
    del,
    search,
    modify,
    sort,
    print
};
int main()
{
    contact  con;
    init(&con);
    int input = 0;
    do
    {
        menu();
        printf("请输入数字:>");
        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 sort:
            sortcontact(&con);
            break;
        case print:
            printcontact(&con);//跟上面的原因相同 为了加快进行
            break;
        case ex:
            printf("结束");
            break;
        default :
            printf("输入错误 重新输入");
            break;
        }
    } while (input);
    return 0;
}

二、动态内存通讯录

1.contact.h

#define _CRT_SECURE_NO_WARNINGS
#define      cap 3//动态内存空间的初始容量
#define   addcap 2//增大的容量
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct people
{
    char name[20];
    int age;
    char sex[20];
    char tele[20];
    char addr[20];
}pop;
typedef struct contact
{
    pop* data;//指向动态内存空间 用来存放联系人信息
    int sz;//当前记录的个数
    int capity;//动态内存的容量
}contact;
void init(contact* p);
void addcontact(contact* p);
void delcontact(contact* p);
void searchcontact(const contact* p);//这里我们只是寻找数据 不修改 用const修饰结构体本身内容不能被修改 起到保护数据的作用
void modifycontact(contact* p);
void printcontact(contact* p);
void sortcontact(contact* p);
void destory(contact* p);

2.contact.c

相比于静态的 只需将初始化 增加  销毁内存

#include"contact.h"
void init(contact* p)
{
    p->sz = 0;
     p->data= (pop*)malloc(sizeof(pop));//将结构体中的指针指向动态空间
    p->capity = cap;//cap代表开辟动态内存空间的个数3
}
void addcontact(contact* p)//增加通讯录成员
{
    if (p->sz ==p->capity )//空间已满 要扩容
    {
        pop* ptr = (pop*)realloc(p->data,(p->capity + addcap) * sizeof(pop));//addcap代表增大2个容量
        if (ptr != NULL)
        {
            p->data = ptr;
            p->capity = p->capity + addcap;//将容量扩大到5 str不需要销毁 它并没有开辟动态空间
            printf("扩容成功\n");
        }
    }
    printf("请输入名字:>");
    scanf("%s", p->data[p->sz].name);
    printf("请输入年龄:>");
    scanf("%d", &p->data[p->sz].age);
    printf("请输入性别:>");
    scanf("%s", p->data[p->sz].sex);
    printf("请输入电话:>");
    scanf("%s", p->data[p->sz].tele);
    printf("请输入地址:>");
    scanf("%s", p->data[p->sz].addr);
    p->sz++;
    printf("增加成功\n");
}
int find(contact* p, char name[])
{
    int i = 0;
    for (i = 0; i < p->sz; i++)
    {
        if (strcmp(name, p->data[i].name) == 0)
        {
            return i;
        }
    }
    return -1;
}
void delcontact(contact* p)//删除通讯录成员
{
    if (p->sz == 0)
    {
        printf("没有数据可以删除\n");
        return;
    }
    char name[20];
    printf("请删除输入名字:>");
    scanf("%s", name);
    int ret = find(p, name);
    if (ret == -1)
    {
        printf("没找到\n");
        return;
    }
    else
    {
        int i = 0;
        for (i = 0; i < p->sz - 1; i++)//数据到达倒数第二个就会把倒数第一个数传过来
        {
            p->data[i] = p->data[i + 1];
        }
        p->sz--;//一共有两个倒数第一个的数的值 故删去最后一个数
    }
}
void searchcontact(const contact* p)//查找通讯录成员
{
    char name[20];
    printf("输入要查找的名字:>");
    scanf("%s", name);
    int ret = find(p, name);
    if (ret == -1)
    {
        printf("没找到\n");
        return;
    }
    else
    {
        printf("%20s\t %5s\t %5s\t %20s\t %20s\n", "名字", "年龄", "性别", "电话", "地址");
        printf("%20s\t", p->data[ret].name);
        printf("%5d\t", p->data[ret].age);
        printf("%5s\t", p->data[ret].sex);
        printf("%20s\t", p->data[ret].tele);
        printf("%20s\n", p->data[ret].addr);
    }
}
void modifycontact(contact* p)//修改通讯录成员
{
    char name[20];
    printf("输入名字:>");
    scanf("%s", name);
    int ret = find(p, name);
    if (ret == -1)
    {
        printf("没找到该成员\n");
    }
    else
    {
        printf("请输修改入名字:>");
        scanf("%s", p->data[ret].name);
        printf("请输入修改年龄:>");
        scanf("%d", &p->data[ret].age);
        printf("请输入修改性别:>");
        scanf("%s", p->data[ret].sex);
        printf("请输入修改电话:>");
        scanf("%s", p->data[ret].tele);
        printf("请输入修改地址:>");
        scanf("%s", p->data[ret].addr);
    }
}
void printcontact(contact* p)//输出所有成员
{
    int i = 0;
    printf("%20s\t %5s\t %5s\t %20s\t %20s\n", "名字", "年龄", "性别", "电话", "地址");
    for (i = 0; i < p->sz; i++)
    {
        printf("%20s\t", p->data[i].name);
        printf("%5d\t", p->data[i].age);
        printf("%5s\t", p->data[i].sex);
        printf("%20s\t", p->data[i].tele);
        printf("%20s\n", p->data[i].addr);
    }
}
void sortcontact(contact* p)//将结构体成员排序
{
    int i = 0;
    int j = 0;
    for (i = 0; i < p->sz - 1; i++)
    {
        for (j = 0; j < p->sz - 1 - i; j++)
        {
            if (strcmp(p->data[j].name, p->data[j + 1].name) > 0)
            {
                struct people tmp = p->data[j];
                p->data[j] = p->data[j + 1];
                p->data[j + 1] = tmp;
            }
        }
    }
}
void destory(contact* p)
{
    free(p->data);
    p->data = NULL;
    p->capity = 0;
    p->sz = 0;
}

3. test.c

不要忘记销毁内存

#include"contact.h"
void menu()
{
    printf("********1.add       2.del********\n");
    printf("********3.search    4.modify*****\n");
    printf("********5.sort      6.print******\n");
    printf("********0.ex*******************\n");
}
enum day
{
    ex,
    add,
    del,
    search,
    modify,
    sort,
    print
};
int main()
{
    contact  con;
    init(&con);
    int input = 0;
    do
    {
        menu();
        printf("请输入数字:>");
        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 sort:
            sortcontact(&con);
            break;
        case print:
            printcontact(&con);
            break;
        case ex:
            printf("结束");
            destory(&con);//销毁内存
            break;
        default:
            printf("输入错误 重新输入");
            break;
        }
    } while (input);
    return 0;
}
目录
相关文章
|
网络协议 Linux 数据安全/隐私保护
|
数据可视化 Python
Python数据可视化:用Seaborn绘制高端玩家版散点图
Python数据可视化:用Seaborn绘制高端玩家版散点图
Python数据可视化:用Seaborn绘制高端玩家版散点图
|
缓存 网络协议 Shell
Linux 下 python 开发环境部署(有基础)|学习笔记
快速学习 Linux 下 python 开发环境部署(有基础)
1105 0
Linux 下 python 开发环境部署(有基础)|学习笔记
|
数据采集 开发工具
ZYNQ-实现GPIO的中断控制
ZYNQ-实现GPIO的中断控制
698 0
ZYNQ-实现GPIO的中断控制
|
消息中间件 jstorm 分布式计算
Storm vs. Kafka Streams vs. Spark Streaming vs. Flink ,流式处理框架一网打尽!2
Storm vs. Kafka Streams vs. Spark Streaming vs. Flink ,流式处理框架一网打尽!2
733 0
Storm vs. Kafka Streams vs. Spark Streaming vs. Flink ,流式处理框架一网打尽!2
|
机器学习/深度学习 数据挖掘 Python
基于 Python 的 8 种常用抽样方法
抽样是统计学、机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到。所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本。
1080 0
基于 Python 的 8 种常用抽样方法
|
存储 SQL 运维
几种常见的数据库加密方案分析
“xxx拖库”、“xxxx数据泄露”等等层出不穷的安全事件表明,要想根本上解决这种越过网络防护,绕开权控体系,直接复制文件块并异地还原解析的“内鬼”式攻击方式,必须采用存储层的加密技术,确保敏感信息一旦落盘,必须密文存储。随着数据库加密技术在国内市场的兴起,更多数据安全企业的涌入,市面上出现了几种具有代表性的数据库加密技术。 一、前置代理及加密网关技术 1)技术原理 该方案的总体技术思路即在数据库之前增加一道安全代理服务,对数据库访问的用户都必须经过该安全代理服务,在此服务中实现如数据加解密、存取控制等安全策略。然后安全代理服务通过数据库的访问接口实现数据存储。安全代理服务存在于客户端应
2038 0
蚂蚁森林:从虚拟世界出发,获得真实的成就感 | 中国创新
随着蚂蚁森林长大,它实际上成为3.5亿人的公共品,开放成了必然之路。2017年9月5日,阿里巴巴的公益周上,蚂蚁森林宣布启动开放计划,将科技平台和产品能力开放给全社会,培育公益创新土壤。
4504 0

热门文章

最新文章