45.使用qsort對結構體數組進行排序,實現對結構的體一級排序和二級排序,進一步了解qsort的原理


qsort對結構體數組進行排序時,可以根據結構體元素中的任意某個成員進行比較之后,如果要交換則會連帶結構體中其他成員的一起進行整體的結構體元素交換
所以感覺真是萬能排序接口



只進行對結構體的一級排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _stu
{
    char name[10];
    float score;
}Stu;


int callBackCompare(const void * pa, const void * pb)//一級升序
{
#if 0//正確
    if(strcmp((*(Stu*)pa).name,(*(Stu*)pb).name)>0)
        return 1;
    else
        return 0;//或return -1;都行,畢竟qsort只對正數感興趣
#endif

#if 1  //正確
    if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name) > 0 )
        return 1;
    else
        return 0;//或return -1;都行,畢竟qsort只對正數感興趣

#endif
}

int main(void)
{
    Stu stu[] = {{"aaa",23.5},
                 {"xxx",45.6},
                 {"bbb",89},
                 {"xxx",23.4},
                 {"yyy",100}};

    qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),callBackCompare);

    int i;
    for(i = 0;i<5;i++)
    {
        printf("%s,%f\n",stu[i].name,stu[i].score);

    }

    return 0;
}




對結構體一級排序的同時進行二級排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _stu
{
    char name[10];
    float score;
}Stu;


int callBackCompare(const void * pa, const void * pb)//一級升序二級降序
{
#if 0//正確
    if(strcmp((*(Stu*)pa).name,(*(Stu*)pb).name)>0)//對1級進行升序
        return 1;
    else
    {
        if( (*(Stu*)pa).score < (*(Stu*)pb).score )//對2級進行降序
        {
            return 1;
        }
        else
            return 0;
    }
#endif

#if 0  //正確
    if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name) > 0 )
        return 1;
    else
    {
        if( ((Stu*)pa)->score < ((Stu*)pb)->score )//對2級進行降序
        {
            return 1;
        }
        else
            return 0;
    }

#endif
}

int main(void)
{
    Stu stu[] = {{"aaa",23.5},
                 {"xxx",45.6},
                 {"bbb",89},
                 {"xxx",23.4},
                 {"yyy",100}};

    qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),callBackCompare);

    int i;
    for(i = 0;i<5;i++)
    {
        printf("%s,%f\n",stu[i].name,stu[i].score);

    }

    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM