2013-05-01 2 views
4

J'ai un algorithme de tri d'insertion qui trie les entiers stockés dans un tableau. Dans un programme différent, j'ai créé une structure avec des mots et un compte. J'ai besoin de trier les structures stockées dans un tableau par ordre alphabétique en utilisant le même type d'insertion. Je comprends comment les comparer, mais je ne peux pas trouver un moyen de les échanger. Des idées?Comment implémenter l'échange de structures pour l'algorithme de tri d'insertion dans C

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

Répondre

6

Vous pouvez échanger struct de la même manière que vous permutez des entiers:

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

Demo on ideone.

2

Comment les échanger? Il suffit d'utiliser une structure temporaire:

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

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

Voir le programme complet ci-dessous pour un exemple:

#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; 
} 

La sortie de c'est:

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

Soyez prudent avec cette chaîne. – Anthony

+0

La chaîne est bonne, c'est juste un pointeur et sera permutée telle quelle. Puisque vous écartez les deux éléments en entier, cela ne fait aucune différence que ce soit une copie superficielle ou profonde. – paxdiablo

+0

Oui, ça irait plutôt bien. Faites attention à toute autre référence aux cordes qui traînent. Quelque chose comme: 'char * s1 = w1.word; swapEm (& w1, &w2); strcpy (s1, "Vous êtes w1"); 'Oups, a écrit sur la mauvaise chaîne.Certes, il est peu probable que ce genre de chose se produise dans une sorte d'insertion, et si oui ou non cela est réellement l'erreur dépend de l'intention derrière le swap en premier lieu. – Anthony

Questions connexes