繁体   English   中英

指向结构的指针数组

[英]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

我想您知道如何迭代哈希表。 只需从0ht_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);

(其中ab指向要比较的相邻元素的指针 。我添加了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的声明方式,但确实显示了Hashtypedef ,当取消引用该类型定义时,将导致指向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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM