C中结合项目使用qsort对结构体进行排序(模拟通讯录排序功能)

项目中通信录要实现排序功能->通讯录相当于一个结构体对象->对一个结构体对象的内容进行排序

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h";

void menu() 
{
    printf("*****************************\n");
    printf("****1.add 2.del 3.update*****\n");
    printf("****4.find 5.show 6.qsort****\n");
    printf("**********0.quit*************\n");
    printf("请选择使用的功能>>>");
}

enum function {
    QUIT,
    ADD,
    DEL,
    UPDATE,
    FIND,
    SHOW,
    SORT
};

void test()
{
    int input=0;
    int flag= 0;
    Contact con;//通讯录
    initContact(&con);
    do
    {
        menu();
        scanf("%d",&input);
        switch(input)
        {
        case QUIT:
            printf("程序退出成功");
            break;
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DelContact(&con);
            break;
        case UPDATE:
            UpdateContact(&con);
            break;
        case FIND:
            FindContact(&con);
            break;
        case SHOW:
            ShowContact(&con);
            break;
        case SORT:
            printf("****1.sort_age 2.sort_name****\n");
            printf("请选择使用的排序方式>>");
            scanf("%d",&flag);
            if (flag == 1)
            {
                Sort_age(&con);
            }
            else if(flag == 2)
            {
                Sort_name(&con);
            }
            else 
            {
                printf("输入错误\n");
            }
            break;

        default:
            printf("输出错误请重新输入\n");
            break;
        }
    }while(input);    
}

int main()
{
    test();
    return 0;
}

---------------------------------------------------------------------------------------------------------------------

contact.h

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

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TEL 12
#define MAX_ADDR 30

typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tel[MAX_TEL];
    char addr[MAX_ADDR];
} perInfo;

typedef struct Contact 
{
    perInfo data[MAX];
    int sz;
} Contact;
 
void initContact(Contact* pc);

void AddContact(Contact* pc);

int FindByName(const Contact* pc,char name[]);

void ShowContact(const Contact* pc);

void DelContact(Contact* pc);

void UpdateContact(Contact* con);

void FindContact(const Contact* con);
void Sort_age( Contact* pc);
void Sort_name(Contact* pc);

--------------------------------------------------------------------------------------------------------------------

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

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

void AddContact(Contact * pc)
{    
    assert(pc);
    if (100== pc->sz)
    {
        printf("通讯录已满, 无法添加\n");
    }
    printf("请入姓名>");
    scanf("%s", pc->data[pc->sz].name);
    printf("请入年龄>");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请入性别>");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请入电话号码>");
    scanf("%s", pc->data[pc->sz].tel);
    printf("请输入家庭住址>");
    scanf("%s",pc->data[pc->sz].addr);
    pc->sz++;
    printf("个人信息添加成功\n");
};

int FindByName(const Contact* pc, char name[]) 
{
    int i = 0;
    for (i=0;i<pc->sz;i++) 
    {
        if (strcmp(pc->data[i].name,name)== 0)
        {
            return i;
        }
    }
    return -1;//找不到
}

void ShowContact(const Contact* pc)
{
    int i = 0;

    //打印列标题
    printf("%-20s\t%-4s\t%5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");

    //打印数据
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-20s\t%-4d\t%5s\t%-12s\t%-30s\n",
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tel,
            pc->data[i].addr);
    }
    return;
}

void DelContact(Contact* pc)
{
    if (pc->sz==0) 
    {
        printf("通讯录为空,无法删除\n");
        return;
    }
    assert(pc);
    int i = 0;
    int del = 0;
    printf("请输入删除人的名字>");
    char del_name[MAX_NAME] = {0};
    scanf("%s", del_name);

    del = FindByName(pc,del_name);
    if (del==-1) 
    {
        printf("要删除的人不存在\n");
        return;
    }

    //删除个人信息
        for (i = del; i < pc->sz - 1; i++)
        {
            pc->data[i] = pc->data[i + 1];
        }
        pc->sz--;
        printf("成功删除联系人\n");

}

void UpdateContact(Contact* pc) 
{
    int i = 0;
    int upd = 0;
    printf("请输入通讯录中联系人姓名>");
    char upd_name[MAX_NAME] = { 0 };
    scanf("%s", upd_name);
    upd = FindByName(pc,upd_name);
    if (upd == -1) 
    {
        printf("未找到要修改的联系人信息\n");
        return;
    }

    //修改个人信息
    printf("请入要修改的姓名>");
    scanf("%s", pc->data[upd].name);

    printf("请入要修改的年龄>");
    scanf("%d", &(pc->data[upd].age));
    
    printf("请入要修改性别>");
    scanf("%s", pc->data[upd].sex);
    
    printf("请入要修改电话号码>");
    scanf("%s", pc->data[upd].tel);
    
    printf("请输入要修改家庭住址>");
    scanf("%s", pc->data[upd].addr);

    printf("个人信息修改成功\n");
}

void FindContact(const Contact* pc)
{
    int i = 0;
    printf("请输入要查找的联系人的姓名>");
    char find_name[MAX_NAME] = { 0 };
    scanf("%s", find_name);
    i = FindByName(pc, find_name);
    if ( i== -1)
    {
        printf("查找失败\n");
    }
    else
    {
        printf("查找成功\n");
        printf("%-20s\t%-4s\t%5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-4d\t%5s\t%-12s\t%-30s\n",
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tel,
            pc->data[i].addr);
    }
}

int compare_age(const void* p1, const void* p2)
{
    return ((struct PeoInfo *)p1)->age - ((struct PeoInfo *)p2)->age;
}

int compare_name(const void* p1, const void* p2)
{
    return strcmp(((struct PeoInfo*)p1)->name,((struct PeoInfo*)p2)->name);
}

void Sort_age(Contact* pc) 
{
    //排序,按照什么排序? 年龄
    qsort(pc->data, pc->sz, sizeof(pc->data[0]), compare_age);
    ShowContact(pc);
}

void Sort_name(Contact* pc) 
{    
    //排序,按照什么排序? 名字
    qsort(pc->data,pc->sz,sizeof(pc->data[0]),compare_name);
    ShowContact(pc);
}

------------------------------------------------------------------

名字排序结果

——--————————————————————————————————————————

年龄排序结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/350082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据和C

本文参考C Primer Plus学习 文章目录 _Bool类型float、double和long double复数和虚数类型其他类型 1._Bool类型 _Bool类型&#xff0c;用于表示布尔值&#xff0c;即逻辑值true和false。因为C语言用值1表示true&#xff0c;值0表示false。所以_Bool类型实际上也是一种整数类型…

C#,获取与设置Windows背景图片的源代码

为了满足孩子们个性化桌面的需求。 这里发布获取与设置Windows背景图片的源代码。 1 文本格式 using System; using System.IO; using System.Data; using System.Linq; using System.Text; using System.Drawing; using System.Collections; using System.Collections.Gene…

海外媒体发稿:出口贸易媒体发稿推广8种方法让您事半功倍-华媒舍

通过出口贸易媒体发稿可以帮助企业拓展市场、提升知名度&#xff0c;从而取得更好的出口贸易业绩。在进行媒体发稿时&#xff0c;需要确定目标受众&#xff0c;编写吸引人的标题&#xff0c;提供有价值的内容&#xff0c;并选择合适的媒体平台和发布时间。通过持续改进和优化&a…

九大项目主要页面预览

前后端开发均已完成&#xff0c;以后开发项目&#xff0c;从这些项目中拷贝源码就可以 一、网校平台后台系统 二、音频小说项目 三、仿微信项目 四、视频点播项目 五、商城系统 六、在线教育App 七、在线教育SSR网站 八、直播项目 九、社区交友

通过FileZilla配置FTP

FileZilla服务端的安装 在虚拟机里安装FileZilla服务器 FileZilla的官网 下载一个客户端和一个服务端的FileZilla 如果已经有了一个客户端&#xff0c;可以不下用载。 FileZilla的配置 说明一下&#xff1a;通过FileZilla配置FTP有两种模式&#xff0c;我们先用被动模式 下载…

基于密码技术的身份认证——基于对称密码体制的身份认证

一、符号说明&#xff1a; A→B&#xff1a;表示通信实体A向通信实体B发送消息&#xff1b; Ek(x)&#xff1a;表示用认证双方共享的密钥K对x进行加密&#xff1b; Text1&#xff0c;Text2&#xff0c;……&#xff0c;Text n属于可选项&#xff1b; ||&#xff1a;表示比特…

行测-言语:1.片段阅读

行测-言语&#xff1a;1.片段阅读 解题顺序&#xff1a;提问—文段—选项 忠于文段&#xff0c;对比择优 1. 中心理解题 1.1 重点词语 1.1.1 关联词 1.1.1.1 转折关系 A&#xff0c;转折后面是重点&#xff0c;不仅…还… 的内容是带来的结果。规范一定长期利好&#xff0c…

实验:eNSP AR通过telnet远程登录另外一台AR

实验2&#xff1a;eNSP AR通过telnet远程登录另外一台AR 基于实验1的基础上来进行&#xff0c;我们通过AR2220登录AR3260 首先设置远程登录密码 1、user-interface vty 0 4 进入用户的虚拟终端 2、设置密码 set authentication password cipher Huawei 这里的意思就是设置密…

微软 Power Apps Canvas App 画布应用将上传的附件转化为base64编码操作

微软 Power Apps Canvas App 画布应用将上传的附件结合Power Automate转化为base64编码操作 在使用canvas app的过程中&#xff0c;我们有时需要将上传的文件转换为base64存入数据库或者&#xff0c;调用外部接口传参&#xff0c;那么看下如何将文件转化为base64编码格式。 首先…

JVM系列-8.GC调优

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

STM32 USART 的25个函数简单说明

1、函数USART_DeInit 2、函数USART_Init 我们主要用USART_InitTypeDef中的成员含义 波特率 数据位 停止位 奇偶校验位 硬件流控制模式 收发模式 3、函数USART_StructInit 成员可参考2中函数成员解释 4、函数USART_Cmd 5、函数USART_ITConfig USART_IT&#xff1a;输入参数USAR…

【C++干货铺】常用的特殊类——饿汉模式和懒汉模式

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 请设计一个类&#xff0c;不能被拷贝 请设计一个类&#xff0c;只能在堆上创建对象 请设计一个类&#xff0c;只能在栈上创建对象 请设计一个类&#xff0c;不…

Maya的ai功能有哪些?Maya Assist是什么?

Autodesk Maya是一款流行的 3D 建模软件&#xff0c;艺术家和设计师使用它来创建现实的世界和表面。该软件以其与各种工具开发人员的合作而闻名&#xff0c;它允许多个工具的无缝集成以改进功能。Autodesk 的 Maya 刚刚发布了 Maya Assist&#xff0c;在 3D 建模和动画领域树立…

redis主从复制薪火相传

一.主从复制 1、是什么 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 2、能干嘛 读写分离&#xff0c;性能扩展&#xff08;主 写 从 读&#xff09; 容…

瑞_力扣LeetCode_二叉搜索树相关题

文章目录 说明题目 450. 删除二叉搜索树中的节点题解递归实现 题目 701. 二叉搜索树中的插入操作题解递归实现 题目 700. 二叉搜索树中的搜索题解递归实现 题目 98. 验证二叉搜索树题解中序遍历非递归实现中序遍历递归实现上下限递归 &#x1f64a; 前言&#xff1a;本文章为瑞…

【验证码逆向专栏】最新某验三代滑块逆向分析,干掉所有的 w 参数!

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

EOCR-FEZ漏电保护器下低压工业领域的应用

电柜中常见的故障主要包括以下几种&#xff1a; 断路器故障&#xff1a;断路器是配电柜中的主要元件之一&#xff0c;常见的故障包括断路器拒动、误动、爆炸、烧毁等。这些故障可能是由于断路器的机械故障、电气故障或者是控制回路的问题所导致的。接触器故障&#xff1a;接触…

华为防火墙USG6000V1的NAT实验

实验拓扑&#xff1a; 之前实验做过&#xff0c;可以翻找之前的博客&#xff0c;各设备ip和接口已配好&#xff0c;均可可ping通防火墙。 实验要求&#xff1a; 一.生产区在工作时间内可以访问dmz区域&#xff0c;仅可以访问http服务器。 二.办公区全天可以访问dmz区域&…

Ceph篇之搭建Ceph可视化界面Dashboard

一、Ceph Dashboard Ceph 提供了原生的Dashboard功能&#xff0c;通过Dashboard可以获取Ceph集群的各种基本状态信息等。 二、搭建Ceph Dashboard step1&#xff1a;在每个mgr节点安装 yum install ceph-mgr-dashboard -ystep2&#xff1a;开启mgr功能 ceph mgr module enab…

全新PHP短网址生成系统,短链接生成系统,URL缩短器系统源码

PHP短网址系统URL缩短器平台&#xff0c;它使您可以轻松地缩短链接&#xff0c;根据受众群体的位置或平台来定位受众&#xff0c;并为缩短的链接提供分析见解。 系统使用了Laravel框架编写&#xff0c;前后台双语言使用&#xff0c;可以设置多域名&#xff0c;还可以开设套餐等…