2012-02-12 129 views
0

我有一个持有int的结构。将指针数组排序到指针

typedef struct n { 
    int cars; 
    struct n *next; 
} node; 

我做节点,如node *temp; 这是因为我开始一个链接列表,然后通过它,并将其添加到一个数组。

然后被添加到阵列中node **arr;

所以,我有一个指针数组的指针。我的问题是:我怎样才能做到这一点?我尝试到现在为止已经造成:

qsort(arr, numberCars, sizeof(node), sortCars); 

int sortCars(const void *i1, const void *i2){ 
    node *a = (node*)i1, *b = (node*)i2; 
    return (a->cars - b->cars); 
} 

我有困难,搞清楚什么快速排序实际上是指向。

回答

1

既然你的指针数组,你的函数应该与比较指针:

int sortCars(const void *i1, const void *i2){ 
    node *a = *(node**)i1, *b = *(node**)i2; 
    return (a->cars - b->cars); 
} 

Als o,你应该通过sizeof(node*)而不是sizeof(node)

顺便说一句,qsort排序数组中的元素,但不影响next,所以你的链表将保持未排序。

0

如果节点具有next指针,则表示链接列表。这与数组不一样。你确定你在连续的内存块中分配所有的结构吗?这就是排序算法需要的第一个参数。

typedef struct n { 
    int cars; 
} node; 

node arr[10]; // ten nodes as an array 

(如何将一般的排序函数知道你定义的结构更新next指针?)

此外,如果arrnode **arr,这不是指针的指针数组。它是一个指向指针的指针,或者(大致相当于)一个数组数组,一个指向数组或指针数组的指针。

+0

我将它们设置为链接列表,然后从中创建一个数组。 – RichInDreams 2012-02-12 22:27:48

0

比较函数必须返回int值:

int sortCars(const void *i1, const void *i2) 

的,你也可以做到这一点功能更简单:

int sortCars(const void *i1, const void *i2){ 
    return ((*((node**) i1))->cars - (*((node**) i2))->cars); 
}