需要在c中减去两个glist对象

时间:2017-10-11 02:11:50

标签: c glib

假设:

g1和g2是一个glist对象,它包含以下字符(不是char **)

proc transpose data=temp out=want;
by date;
id group;
var value;
run;

我需要一个使用c glist库的代码,它返回列表的减法;

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

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

2 个答案:

答案 0 :(得分:1)

您可以查看std::set_difference的实施情况,并将其修改为glist

GLib本身没有实现设置差异。

答案 1 :(得分: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;
}