2012-05-07 4 views
0

그래서 아래에서 볼 수 있듯이 포인터 배열을 정렬하려고합니다. 문제는 배열에 하나의 null 요소가 있다는 것입니다. NULL을 제외한 모든 요소를 ​​역 참조해야합니다. 물론 오류가 발생합니다. 그러나 이로 인해 내 정렬에서 NULL이 나타난 후에 요소를 올바르게 정렬하지 못하게됩니다. NULL 예외에 대한 특정 예외를 만들 수 있지만,이 문제를 피하기 위해 어쨌든 존재합니까? 지금은 NULL을 무시하는 정렬 말해. 내 문제에 대한 해결책을 찾을 수 없었기 때문에 이것은 단지 장소 소유자 일뿐입니다. 당신이버블 정렬 포인터 배열

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

하자에 대해 다음 먼저 배열이 NULL을 찾아 ptNull 수를 설정하는 방법

#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을 제거하고 정렬 한 다음 원하는 위치에 다시 놓습니다. 달리 간단한 알고리즘을 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; 함수의 맨 위에.

편집 : dereferencing 포인터가 추가되었습니다. lol

+0

배열의 값은 모두 양수 (또는 음수)입니까? 그들이 0을 가리키는 것처럼 당신은 NULL 포인터를 다루고 있습니다. 그것은 적어도 결정적입니다. –

+0

그래, 내가 추측 할 수있는 예외를 만들자. 나는 ur 코드를 변경했다. ar [c] 또는 ar [c + 1]을 검사하면 NULL이 아닌 경우 ar [c]를 참조 해제 할 필요가 없습니까? – Painguy

+0

'x = ar [c]? ar [c] : 0'은'x = ar [c]'와 같습니다. 그 이후의 라인과 동일합니다. –

1

.
그리고 배열에 NULL이없는 것처럼 정렬 할 수 있습니다.

1

NULL을 처음 또는 마지막으로 정렬해야합니까? 결정.

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 정렬 :

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

: 결정은 당신의 비교 코드를 제어합니다.


당신은 또 다른 문제가 있습니다

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

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; 
     } 
    }