2012-05-07 110 views
0

所以我想排序如下所示的指針數組。我遇到的問題是數組包含一個空元素。我必須解除引用除NULL以外的所有元素。其他方面,當然我得到一個錯誤,但這會導致我的排序在NULL出現後沒有正確排序任何元素。我可以爲NULL情況創建一個特定的異常,但無論如何要避免這種情況,並在0處理NULL,而我仍然取消引用其他所有內容?現在我告訴排序忽略NULL。這只是一個佔位符,因爲我一直無法找到解決我的問題的方法。泡泡排序指針陣列

#include <stdio.h> 
#include <stdlib.h> 

void arr(int ar[], int ele); 

int main(){ 
    int a=0, b=9, x=3, p=2, *ar[]={&a, &b, &x, NULL, &p}, i=0, ele=(sizeof(ar)/sizeof(ar[0])); 
    arr(ar, ele); 
    printf("\n\n"); 
    for(;i<ele;i++){ 
     if(ar[i]==NULL){ 
      printf(""); 
     }else{ 
    printf("%i", *ar[i]); 
     } 
    } 
} 

void arr(int *ar[], int ele){ 
    int i=ele-1, c=0; 
    for(;i>0; i--){ 
     for(;c<i; c++){ 
      if((ar[c]!=NULL && ar[c+1]!=NULL) && *ar[c]>*ar[c+1]){ 
       int t=*ar[c+1]; 
       *ar[c+1]=*ar[c]; 
       *ar[c]=t; 
      } 
     } 
    } 
} 
+1

只是刪除空,排序,然後把它放回你想要的任何位置。比試圖用簡單的算法處理null更簡單。 – goat

回答

2

更改此

if((ar[c]!=NULL && ar[c+1]!=NULL) && *ar[c]>*ar[c+1]){ 

//If the pointer is NULL, it will have a value of 0, so the conditional will be false. 
x = (ar[c]) ? *ar[c] : 0; 
y = (ar[c+1]) ? *ar[c+1] : 0; 
if(x > y){ 

加INT X,Y;到函數的頂部。

編輯:添加了解引用指針。大聲笑

+0

數組中的值是否都是正數(或非負數)?你正在處理NULL指針,就好像它們指向0一樣。但它至少是確定性的。 –

+0

好,所以我想一個例外。我改變了我們的代碼。 檢查ar [c]或ar [c + 1]是否不必在不是NULL的情況下取消引用ar [c]? – Painguy

+0

'x = ar [c]? ar [c]:0'與'x = ar [c]'相同。之後的線路也一樣。 –

1

你怎麼樣讓

Int *ptNull = new int; 
*ptNull = -100(the smallest); 

那你先找到數組中的NULL,並且將其設置爲ptNull。
然後你可以排序好像數組中沒有NULL。

1

NULL應該排序第一還是最後?決定。決定控制你比較代碼:

if (compare(ar[c], ar[c+1]) < 0) 
{ 
    int t=*ar[c+1]; 
    *ar[c+1]=*ar[c]; 
    *ar[c]=t; 
} 

其中:

static int compare(int const *v1, int const *v2) 
{ 
    if (v1 == NULL) 
     return -1; 
    if (v2 == NULL) 
     return +1; 
    if (*v1 < *v2) 
     return -1; 
    if (*v1 > *v2) 
     return +1; 
    return 0; 
} 

此之前的任何有效的價值排序NULL。


你有另外一個問題:

void arr(int ar[], int ele); 

VS

void arr(int *ar[], int ele){ 

這些都不是相同的簽名;你的代碼不應該被編譯。

1
for(;c<i; c++){ 
     int left = ar[c] != NULL ? ar[c] : 0; 
     int right = ar[c+1] != NULL ? ar[c+1] : 0; 

     if (left > right){ 
      /* swap the pointers, not what they point to! */ 
      int *t = ar[c+1]; 
      ar[c+1] = ar[c]; 
      ar[c] = t; 
     } 
    }