2013-02-17 4 views
0

이름과 나이가 들어있는 entry라는 간단한 구조가 있습니다. 이러한 구조체 배열을 감안할 때 나이를 기준으로 배열을 정렬하고 싶습니다.구조와 함수에 대한 포인터

다음은 이것을 적용하려는 나의 시도입니다. 지금은 이것을 컴파일 할 수 없습니다. 내 포인터 논리를 if 문 비교 및 ​​포인터의 후속 스왑 잘못된 것 같아요. 나는 똑같은 일을하는 다양한 방법을 시도했지만 아무데도 못 가고있다. 나는 C에서 꽤 새로운데, 나는 여전히 포인터 주위에서 머리를 쓰려고 노력하고있다. 그래서 그것은 내가 오해하고있는 기본적인 것이 될 것이다. 아무도 내가 아래에서 잘못하고있는 것을 설명 할 수 있습니까?

도움을 주시면 감사하겠습니다.

#include <stdio.h> 

struct entry { 
    char name[15]; 
    int age; 
}; 

void entrySort(struct entry *dict); 

void entrySort(struct entry *dict){ 
    int i,j; // counters 
    int ct = 4; 
    struct entry *tmp; // temporary holder 

    for(i = 0; i < ct; i++){ 
     for(j = 0; j < ct; j++){ 
      if ((*dict[i].age) > (*dict[j].age)){ 
      tmp = (dict + i); 
      (dict+i) = (dict+j); 
      (dict+j) = tmp; 

     } 
    } 
} 

int main (void){ 
    int ct = 4, i; 
    struct entry reg[4] = 
     {{ "John", 24 }, 
     { "Alan", 18 }, 
     { "Jim", 40 }, 
     { "Sarah",32 }}; 

    entrySort(reg); 

    for(i = 0; i < ct; i++) 
     printf("name: %s. Age: %d\n", reg[i].name, reg[i].age); 

    return 0; 
} 
+0

당신이'qsort'를 사용할 수 있습니까? 그것은 훨씬 쉬울 것입니다. – nneonneo

+0

주요 목표는 그 자체로 정렬이 아니 었습니다. 포인터를 올바르게 사용하는 방법을 찾는 것이 더 많았습니다. – user1895961

답변

2

당신은 포인터로 struct entry 객체의 배열 전달합니다 struct entry *dict를하지만 struct entry 객체에 대한 포인터의 배열을 것입니다 당신이 그것을 치료됩니다 (*dict[i]).age.

(dict+i)은 여전히 ​​i+1 인 메모리를 가리키는 포인터입니다. 요소가 저장됩니다 (예 : &dict[i]). 인덱스 i에서이 요소에 실제로 액세스하려면 dereference operator : *(dict + i), 즉 dict[i]과 같아야합니다.

또한 ij에있는 요소 교환이 잘못되었습니다.

struct entry tmp; 

for(i = 0; i < ct; i++) { 
    for(j = 0; j < ct; j++) { 
     if ((dict[i].age) > (dict[j].age)) { 
      tmp = dict[i]; 
      dict[i] = dict[j]; 
      dict[j] = tmp; 
     } 
    } 
} 

을 당신이 가지고있는 코드에서 그런데 : "임시 홀더는"tmpstruct entry tmp;로 선언함으로써, 당신은 다시가는 것을 일시적으로 데이터를 메모리에 그냥 포인터를 개최한다 객체이어야한다 게시 됨, if의 끝 중괄호 (})가 누락되었습니다.

시도
1

: 완성도를 들어

#include <stdio.h> 

struct entry { 
    char name[15]; 
    int age; 
}; 

void entrySort(struct entry *dict, int); 

void entrySort(struct entry *dict, int ct){ 
    int i,j; // counters 
    /* int ct = 4; */ 
    struct entry tmp; // temporary holder 

    for(i = 0; i < ct; i++){ 
     for(j = 0; j < ct; j++){ 
      if ((dict[i].age) > (dict[j].age)){ /* no * */ 
      tmp = *(dict + i); 
      *(dict+i) = *(dict+j); 
      *(dict+j) = tmp; 

     } 
    } 
} 

int main (void){ 
    int ct = 4, i; 
    struct entry reg[4] = 
     {{ "John", 24 }, 
     { "Alan", 18 }, 
     { "Jim", 40 }, 
     { "Sarah",32 }}; 

    entrySort(reg, ct); 

    for(i = 0; i < ct; i++) 
     printf("name: %s. Age: %d\n", reg[i].name, reg[i].age); 

    return 0; 
} 
1

, 여기 당신이 qsort 함께 할 것입니다 방법은 다음과 같습니다

#include <stdlib.h> 
int sort_entry(const void *va, const void *vb) { 
    const struct entry *a = va; 
    const struct entry *b = vb; 
    if(a->age < b->age) return -1; 
    else if(a->age == b->age) return 0; 
    return 1; 
} 

... 

qsort(reg, ct, sizeof(struct entry), sort_entry); 
관련 문제