2013-05-01 2 views
4

배열에 저장된 정수를 정렬하는 작동 삽입 정렬 알고리즘이 있습니다. 다른 프로그램에서는 단어와 개수가있는 구조체를 만들었습니다. 구조체를 동일한 삽입 정렬을 사용하여 사전 순으로 배열에 저장해야합니다. 나는 그 (것)들을 비교하는 방법을 이해한다, 그러나 나는 그 (것)들을 교환하는 방법을 찾아 낼 수 없다. 아이디어?C의 삽입 정렬 알고리즘에 대한 구조체 스왑 구현 방법

typedef struct { char * word; int count; } wordType; 

답변

6

당신은 struct의 동일한 방식으로 교체 할 수 있습니다 그냥 임시 구조를 사용 정수를 바꾸는 것 :

wordType tmp; 
wordType a = {.word="hello", .count=5}; 
wordType b = {.word="world", .count=11}; 
tmp = a; 
a = b; 
b = tmp; 

Demo on ideone.

2

어떻게 교환합니까? 예는 다음과 같은 완벽한 프로그램을 참조하십시오

void swapEm (wordType *w1, wordType *w2) { 
    wordType wx; 

    memcpy (&wx, w1, sizeof(wx)); 
    memcpy (w1, w2, sizeof(wx)); 
    memcpy (w2, &wx, sizeof(wx)); 
} 

:

#include <stdio.h> 
#include <string.h> 

typedef struct { char * word; int count; } wordType; 

void swapEm (wordType *w1, wordType *w2) { 
    wordType wx; 

    memcpy (&wx, w1, sizeof(wx)); 
    memcpy (w1, w2, sizeof(wx)); 
    memcpy (w2, &wx, sizeof(wx)); 
} 

void printOne (char *s, wordType *w) { 
    printf ("%s: %d [%s]\n", s, w->count, w->word); 
} 

int main(void) { 
    wordType w1, w2; 
    w1.word = strdup ("from Pax."); w1.count = 314159; 
    w2.word = strdup ("Hello");  w2.count = 271828; 

    printOne ("w1", &w1); printOne ("w2", &w2); 
    swapEm (&w1, &w2); 
    puts ("==="); 
    printOne ("w1", &w1); printOne ("w2", &w2); 

    free (w1.word); free (w2.word); 

    return 0; 
} 

그 출력은 다음과 같습니다

w1: 314159 [from Pax.] 
w2: 271828 [Hello] 
=== 
w1: 271828 [Hello] 
w2: 314159 [from Pax.] 
+0

해당 문자열에만주의하십시오. – Anthony

+0

문자열은 괜찮습니다. 포인터 일 뿐이므로 그대로 교체됩니다. 전체 항목의 두 항목을 바꿔 쓰고 있기 때문에 얕은 부분이든 깊은 부분이든 차이가 없습니다. – paxdiablo

+0

그래, 대부분 괜찮을거야. 주위에있는 문자열에 대한 다른 참조를주의하십시오. 뭔가 :'char * s1 = w1.word; 틀림없이, 이런 종류의 일은 삽입 (Insertion) 정렬에서 일어나지 않을 것입니다. 그리고 실제로이 작업을 수행할지 여부는 실제로는 불가능합니다 (예 : w1, &w2); strcpy (s1, "w1")); 오류는 처음에는 스왑 뒤에있는 의도에 따라 다릅니다. – Anthony