一種方法是使用qsort,這是標準庫中提供的一般排序算法用於排序用戶定義數據的序列。目標是做到以下幾點:
- 源數據必須保持未被觸摸。
- 的「排序」必須通過指針列表從上面
這是做一個方式提供給非接觸數據的訪問,使用qsort()
標準庫函數:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
struct test {
char x[101];
char y[101];
int z;
};
int cmp_test_ptrs(const void* arg1, const void* arg2)
{
struct test const * lhs = *(struct test const * const*)arg1;
struct test const * rhs = *(struct test const * const*)arg2;
return (lhs->z < rhs->z) ? -1 : (rhs->z < lhs->z);
}
int main()
{
srand((unsigned int)time(0));
// populate data array.
struct test * data = malloc(10 * sizeof(*data));
for (int i=0; i<10; ++i)
{
data[i].z = rand() % 20;
printf("%d ", data[i].z);
}
printf("\n");
// allocate a pointer array to use as a sort-bed, copying each
// structure address into this pointer array afterward
struct test **ptrs = malloc(10 * sizeof(*ptrs));
for (int i=0; i<10; ++i)
ptrs[i] = data+i;
// sort the pointer bed using our comparator
qsort(ptrs, 10, sizeof(*ptrs), cmp_test_ptrs);
// ptrs now has sorted pointers. Note the dereference for access
// to the actual data, which remains where it originally was.
for (int i=0; i<10; ++i)
printf("%d ", ptrs[i]->z);
printf("\n");
free(ptrs);
free(data);
return 0;
}
樣品輸出
11 7 6 17 8 8 11 4 7 5
4 5 6 7 7 8 8 11 11 17
要注意的是原始結構重新陣列保持不變。我們對指針序列進行了排序,而不是實際的結構本身,並使用了那些指針指向的作爲排序標準。
無論如何,我希望它有幫助。仔細研究比較器和qsort()
的設置。他們很重要。您可以閱讀有關qsort()
here的更多信息。
您提到的方式創建一個新的指針數組是最好的方法,也就是說,不需要對實際數據進行排序。 –
您也可以使用'qsort'來排序'data'。 –
是@FiddlingBits但我不知道該怎麼做 – user2976389