当前位置: 首页 > article >正文

用结构体实现通讯录

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🌸通讯录的需求

通讯录的功能

🐰 通讯录的原码

🌸主函数

🌸头文件

🌸函数实现文件


🌸通讯录的需求

1.人员的姓名

2.人员的年龄

3.人员的性别

4.人员的电话号码

5.人员的地址

实现方法:通讯录初始设置100个人的空间,开辟100个人的空间,创建100个人的结构体数组。我们设置两个结构体,一个保存通讯录的需求,一个保存结构体结构体数组和通讯录的人数。

注意:通讯录初始的存储值是100(结构体数组有100成员),就是说可以存储100个人的信息,有效个数也是从0开始的(pc->sz最开始为0)

通讯录的功能

初始化通讯录:

void InitContact(Contact* pc)
{
    pc->sz=0;
    memset(pc->data,0,sizeof(pc->data));
}

pc->data结构体首元素的地址,sizeof(pc->data)计算的是整个结构体数组的大小,然后用memeset将整个数组初始化为0,别忘了引用头文件#include<string.h>

增加联系人:

void AddContact(Contact* pc);

每个联系人都包含姓名,年龄,性别,电话号码,地址,我们需要一一录入,录入成功后,将有效个数(就是联系人个数)增加一,pc->sz增加一

展示联系人的信息:

void ShowContact(Contact* pc);

 就是打印出,通讯录里存在的联系人的所有信息,使用的是循环语句。

删除指定人信息

void DelContact(Contact* pc);

就是我们输入我们想要的查找人的名字,如果通讯录里存在这个人,我就删除这个人的信息。这里实现了一个查找姓名的函数,因为在改变联系人信息功能里也需要实现查找这个功能,所以实现一个函数,减少代码的重叠性。

int Find_name(Contact* pc,char name[])

如果在查找函数中,找到这个人的姓名,我们将返回这个人在结构体数组的位置,就是pc->sz。找到了之后,我们会让后面一个人的信息复制到前一个人的空间里,从要删的人位置开始,直到通讯录要删的人位置以后的人都向前复制了。这样我们就删除指定人的信息。

查找指定人的信息

void SearchContact(Contact* pc);

我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后打印这个人的信息。

改变指定人信息

void ModifyContact(Contact* pc);

 我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后直接通过他的位置修改这个人的信息。

给通讯录的人信息排序

void SortContact(Contact* pc,int op);

排序我们使用的系统的自带的qsort给通讯录人员信息进行排序,qsort的原型

qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);

qrort函数第一个参数是排序空间的首地址,第二个参数是排序的个数,第三个参数是排序单个元素的大小,第四个元素是排序函数。

我们这里排序有两种选择,一是按照姓名排序,而是按照年龄排序,所以有两个排序函数

int cmp_by_name(const void* e1,const void* e2)//按照姓名排序
{
    return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}

int cmp_by_gae(const void* e1,const void* e2)//按照年龄排序
{
    return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age;
}

🐰 通讯录的原码

🌸主函数

#include"test.h"
void menu(void)
{
    printf("===========================\n");
    printf("        1.添加,2.删除       \n");
    printf("        3.查找,4.改动       \n");
    printf("        5.展示,6.排序       \n");
    printf("        0.退出             \n");
    printf("===========================\n");
}
enum Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT,
};
int main()
{
    Contact con;
    InitContact(&con);
    int input=0;
    int op=0;
    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:
                printf("请选择排序方法\n");
                printf("=========================\n");
                printf("1.按名字排序     2.按年龄排序\n");
                printf("=========================\n");
                scanf("%d",&op);
                SortContact(&con,op);
                break;
            case EXIT:
                printf("退出通讯录\n");
                break;
            default:
                printf("输入错误\n");
                break;
        }
    }while(input);
}

🌸头文件

#ifndef test_h
#define test_h
#include <stdio.h>
#endif /* test_h */

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

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;

typedef struct Contact
{
    PeoInfo data[MAX];//存放数据
    int sz;//有效信息的个数
}Contact;


//初始化
void InitContact(Contact* pc);
//增加指定联系人
void AddContact(Contact* pc);
//展示联系人的信息
void ShowContact(Contact* pc);
//删除指定人信息
void DelContact(Contact* pc);
//查找指定人的信息
void SearchContact(Contact* pc);
//改变指定人信息
void ModifyContact(Contact* pc);
//给通讯录的人信息排序
void SortContact(Contact* pc,int op);

🌸函数实现文件

#include "test.h"
void InitContact(Contact* pc)
{
    pc->sz=0;
    memset(pc->data,0,sizeof(pc->data));
}
void AddContact(Contact* pc)
{
    if(pc->sz==MAX)
    {
        printf("通讯录已满,无法增加\n");
    }
    else
    {
        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(Contact* pc)
{
    printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");
    for(int 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);
    }
}
int Find_name(Contact* pc,char name[])
{
    int i;
    int pos=-1;
    for( i=0;i<pc->sz;i++)
    {
        if(strcmp(name,pc->data[i].name)==0)
        {
            pos=i;
            break;
        }
    }
    return pos;
}
void DelContact(Contact* pc)
{
    if(pc->sz==0)
    {
        printf("通讯录为空,无法删除\n");
    }
    //删除
    //1.找到删除人的位置
    char name[MAX_NAME];
    int pos=-1;
    int i;
    printf("输入删除人的名字;>\n");
    scanf("%s",name);
    pos=Find_name(pc,name);
    if(pos==-1)
    {
        printf("要删的人不存在\n");
    }
    else{
        for(i=pos;i<pc->sz-1;i++)
        {
            pc->data[i]=pc->data[i+1];
        }
        pc->sz--;
        printf("删除成功\n");
    }
}
void SearchContact(Contact* pc)
{
    char name[MAX_NAME];
    printf("输入查找人的名字;>\n");
    scanf("%s",name);
    int pos=-1;
    pos=Find_name(pc, name);
    if(pos==-1)
    {
        printf("查找的人不存在\n");
    }
    else
    {
        printf("%-10s %-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(Contact* pc)
{
    char name[MAX_NAME];
    printf("输入修改人的名字;>\n");
    scanf("%s",name);
    int pos=-1;
    pos=Find_name(pc, name);
    if(pos==-1)
    {
        printf("修改人信息不存在\n");
    }
    else
    {
        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");
    }
}
int cmp_by_name(const void* e1,const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}
int cmp_by_gae(const void* e1,const void* e2)
{
    return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age;
}
void SortContact(Contact* pc,int op)
{
    if(op==1)
    {
        qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);
        printf("排序成功\n");
    }
    if(op==2)
    {
        qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_gae);
        printf("排序成功\n");
    }
}

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 ​​​​​​​ 


http://www.kler.cn/a/2197.html

相关文章:

  • Windows如何切换用户访问局域网共享文件夹,如何切换网上邻居的账户
  • 基于Springboot的在线问卷调查系统【附源码】
  • AtCoder Beginner Contest 385(A~F)题解
  • Cherno C++学习笔记 P46 箭头运算符
  • 由于这些关键原因,我总是手边有一台虚拟机
  • Vue 92 ,Element 15 ,Vue + el-upload 实现图片上传与管理
  • Springboot源代码总结
  • Maven
  • Unity --- 游戏案例 --- 英雄无敌与Ruby
  • 第十九天 Maven总结
  • Python爬虫——Python Selenium基本用法
  • 字典树(前缀树)
  • 【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程
  • Android性能优化的底层逻辑
  • Java实习生------Redis常见面试题汇总(AOF持久化、RDB快照、分布式锁、缓存一致性)⭐⭐⭐
  • Qt基础之三十三:海量网络数据实时显示
  • Spring Boot 中文参考指南(二)-Web
  • 前端网络安全
  • 吃透Java面试题,建议收藏
  • C++基础算法③——排序算法(选择、冒泡附完整代码)
  • Android Lancet Aop 字节编码修复7.1系统Toast问题(WindowManager$BadTokenException)
  • Vite中ant design vue按需引入以及css预处理配置
  • 【Java SE】变量的本质
  • 【Spring-boot源码剥析】| 启动原理之侠客行篇
  • 谷歌外链怎么挑选?谷歌外链高质量平台有哪些?
  • 磁盘I/O %util特别高