【问题标题】:How to implement swapping of structs for the insertion sorting algorithm in C如何在 C 中实现插入排序算法的结构交换
【发布时间】:2013-04-25 02:11:28
【问题描述】:

我有一个有效的插入排序算法,可以对存储在数组中的整数进行排序。在另一个程序中,我创建了一个带有单词和计数的结构。我需要使用相同的插入排序按字母顺序对存储在数组中的结构进行排序。我知道如何比较它们,但是我找不到交换它们的方法。想法?

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

【问题讨论】:

    标签: c struct insertion-sort


    【解决方案1】:

    如何交换它们?只需使用临时结构:

    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.]
    

    【讨论】:

    • 小心那个字符串。
    • 字符串很好,它只是一个指针,将按原样交换。由于您要交换这两个项目,因此无论是浅拷贝还是深拷贝都没有区别。
    • 是的,基本上没问题。请注意对周围字符串的任何其他引用。类似于:char *s1 = w1.word; swapEm(&amp;w1, &amp;w2); strcpy(s1, "You're w1"); 糟糕,写入了错误的字符串。诚然,这种事情不太可能在插入排序中发生,这样做是否实际上是错误首先取决于交换背后的意图。小心点。
    【解决方案2】:

    您可以像交换整数一样交换structs:

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

    Demo on ideone.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多