2014-05-07 40 views
0

我正在編輯一個快速排序代碼,以便低位,高位和中間值指向數組元素而不是整數。賦值使指針沒有轉換

這是我的代碼:

#include <stdio.h> 

#define N 10 

void quicksort(int a[], int *low, int *high); 
int split(int a[], int *low, int *high); 

int main(void) 
{ 
    int a[N], i; 
    printf("Enter %d numbers to be sorted: ", N); 
    for (i=0; i<N; i++) 
     scanf("%d", &a[i]); 
    quicksort(a, &a[0], &a[N-1]); 

    printf("In sorted order: "); 
    for (i=0; i<N; i++) 
     printf("%d ", a[i]); 
    printf("\n"); 

    return 0; 
} 

void quicksort(int a[], int *low, int *high) 
{ 
    int *middle; 

    if (low >= high) return; 
    middle = split(a, low, high); 
    quicksort(a, low, middle - 1); 
    quicksort(a, middle + 1, high); 
} 

int split(int a[], int *low, int *high) 
{ 
    int part_element = *low; 

    for (;;) { 
     while (low < high && part_element <= *high) 
      high--; 
     if (low >= high) break; 
     *low++ = *high; 

     while (low < high && *low <= part_element) 
      low++; 
     if (low >= high) break; 
     *high-- = *low; 
    } 

    *high = part_element; 
    return *high; 
} 

我收到錯誤消息:

qs.c:32:12: warning: assignment makes pointer from integer without a cast [enabled by default] 
middle = split(a, low, high); 
     ^

有人可以幫助我?仍然是編程初學者。所有類型的幫助表示讚賞。

+1

'middle'是指針; 'split()'返回一個整數。你期望發生什麼? – user3553031

+1

'split'返回一個int。 'middle'是一個指針。也許只是返回'high'而不是'* high'? – ooga

+1

'split()'返回一個'int'。 'middle'是一個'int *',所以警告說「你正在給一個指針分配一個int,這可能不是你想要做的事情」。 – John3136

回答

1

問題在於此聲明。

middle = split(a, low, high); 

因爲middle是一個指針變量而split是返回整數值不是指針爲整數的函數。

您正將整數值分配給指針變量middle。 你不能這樣做。 :)

可能這會幫助你。

+0

函數split應該返回一個指向一個整數的指針,而不是一個整數。 int * split(int a [],int * low,int * high); – Jiminion

+0

感謝您的幫助!得到了答案。 – user3610293

0

更改'split()'返回'int *'而不是'int'。

更改的最後一行 '分裂()' 從功能:

return *high; 

return high; 

也許這將更好地工作:

#include <stdio.h> 

#define N 10 

void quicksort(int a[], int *low, int *high); 
int *split(int a[], int *low, int *high); 

int main(void) 
{ 
    int a[N], i; 
    printf("Enter %d numbers to be sorted: ", N); 
    for (i=0; i<N; i++) 
     scanf("%d", &a[i]); 
    quicksort(a, &a[0], &a[N-1]); 

    printf("In sorted order: "); 
    for (i=0; i<N; i++) 
     printf("%d ", a[i]); 
    printf("\n"); 

    return 0; 
} 

void quicksort(int a[], int *low, int *high) 
{ 
    int *middle; 

    if (low >= high) return; 
    middle = split(a, low, high); 
    quicksort(a, low, middle - 1); 
    quicksort(a, middle + 1, high); 
} 

int *split(int a[], int *low, int *high) 
{ 
    int part_element = *low; 

    for (;;) { 
     while (low < high && part_element <= *high) 
      high--; 
     if (low >= high) break; 
     *low++ = *high; 

     while (low < high && *low <= part_element) 
      low++; 
     if (low >= high) break; 
     *high-- = *low; 
    } 

    *high = part_element; 
    return high; 
} 
+0

謝謝!我忘了把'int split'改成'int * split'。 – user3610293