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

Строка в порядке, это всего лишь указатель и будет заменен как есть. Поскольку вы _swapping_ два элемента в совокупности, не имеет значения, является ли это мелкой или глубокой копией. – paxdiablo

+0

Да, в основном это было бы хорошо. Просто будьте осторожны с любыми другими ссылками на струны, лежащие вокруг. Что-то вроде: 'char * s1 = w1.word; swapEm (& w1, &w2); strcpy (s1, «You w1»); «Ой, написано неверной строкой. По общему признанию, такого рода вещи вряд ли произойдут в сортировке Insertion, и действительно ли это делается ошибка зависит от намерения, лежащего в основе обмена. Прежде всего, будьте осторожны. – Anthony

Смежные вопросы