我試圖實作一個冒泡排序的指標陣列,從它們指向的最大值到最小值,基本上我必須在元素(第二個單元格)中間放置一個指向 NULL 的指標,當我嘗試對它們進行排序時,我希望將 NULL 指標放在單元格 (2) 的最后一個位置,而其他指標則按順序排列,除了這個放在最后一個位置的指標。但這給了我一個分段錯誤:
typedef struct example{
int data;
}exp;
exp *arr[3];
static void sort_arr(exp *[]);
int main(){
arr[0] = malloc(sizeof(*arr[0]));
arr[0]->data = 1;
arr[1] = NULL;
arr[2] = malloc(sizeof(*arr[2]));
arr[2]->data = 2;
sort_arr(arr);
return 0;
}
static void sort_arr(exp *pass_arr[]){
for (int i = 0; i < 3; i )
{
for (int j = i 1; j < 3; j)
{
if (pass_arr[i]->data < pass_arr[j]->data)
{
exp *temp = pass_arr[i];
pass_arr[i] = pass_arr[j];
pass_arr[j] = temp;
}
}
}
return;
}
uj5u.com熱心網友回復:
您需要檢查陣列元素是否為NULL,并將其視為低于其他值。
if (pass_arr[i] == NULL ||
(pass_arr[j] != NULL && pass_arr[i]->data < pass_arr[j]->data))
{
exp *temp = pass_arr[i];
pass_arr[i] = pass_arr[j];
pass_arr[j] = temp;
}
uj5u.com熱心網友回復:
使用指標感知的比較函式,例如
#define EQ 0
#define LT -1
#define GT 1
static int cmp( x *exp, y *exp )
{
if ( x == NULL && y == NULL ) return EQ ; // Two NULLs compare equal
if ( x == NULL && y != NULL ) return GT ; // NULL compares high with respect to non-NULL
if ( x != NULL && y == NULL ) return GT ; // NULL compares high with respect to non-NULL
// if we get here both X and Y are non-null,
// and so can safely be de-referenced
if ( x->data < y->data ) return LT ;
if ( x->data > y->data ) return GT ;
// must be equal
return EQ;
}
您在排序例程中的測驗將從
if ( pass_arr[i]->data < pass_arr[j]->data )
. . .
到
if ( cmp( pass_arr[i] , pass_arr[j] ) < 0 )
. . .
uj5u.com熱心網友回復:
例如,通過以下方式更改 if 陳述句就足夠了
if ( pass_arr[j] != NULL &&
( pass_arr[i] == NULL || pass_arr[i]->data < pass_arr[j]->data ) )
這比這個條件好
if (pass_arr[i] == NULL ||
(pass_arr[j] != NULL && pass_arr[i]->data < pass_arr[j]->data))
因為在最后一種情況下,可能存在兩個空指標的冗余交換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430745.html
上一篇:無法修改C 陣列中的字串
