2013-05-01 85 views
4

我有一個工作的插入排序算法,用於排序存儲在數組中的整數。在另一個程序中,我創建了一個包含單詞和計數的結構體。我需要使用相同的插入排序按字母順序排列存儲在數組中的結構。我知道如何比較它們,但我找不到交換它們的方法。想法?如何實現用於插入排序算法的結構交換C

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

回答

6

您可以把struct S也是一樣的方式你換了整數:

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 2013-05-01 02:52:06

+0

字符串很好,它只是一個指針,並將按原樣交換。既然你正在總結這兩個項目,它不管它是淺的還是深的副本都沒有區別。 – paxdiablo 2013-05-01 02:52:43

+0

是的,它通常很好。只要小心任何其他提到的字符串躺在。類似於:'char * s1 = w1.word; swapEm(&w1,&w2); strcpy(s1,「You're w1」);'Oops,寫錯了字符串。不可否認,這種事情不太可能發生在插入排序中,而且這樣做是否實際上是錯誤取決於交換背後的意圖,只是要小心。 – Anthony 2013-05-01 03:04:59