我正在排序/搜索結構陣列。
struct Substance
{
char name[NAME_SIZE]
int mass;
double halftime;
}
排序/搜索是在提示用戶選擇結構的哪個成員進行排序后完成的,即按名稱、質量或半場時間。
有沒有辦法制作一個可以處理所有三種資料型別的通用函式,或者我必須為每種型別撰寫不同的函式?
之所以不想寫幾個函式,是因為每個函式90%的代碼都是一樣的。
我特別掙扎于這樣一個事實,即我必須為每次迭代獲取我想要操作的成員,即substances[i].mass訪問質量,并且對于結構的每個成員,這種語法顯然必須不同。
我試圖做一些預處理來避免這個問題:
switch(choice)
{
case '1':
memcpy(current, substances[i].name, NAME_SIZE);
break;
case '2':
sprintf(current, "%d", substances[i].mass);
break;
case '3':
sprintf(current, "%lf", substances[i].halftime);
}
但是,如果我想排序,mass那么我還必須轉換mass結構陣列中的所有其他物質。
我還考慮過首先將每個成員表示為相同的資料型別,然后在需要時進行轉換,例如列印、寫入檔案等,但我不知道我會使用哪種資料型別。
一般用例是:
/*
Do you want to sort by (1) name, (2) mass or (3) halftime: 2
Sorted list by mass:
Name Mass Halftime
Zirconium 91 ...
Radon 220 ...
Radon 222 ...
Uranium 238 ...
*/
uj5u.com熱心網友回復:
是的qsort()。例子:
給定結構:
struct Substance
{
char name[NAME_SIZE]
int mass;
double halftime;
};
并假設定義了陣列substances[N];//has been populated,則呼叫示例可以是:
qsort(substances, N, sizeof (struct Substance), compareName);
qsort(substances, N, sizeof (struct Substance), compareMass);
qsort(substances, N, sizeof (struct Substance), compareHtime);
...與您的比較函式的形式被傳遞qsort()是:
int compareName(const void *a, const void *b)
{
const struct Substance *ia = a;
const struct Substance *ib = b;
return strcmp(ia->name, ib->name);//returns -1, 0 1 per strcmp rules
}
int compareMass(const void *a, const void *b)
{
const struct Substance *ia = a;
const struct Substance *ib = b;
return ia->mass == ib->mass ? 0 :
ia->mass > ib->mass ? 1 : -1;
}
int compareHtime(const void *a, const void *b)
{
const struct Substance *ia = a;
const struct Substance *ib = b;
return fabs(ia->halftime - ib->halftime) < 0.00001 ? 0 :
(ia->halftime - ib->halftime) > 1 ? 1 : -1;
}
“有沒有辦法制作一個可以處理所有三種資料型別的通用函式,或者我必須為每種型別撰寫不同的函式?”
您可以創建一個使用您的switch(), 并使用enum. 決定呼叫三個比較函式中的哪一個。例如:
enum {
NAME,
MASS,
HALF,
TYPE_MAX
};
void sort(struct Substance *s, size_t size, int type)
{
switch(type)
case NAME;
qsort(s, size, sizeof (struct Substance), compareName);
break;
case
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325832.html
