| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2621 人关注过本帖
标题:[求教]qsort对结构体二级排序,程序不能运行?
只看楼主 加入收藏
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
结帖率:97.06%
收藏
已结贴  问题点数:50 回复次数:10 
[求教]qsort对结构体二级排序,程序不能运行?
#include <stdio.h>  
#include <stdlib.h>
void main()
{
struct In
{
int x;   

int y;   

}s[10];

int cmp( const void *a , const void *b )
{

struct In *c = (In *)a;

struct In *d = (In *)b;

if(c->x != d->x) return c->x - d->x;

else return d->y - c->y;

}
int i,j;
for(i = 0; i< 10; i++)  
        scanf("%d%d ", &s[i].x,&s[i].y);  

qsort(s,10,sizeof(s[0]),cmp);

for(i = 0; i< 10; i++)  
        printf("%d%d ", s[i].x,s[i].y);  

    printf("\n");  
}  


[此贴子已经被作者于2017-1-31 15:36编辑过]

搜索更多相关主题的帖子: include return 结构体 
2017-01-31 15:33
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:20 
qsort的第四个参数是函数指针,如果我没记错的话。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-31 15:35
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:30 
你应该建立一个结构体指针数组,然后才能通过qsort进行排序。
因为据我所知,qsort的工作原理是sort主函数里选择特定两个元素,并将它们的地址值传递给cmp函数作比较,根据返回的int值考虑是否将这两个值互换。

因为qsort并没办法提前知道你每次要进行排序的数组都分别是什么类型的,所以它把所有类型都当做void处理,用指向这些元素的指针执行替换命令。

结构体类型的元素显然计算机是不能直接为其实现赋值操作的(因为人家写qsort标准函数的时候还不知道你的结构体类型到底什么造型,所以不能直接赋值。除非你愿意在结构体声明之后自己根据实际情况写一个qsort,这时候的qsort就可以知道结构体类型长什么样,需要多少长度),更遑论交换。而如果你用于排序的是一个指针数组,那么无论这个指针是什么样鬼马的结构体指针qsort都可以处之泰然,因为所有的指针都是一个类型,占据的内存都一样!赋值起来就会很方便。

所以我个人的习惯就是遇到任何需要排序的结构体数据,我都会先定义一个指针数组,然后每读一个数据malloc一段空间、生成一个指针保存进数组。这样包括排序、插入、删除、查找等一系列操作都会便捷地多。很大程度上也会节约空间。当然有利必有弊,频繁的malloc一定会比一次性定义一个足够大的结构体数组所消耗的时间要多得多。
收到的鲜花
  • 九转星河2017-01-31 22:11 送鲜花  20朵   附言:我很赞同

φ(゜▽゜*)♪
2017-01-31 16:27
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
网上有个例子程序,却不能运行;

#include<algorithm>            
#include<stdlib.h>            
using namespace std;            
            
typedef struct node            
{            
    int x,y;        
}G;            
            
int cmp1(const G &a,const G &b)            
{            
    if(a.x!=b.x) return a.x>b.x;  //以X递减排序         
    else return a.y>b.y;//x相同,以y递减排序         
}//sort            
            
int cmp2(const void *a,const void *b)            
{            
    G *p1=(G *)a;        
    G *p2=(G *)b;        
    if(p1->x!=p2->x) return p1->x-p2->x;//以X递增排序        
    else return p1->y-p2->y; //x相同,以y递增排序        
}//qsort            
            
int main()            
{            
    int n;        
    int i,j,k;        
    G array[1001];        
    while(scanf("%d",&n)!=EOF)        
    {        
        for(i=0;i<n;i++)   
        {   
            scanf("%d%d",&array[i].x,&array[i].y);
        }   
        sort(array,array+n,cmp1);   
        for(i=0;i<n;i++)   
        {   
            printf("%d %d\n",array[i].x,array[i].y);
        }   
        qsort(array,n,sizeof(array[0]),cmp2);   
        for(i=0;i<n;i++)   
        {   
            printf("%d %d\n",array[i].x,array[i].y);
        }   
    }        
    return 0;        
}            


[此贴子已经被作者于2017-1-31 18:06编辑过]

2017-01-31 17:04
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
编辑掉。

[此贴子已经被作者于2017-1-31 17:26编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-31 17:20
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
回复 5楼 renkejun1942
问题如下:用qsort结构体二级排序
a[10]={1,2,3,5,3,6,0,7,-3,5}
c[10]={5,3,2,1,6,7,8,0,6,6}
找出c!=0时,a最大,c最小,求出a/c的值;
2017-01-31 17:30
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
回复 3楼 书生牛犊
用心参考网上举例程序,程序可以运行了,希望能在工作里应用,如下:
#include <stdio.h>                     
#include <stdlib.h>                     
typedef struct node
{                     
    int x;                     
    int y;                                            
}G;                     
int cmp(const void *a, const void *b)                     
{      
    G*p1=(G*)a;
    G*p2=(G*)b;
    if(p1->x!=p2->x)
        return p1->x-p2->x;
    else return p1->y-p2->y;
}                     
int main()                     
{

    int i;
    G a[10];

{
for(i=0;i<10;i++)
{
    scanf("%d%d",&a[i].x,&a[i].y);
}
qsort(a,10,sizeof(a[0]),cmp);
for(i=0;i<10;i++)
{
    printf("%d %d\n",a[i].x,a[i].y);
}
}
return 0;
}                 
                        
  1 2 3 -6 7 -9 0 -8 7 1 2
 1 2 3 -6 7 -9 0 -8 7 1 9
-9 0
-8 7
-6 7
0 -8
1 2
2 1
2 3
3 -6
7 -9
7 1
Press any key to continue   

[此贴子已经被作者于2017-1-31 20:45编辑过]

2017-01-31 20:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉代码只是一种封装~里面的算法和思想才是值得学习的精华~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-31 21:59
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
回复 8楼 九转星河
算法和思想是逻辑结构,高效的计算工具;工作科研大有帮助;
2017-01-31 22:11
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 9楼 宇宙规律
我就说了两句废话,嗯……其中一句连废话都不算的错误,你给了我20分,吓死我了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-31 22:45
快速回复:[求教]qsort对结构体二级排序,程序不能运行?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018065 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved