簡體   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