用qsort对指针数组进行排序,失败了,帮忙看看

Longerandlonger 2010-08-21 02:27:08

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

#define SZ 10

typedef struct node
{
unsigned long id; // 排序时,要根据结构体的id进行排序
} node;

int cmp(const void* pn1, const void* pn2); // 比较函数

int main(int argc, char* argv[])
{
int nLoop = 0;
node* Array[SZ];

srand(time(NULL));
for(nLoop = 0; nLoop < SZ; ++nLoop)
{
Array[nLoop] = malloc(sizeof(node));
Array[nLoop]->id = rand();
printf("%d ", (Array[nLoop])->id );
}
printf("\n\n");

qsort(Array, SZ, sizeof(node*), cmp);

for(nLoop = 0; nLoop < SZ; ++nLoop)
{
printf("%d ", (Array[nLoop])->id );
}
printf("\n\n");

return 0;
}

int cmp(const void* pn1, const void* pn2) // 比较函数
{
const node* p1 = pn1;
const node* p2 = pn2;
int val;
if(p1->id < p2->id)
{
val = -1;
}
else if (p1->id == p2->id)
{
val = 0;
}
else
{
val = 1;
}
return val;
}
...全文
489 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
meimy888 2010-08-21
  • 打赏
  • 举报
回复
指针的陷阱真是无处不在啊
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
int cmp(const void* pn1, const void* pn2) // 比较函数
{
int val;
if (pn1 && pn2)
{
const node ** p1 = pn1;
const node ** p2 = pn2;
if((*p1)->id < (*p2)->id)
{
val = -1;
}
else if ((*p1)->id == (*p2)->id)
{
val = 0;
}
else
{
val = 1;
}
}
else
{处理异常情况} //若不加这一句,若出现异常,会return初始值 val=0,但是结果会不对
return val;
}

不好意思,上面写的不对,应该考虑出现异常的情况,
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
else
val = 1;
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
楼主不要急着结贴
我觉得代码应改进一下
int cmp(const void* pn1, const void* pn2) // 比较函数
{
int val;
if (pn1 && pn2)
{
const node ** p1 = pn1;
const node ** p2 = pn2;
if((*p1)->id < (*p2)->id)
{
val = -1;
}
else if ((*p1)->id == (*p2)->id)
{
val = 0;
}
else
{
val = 1;
}
}
else
val = 1;

return val;
}

ljhnew 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pro_to_life 的回复:]
楼上(3楼)代码考虑了代码的健壮性,2楼3楼的,我想问问,为什么
const node* p1 = pn1;
const node* p2 = pn2;
要改为
const node ** p1 = pn1;
const node ** p2 = pn2;
[/Quote]

cmp实际上希望你输入一个对你排序的数组的两个单元的比较方法。qsort在比较过程中,会反复的回调你输入的cmp函数,并把两个要比较的数组的位置给你传出来,有你的cmp函数判断,返回值-1小于,0等于,1大于。
而楼主的使用例子中,数组的单元中存储的是一个指针,指向node的指针,所以才cmp中输入的两个对象pn1和pn2本别是存放着两个指针的位置,需要取出指针后再引用对象。
Longerandlonger 2010-08-21
  • 打赏
  • 举报
回复
我说的是2楼,3楼,结贴
Longerandlonger 2010-08-21
  • 打赏
  • 举报
回复
原来如此!!!!

感谢楼上二位,C语言的指针,太陷阱了!!!

结贴
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
楼上(3楼)代码考虑了代码的健壮性,2楼3楼的,我想问问,为什么
const node* p1 = pn1;
const node* p2 = pn2;
要改为
const node ** p1 = pn1;
const node ** p2 = pn2;
Soulic 2010-08-21
  • 打赏
  • 举报
回复
其实楼主只要在cmp函数中添加输出语句,将传入的值打印出来就可以知道问题所在,qsort传给cmp函数的参数是指向数组元素的指针,而你的数组元素还是指针,所以在cmp函数中就要使用二级指针。
ljhnew 2010-08-21
  • 打赏
  • 举报
回复

int cmp(const void* pn1, const void* pn2) // 比较函数
{
int val;
if (pn1 && pn2)
{
const node ** p1 = pn1;
const node ** p2 = pn2;
if((*p1)->id < (*p2)->id)
{
val = -1;
}
else if ((*p1)->id == (*p2)->id)
{
val = 0;
}
else
{
val = 1;
}
}
return val;
}

Soulic 2010-08-21
  • 打赏
  • 举报
回复
int cmp(const void* pn1, const void* pn2) // 比较函数
{
const node** p1 = pn1;
const node** p2 = pn2;
int val;

if((*p1)->id < (*p2)->id)
{
val = -1;
}
else if ((*p1)->id == (*p2)->id)
{
val = 0;
}
else
{
val = 1;
}
return val;
}
gehui001 2010-08-21
  • 打赏
  • 举报
回复
看不懂啊....学习!!

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧