结构体排序

本文介绍了如何使用C语言的qsort函数对结构体数组进行排序,探讨了比较函数strcmp的使用,并分享了在实现过程中遇到的奇妙错误及解决经验。文章通过具体的代码示例展示了结构体一级、二级排序的实现方法,强调理解题意和避免编程陷阱的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由题引入

浙大复试 hdoj1862
C=1,结构体一级排序,C=2,C=3对结构体二级排序。
AC代码详解博客站内很多,在此记录一下我遇到的问题。(没错,这是一篇伪题解博客)

想法

看到题后,数据储存第一想法是单链表存储,排序时就有两种方法,交换结点指针,或者交换结点内容。这两种方法我都不熟练的情况下,还担心了自己写的排序模块会不会时间过长,想到了用C语言<stdlib.h>库函数qsort() 。
qsort函数对数组元素进行排序,于是数据存储就换成了结构体数组。(其实可以把链表元素遍历一遍,存入数组进行排序,输出排序后的数组。)

qsort()函数

函数原型:
void qsort(void *base,size_t nitems,size_t size,int (*compare)(const void *,const void *))

参数
base-- 指向要排序的数组的第一个元素的指针。
nitems-- 由 base 指向的数组中元素的个数。
size-- 数组中每个元素的大小,以字节为单位。
compare-- 用来比较两个元素的函数,即函数指针(回调函数)

回调函数:就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。1

compare函数:2
标准,qsort函数需要被告知一个规则,什么是大什么是小。
通过编写比较函数可以为函数qsort提供这些信息。
当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数。
如果* p小于* q,那么返回的数为负数;如果* p等于* q,那么返回0。如果* p大于* q,返回正数。

strcmp()函数

还有对字符串数组的排序,可使用strcmp函数。(之前有试过自己用字符串数组首元素地址所对应的空间中字母的ASC||值比较,未成功)

函数原型:
int strcmp(const char *s1,const char *s2);

规则:3
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如:
1.“A”<“B”
2.“A”<“AB”
3.“Apple”<“Banana”
4.“A”<“a”
5.“compare”<“computer”

源码:

int strcmp(const char *str1,const char *str2)
{
   
    while(*str1 == *str2)
    {
   
        assert((str1 != NULL) && (str2 != NULL));                
        if(*str1 == '\0')
            return 0;        
        str1++;
        str2++;
    }
    return *str1 - *str2;
}

模拟算法:

int strcmp(const char * src, const char * dst)
{
   
    int ret = 0 ;
    while(!(ret=*src-*dst) && *dst)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值