C语言 简单使用qsort 比较结构体字符串大小

1.先简单调用C语言封装好的冒泡排序

c 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//qsort C语言封装好的冒泡排序 可比较任何类型
struct stu{
    char name[20];
    int age;
};
//用户自己写的函数。函数名字也作为函数指针使用。是qsort函数的第四个参数
// void *代表可以接受任意类型的地址 但由于不清楚所占字节 所以不能对void*进行解引用和加减整数操作
//指针类型决定解引用时所访问空间大小   也决定指针加减整数时移动多大内存
int Compare_st(const void *e1,const void *e2)
{
    return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
    //想要对什么数据进行比较 就强制转换为什么类型的指针
}
int main(){
    struct stu a [3]={{"zhangsan",20},{"lisi",10},{"wangwu",15}};
    int leng=sizeof(a)/sizeof(a[0]);
    qsort(a,leng,sizeof(a[0]),Compare_st);
    //第一个参数为需排序数组首元素 第二个参数为需排序数组长度 第三个参数为需排序数组一个元素的大小 第四个参数为想要如何排序的函数(用户自己写的)的指针
    for(int x=0;x<3;x++){
        printf("%s %d ",a[x].name,a[x].age);
    }
    return 0;
}

2.代码实现比较任意类型的冒泡排序(排序结构体字符串)

c 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct stu{
    char name[20];
    int age;
};

void swap(char*a,char* b,int awidth){
    int i=0;//一次比较按照字符对内容进行交换
    for(i=0;i<awidth;i++)
    {
        char temp=*a;
        *a=*b;
        *b=temp;
        a++;
        b++;
    }

}

int Compare_st(const void *e1,const void *e2)
{
    return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
    //想要对什么数据进行比较 就强制转换为什么类型的指针
}

//第一个参数为需排序数组首元素地址 第二个参数为需排序数组长度 第三个参数为需排序数组一个元素的大小
// 第四个参数为想要如何排序的函数(用户自己写的)的指针
void test_qsort(void *a,int leng,int awidth,int(* Compare)( void *e1, void *e2)){
    int i=0;
    int j=0;
    //普通冒泡排序双层循环
    for(i=0;i<leng-1;i++)
    {//比较趟数
        for(j=0;j<leng-1-i;j++)
        {//一趟比较次数
            if(Compare((char *)a+j*awidth,(char *)a+(j+1)*awidth)>0)
            //将数组内容传到用户写的函数里进行比较  >0升序排列
           //(char *)a+j*awidth和(char *)a+(j+1)*awidth两个参数 强制转换为(char*)
           //(char*)+1 跳过一个字节 +2跳过两个字节.... 比较容易操作任意类型
           //假如 数组现在是987654321    这两个参数就是9和8 下次循环就是8和7
              swap((char *)a+j*awidth,(char *)a+(j+1)*awidth,awidth);//交换内容
        }
    }
}


int main(){
    struct stu a [3]={{"zhangsan",20},{"lisi",10},{"wangwu",15}};
    int leng=sizeof(a)/sizeof(a[0]);
    test_qsort(a,leng,sizeof(a[0]),Compare_st);//模拟C语言的任意冒泡排序
    //第一个参数为需排序数组首元素 第二个参数为需排序数组长度 
    //第三个参数为需排序数组一个元素的大小 第四个参数为想要如何排序的函数(用户自己写的)的指针
    for(int x=0;x<3;x++){
        printf("%s %d ",a[x].name,a[x].age);
    }
    return 0;
}
相关推荐
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
xiaobobo333016 小时前
C语言中宏定义宏名和宏值之间的关系
c语言·宏定义·语义型
a44931536219 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
a44931536220 小时前
iPhone 充电故障的全链路诊断——从 Lightning/USB-C 接口到 Tristar 充电 IC
c语言·macos·ios·电脑·硬件架构·iphone
qq_4480111620 小时前
C语言中的getchar()
c语言·开发语言
天空'之城20 小时前
C 语言工业级通用组件手写 15:累加和校验
c语言·嵌入式开发·工业级组件·累加和校验
碎光拾影1 天前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
GeekArch1 天前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
wuyk5552 天前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
无相求码2 天前
C程序的内存到底怎么分的?栈、堆、全局区一张图讲清楚
c语言