2017-10-11 4 views
-1

二つのGListオブジェクトの減算が必要です。私はCを使用してコードを必要想定C

G1及びG2は、次の文字(ないチャー**)を保持するのGListオブジェクトである

g1 = {"a", "b", "c"}; 

g2 = {"b", "d", "e"}; 

をリストの減算を返すglistライブラリ。

g3 = subtract (g1, g2); 
should return 
{"a", "c"); 

g4 = subtract (g2, g1); 
should return 
{"d", "e"); 
+0

これは宿題ですか? – Jurlie

+0

いいえ、それは家庭の仕事 –

+0

ではありません[口が達者 - 説明でGLIST例](https://developer.gnome.org/glib/stable/glib-Doubly-Linked-Lists.htmlは)あなたに有用である可能性があります。 –

答えて

1
void glist_deep_copy_g_func(gpointer data, gpointer user_data) { 
    GList** result = user_data; 
    if (data) { 
     *result = g_list_append(*result, strdup(data)); 
    } 
    user_data = result; 
} 

GList* glist_deep_copy(GList* source) { 
    GList* result = NULL; 
    g_list_foreach(source, &glist_deep_copy_g_func, &result); 
    return result; 
} 

gint glib_compare_char_ptr(gconstpointer a, gconstpointer b) { 
    return strcmp(a, b); 
} 

GList* glist_subtract(GList* from, GList* by) { 
    GList* result = NULL; 

    if (from && by) { 
     result = glist_deep_copy(from); 
     for (GList *node_from = g_list_first(from); node_from; node_from = 
       g_list_next(node_from)) { 
      for (GList *node_by = g_list_first(by); node_by; node_by = 
        g_list_next(node_by)) { 
       if (!strcmp(node_from->data, node_by->data)) { 
        GList* node = g_list_find_custom(result, node_from->data, 
          &glib_compare_char_ptr); 
        char* data = node->data; 
        result = g_list_remove(result, node->data); 
        free(data); 
       } 
      } 
     } 
    } else if (from) { 
     return glist_deep_copy(from); 
    } 

    return result; 
} 
1

あなたはstd::set_differenceの実施を検討し、glistのためにそれを適応させることができます。

のGLib自体の内部設定の違いのない実装ではありません。

+0

は、しかし、これは、C、C++ではないためです。 –

+0

私は、ない「コピー&ペースト」「を適応させる」と述べました。そのアイデアはそのコードで見ることができ、実装はプレーンなC言語とglist構造に書き直すことができます。 OPはただ心の中でCでイテレータを保つために持っ++アルゴリズムは、Cのリスト項目へのポインタと同じものです – Jurlie