2012-02-12 4 views
0

int를 보유하는 구조체가 있습니다.포인터에 대한 포인터 배열 정렬

typedef struct n { 
    int cars; 
    struct n *next; 
} node; 

나는이 내가 연결리스트로 시작하기 때문입니다, 그리고 그것을 통해 이동 및 배열에 추가 노드를 같은 node *temp; 을합니다. 다음 배열 node **arr;

에 추가됩니다

은 그래서 포인터에 대한 포인터의 배열을 가지고있다. 내 질문은 : 어떻게 내가 이것에 qsort 할 수 있습니까? 지금까지 시도한 결과는 다음과 같습니다.

qsort(arr, numberCars, sizeof(node), sortCars); 

int sortCars(const void *i1, const void *i2){ 
    node *a = (node*)i1, *b = (node*)i2; 
    return (a->cars - b->cars); 
} 

qsort가 실제로 가리키고있는 것을 파악하는 데 어려움이 있습니다.

답변

1

, 당신의 기능과 비교해야한다 :

int sortCars(const void *i1, const void *i2) 

은 또한 당신이 더 간단이 기능을 수행 할 수 있습니다 포인터 :

int sortCars(const void *i1, const void *i2){ 
    node *a = *(node**)i1, *b = *(node**)i2; 
    return (a->cars - b->cars); 
} 

알스 o 인 경우 sizeof(node) 대신 sizeof(node*)을 전달해야합니다.

BTW, qsort 배열의 요소는 정렬하지만 효과는 next이 아니므로 링크 된 목록은 정렬되지 않은 상태로 유지됩니다.

0

노드에 next 포인터가있는 경우 링크 된 목록이 제안됩니다. 배열과 같지 않습니다. 인접한 메모리 블록에 모든 구조체를 할당하고 있습니까? 이것이 정렬 알고리즘이 첫 번째 인수로 필요로하는 것입니다.

typedef struct n { 
    int cars; 
} node; 

node arr[10]; // ten nodes as an array 

(일반 정렬 기능을 사용하면 정의 된 구조체에 next 포인터를 업데이트하는 알 것입니다 방법)을 arrnode **arr 경우

는 또한, 즉 포인터에 대한 포인터의 배열이 아니다. 그것은 포인터에 대한 포인터 또는 배열의 배열 (대략 동일한), 배열에 대한 포인터 또는 포인터의 배열입니다.

+0

나는 링크 된 목록으로 설정 한 다음 그 배열을 만들었습니다. – RichInDreams

0

비교기 기능은 INT 반환해야합니다 : 당신이 포인터의 배열을 가지고 있기 때문에

int sortCars(const void *i1, const void *i2){ 
    return ((*((node**) i1))->cars - (*((node**) i2))->cars); 
} 
관련 문제