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