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