2009-11-01 9 views
1

임의의 구조체 포인터의 배열과 비교 함수를 일반적인 정렬 알고리즘에 전달하려고합니다. C에서 가능합니까?C 함수에 임의의 struct 포인터 배열 전달?

구조체의 goooeys는 비교 함수 내에서만 액세스 할 수 있습니다. 정렬 함수는 비교 함수를 호출하고 포인터를 바꿔 줄 필요가 있지만이를 선언하는 방법을 알 수는 없습니다.

function sorter(struct arbitrary ** Array, int Length, int cmp(struct node * a, struct node * b)) 
{ 
    for (int i=0; i<Length;i++){ 
     if cmp(Array[i],Array[i+1]){ 
      swap(Array[i],Array[i+1] 
     } 
    } 
} 
+0

** 버퍼 오버플로주의 **. 당신의 코드에서, 루프를 마지막으로 통과 할 때,'i + 1'은 존재하지 않는 요소에 접근하려고 시도 할 것입니다. – pmg

답변

3

당신은 함수를 선언 할 수 있습니다.

+0

당신은 "당신이 * 포인터를 derefence 할 필요가 없다"는 뜻입니다, 그렇지 않습니까? 그러나 OP는 이미 그것을 알고있는 것 같습니다. – AnT

+0

고마워, 나는 그런 빈 포인터를 사용할 수 있는지 몰랐다. – ABentSpoon

+0

@AndreyT : StackOverflow에 늦었을 때 일어나는 일입니다. 혼란을 드려 죄송합니다. @ABentSpoon : 천만에요. –

0

아마도 무효 포인터를 전달해야합니까? 당신이 다음 비교 함수는 비교 어떤 구조체 형식에 대한 포인터에 비교되는 두 개의 포인터를 캐스팅해야합니다 비교 함수의 내부

void sorter(void** the_array, size_t array_length, int (*comparison_function)(void*, void*)); 

:로

function sorter(void ** Array, int Length, int cmp(void * a, void * b)) 
0

모든 포인터를 void*으로 변환 할 수 있기 때문에 항상 C에서 가능합니다. 그러나 임의의 구조체에 대한 포인터로 변환 할 수 있기를 원한다면, 일종의 타입 식별이 필요할 것이다.

형식에 특정한 함수를 사용하여 비교할 항목을 만들거나 형식을 구조로 인코딩 할 수 있습니다. 이것은 구조체에 여분의 필드가 있거나 형식 식별자를 취하도록 함수 cmp()을 변경하여 수행 할 수 있습니다.

하지만 C는 이미 일반적으로 합리적으로 효율적 qsort() 기능이 설정되어 있는지 알고 있어야한다 (이 사용하는 어떤 알고리즘을 규정하는 표준 아무것도 없다하더라도 - 그것은 사용 거품 정렬을 여전히 준수 할). 숙제를 위해 구현하지 않거나 다른 알고리즘을 염두에 둔다면, tou는 아마도 그것을 사용해야 할 것입니다.

귀하의 알고리즘은 버블 정렬의 내부 루프처럼 보이므로 실제로 올바르게 정렬되지 않습니다. 버블 정렬은 두 개의 중첩 된 루프로 구성되며 일반적으로 작은 데이터 세트 나 특정 특성이있는 유형 (예 : 대부분 정렬되어있는 경우)에만 적합합니다.

1

실제로이 함수는 이미 존재합니다 ... qsort이라고합니다. 일부 문서 here을 참조하십시오. 구현 (O (n^2))보다 훨씬 효율적입니다.

+0

사실, 그 구현은 O (n)입니다. 이것은 정렬 루틴에 꽤 좋을 것입니다. :-) – paxdiablo

+0

사실, 광산은 O (n)이지만 거의 정렬 된 배열 만 정렬합니다 :). 그러나 고마워. 나는 이것을 확실히 활용할 것입니다. – ABentSpoon

+0

거의 정렬 된 배열의 경우 일반적으로 libc에 mergesort()가 있습니다. 그것은 qsort보다 조금 더 많은 메모리를 소비한다는 것을 기억하십시오. – alecco