[英]Array of pointers that point to structures
我的结构是这样的:
typedef struct celltag{
char name[11];
double time;
struct celltag *next;
} celltype;
这种类型的结构保存在一系列链接列表中:
typedef celltype **Hash;
如果对于某些给定函数h(char x[]), h(X->name)=h(Y->name)
,则两个结构X和Y链接到同一列表中。 我要说的是,这些结构按其“名称”排序到数组中。
现在,我必须使用指针数组按结构的“时间”对结构进行排序,以使数组中的第一个指针指向时间最小的结构,第二个指针指向时间最小的结构,依此类推。
我怎么做? 我对指针仍然不太满意,所以我根本不知道该如何处理。 我试图看一下已经在这里发布的类似问题,但是指针完全使我感到困惑,而且我似乎无法使它们适用于我的代码。
例如,如果我有一个功能:
void sort(Hash A, celltype *PArray[MAX]){
}
其中*PArray[MAX]
是我的指针数组,而哈希A是存储结构的位置。 如何编写其余功能? 如何使指针指向结构?
如果您仍然被卡住,则需要做的概述是遍历哈希表(即遍历每个存储桶,然后遍历每个存储桶中列表的每个节点,以使指针数组指向您的每个条目)哈希表的键值无关紧要,您关心的只是使PArray
每个使用的指针都指向一个celltype
。
我想您知道如何迭代哈希表。 只需从0
到ht_size
循环(其中htsize
是哈希表中存储区的数量,例如数组元素)。 然后,您只需声明一个celltype *p
指针并迭代存储桶条目指向的列表(它可以是单个celltype*
,其中next
指针为NULL
,或者它可以是基于哈希冲突的任何数字,从而导致更多比一个单元格类型celltype*
解析到存储桶hashtable[x]
)
一旦填充了PArray
以使一些指针nptr
现在指向哈希表中的celltype*
,剩下的就是调用qsort
来按celltype->time
成员对指针进行排序。 唯一的技巧是必须编写compare函数来比较相邻的celltype->time
值。
qsort
比较函数具有原型:
int compare (const void *ap, const void *bp);
(其中a
和b
是指向要比较的相邻元素的指针 。我添加了p
只是为了将它们表示为指针)
我们要排序什么? 指向 celltype
的指针数组 。 因此,数组的每个成员已经是一个指针,并且如果每个参数都是指向您相邻元素的指针 ,则每个参数将代表一个指向 celltype
指针的指针 。
确定比较指针表示的内容后,只需取消引用参数的范围即可允许您访问每个结构中的time
成员。 当每个参数都是指向指针的指针时 ,可以将参数强制转换为type * const *
并取消引用以提供一个指向该类型的指针 ,可用于比较time
值,例如
/* qsort compare for array of pointers to celltype */
int compare (const void *ap, const void *bp)
{
celltype *a = *((celltype * const *)ap);
celltype *b = *((celltype * const *)bp);
return (a->time > b->time) - (a->time < b->time);
}
(对于任何数值类型,返回两个条件(a > b) - (a < b)
进行升序排序,只是避免了如果返回a - b
可能导致的潜在溢出,例如,其中a
可能很大负值, b
为大正值,导致溢出)
虽然没有显示A
的声明方式,但确实显示了Hash
的typedef
,当取消引用该类型定义时,将导致指向celltype
的指针。 使用ht_size
表示哈希表中的存储桶数, sort
函数将如下所示:
void sort(Hash A, celltype *PArray[MAX]){
size_t nptr = 0;
for (size_t i = 0; i < ht_size; i++) { /* loop over buckets */
celltype *p = A[i]; /* pointer to celltype */
while (p) { /* iterate over all chained nodes */
PArray[nptr++] = p; /* assigning pointer to PArray */
p = p->next
}
}
qsort (PArray, ntpr, sizeof *PArray, compare); /* call qsort */
}
简而言之就是这样。 如果在上面的部分示例中仍然难以解决qsort
概念的问题,则可以通过完整的简短示例消除混乱,例如
#include <stdio.h>
#include <stdlib.h>
typedef struct celltag{
char name[11];
double time;
struct celltag *next;
} celltype;
int compare (const void *ap, const void *bp)
{
celltype *a = *((celltype * const *)ap);
celltype *b = *((celltype * const *)bp);
return (a->time > b->time) - (a->time < b->time);
}
int main (void) {
celltype c1 = { .name = "three", .time = 127.21 },
c2 = { .name = "one", .time = 127.1 },
c3 = { .name = "two", .time = 127.19 },
*pc[] = { &c1, &c2, &c3 };
size_t n = sizeof pc / sizeof *pc;
qsort (pc, n, sizeof *pc, compare);
for (size_t i = 0; i < n; i++)
printf ("%-5s %6.2f\n", pc[i]->name, pc[i]->time);
}
使用/输出示例
$ ./bin/qsort_ptp_struct
one 127.10
two 127.19
three 127.21
仔细检查一下,如果您还有其他问题,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.