免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: newbuding
打印 上一主题 下一主题

[C] 如何用qsort对一维指针数组排序? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-31 18:14 |只看该作者
可以把程序简化一下,发上来看看

论坛徽章:
0
12 [报告]
发表于 2008-05-31 19:03 |只看该作者
中间的qsort函数这样用肯定是不对的,我想知道在我不改动comp函数的前提下如何才能正确的排序?

#include <stdio.h>
#include <stdlib.h>

struct st {
&nbsp;&nbsp;&nbsp;&nbsp;int a;
&nbsp;&nbsp;&nbsp;&nbsp;int b;
};

int
comp(const void *p1, const void *p2)
{
&nbsp;&nbsp;&nbsp;&nbsp;const struct st *ptr1=p1;
&nbsp;&nbsp;&nbsp;&nbsp;const struct st *ptr2=p2;

&nbsp;&nbsp;&nbsp;&nbsp;return ptr1->a - ptr2->a;
}

int
main()
{
&nbsp;&nbsp;&nbsp;&nbsp;struct st *slist;
&nbsp;&nbsp;&nbsp;&nbsp;struct st *tab[10];
&nbsp;&nbsp;&nbsp;&nbsp;int i;


&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i<10;++i) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slist=malloc(sizeof(struct st));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (slist == NULL) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("new slist()");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slist->a=rand()%100;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slist->b=rand()%100;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tab[i]=slist;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;qsort(tab, sizeof(struct st), 10, comp);

&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i<10;++i) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(tab[i]);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
}

论坛徽章:
0
13 [报告]
发表于 2008-06-01 10:49 |只看该作者
改成这样看如何

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct st {
  4.     int a;
  5.     int b;
  6. };

  7. int
  8. comp(const void *p1, const void *p2)
  9. {
  10.     const struct st *ptr1=p1;
  11.     const struct st *ptr2=p2;

  12.     return ptr1->a - ptr2->a;
  13. }

  14. int comp_st(const void *p1, const void *p2)
  15. {
  16.         struct st** ptr1=p1;
  17.         struct st** ptr2=p2;
  18.         return comp(*ptr1,*ptr2);
  19.         }
  20. int
  21. main()
  22. {
  23.     struct st *slist;
  24.     struct st *tab[10];
  25.     int i;


  26.     for (i=0;i<10;++i) {
  27.         slist=malloc(sizeof(struct st));
  28.         if (slist == NULL) {
  29.             perror("new slist()");
  30.             exit(1);
  31.         }
  32.         slist->a=rand()%100;
  33.         slist->b=rand()%100;

  34.         tab[i]=slist;
  35.         printf("tab[%d]->a=%d\n",i,tab[i]->a);
  36.     }

  37.     qsort(tab, 10,sizeof(struct st*),  comp_st);

  38.     for (i=0;i<10;++i) {
  39.             printf("tab[%d]->a=%d\n",i,tab[i]->a);
  40.         free(tab[i]);
  41.     }

  42.     exit(0);
  43. }
复制代码

论坛徽章:
0
14 [报告]
发表于 2008-06-01 20:34 |只看该作者
谢谢gawk的回复,我的代码被我封装过了,上面是个简化的代码,实际上的排序工作在另一个模块中,是看不到比较函数comp到底是怎么比较的,所以无法照着comp的函数再写一个中间函数出来,你的方法对这段代码是可行的,可是我的实际工程要比这个复杂,不能照着comp的函数再写出一个来的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP