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

文章描述了一个C语言项目中,如何使用结构体实现通讯录功能,包括添加、删除、更新联系人,以及对联系人按照年龄和姓名进行排序。代码展示了如何使用qsort函数对通讯录中的联系人信息进行年龄和姓名排序,并提供了动态内存管理优化版本。
摘要由CSDN通过智能技术生成

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

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);
}

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

名字排序结果

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

年龄排序结果

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

项目优化:

1.通讯的空间不是固定的,大小可以调整的

2.默认能放3个人的信息,如果不够,就每次增加2个人的信息

//静态版本

typedef struct Contact 
{
    perInfo data[MAX];
    int sz;
} Contact;

//动态版本

#define DEFAULT_SZ 3

typedef struct Contact 
{
    perInfo* data;

    int sz;//记录当前放的有效元素的个数

    int capacity=DEFAULT_SZ;//最大容量

} Contact;

静态版本

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

动态版本

void initContact(Contact* pc)
{
    pc->data = (PeoInfo*)malloc(
DEFAULT_SZ*sizeof(PeoInfo));

   if(pc->data==NULL)

   {

        perror("Init Contact");

        return ;

   }
};

静态版本

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");
};

动态版本

#define INC_SZ 2

int CheckCapacity(Contact* pc)

{

    if (pc->sz== pc->capacity)
    {
        PeoInfo* ptr = (PeoInfo*)realloc(pc->data,
(DEFAULT_SZ+INC_SZ)*sizeof(PeoInfo));

        if(ptr==NULL)

        {

              perror("CheckCapacity");

              return 1;

        }

        else

        {

                pc->data=ptr;

                pc->capacity+=INC_SZ;

                return 0;

        }
    }
 

}

void AddContact(Contact * pc)
{    
    assert(pc);

     if(0==CheckCapacity(pc))

     {

        return ;

     } 
  
    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");
};

最后写一个释放函数

void DestoryContact(Contact* pc)

{

        free(pc->data);

        pc->data=NULL;

        pc->capacity=0;

        pc->sz=0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foreverInDebug Hou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值