set_intersection 处理整数,但不处理字符,即使它是 void*

set_intersection working on integers, but not on chars, even though it's void*

我做了一套 ADT 实现,set_intersection 是其中的一个功能。

它在整数上运行良好,它通过了它应该通过的两个测试系统,但是当我试图在字符上使用它时它根本不起作用。即使它是在 void * 支持下制作的。

set_t *set_intersection(set_t *a, set_t *b) {

    set_t *inter = set_create(a->cmpfunc);

    set_iter_t *iterA = set_createiter(a);
    set_iter_t *iterB;

    void *itemA = set_next(iterA);
    void *itemB;

    while(itemA != NULL) {
        iterB = set_createiter(b);
        itemB = set_next(iterB);
        while (itemB != NULL) {
            if (itemA == itemB) {
                set_add(inter, itemA);
                break;
            }
            itemB = set_next(iterB);
        }
        set_destroyiter(iterB);
        itemA = set_next(iterA);
    }
    set_destroyiter(iterA);


    list_sort(inter->list);
    return inter;
}

使用这个结构:

struct set {
    list_t *list;
    cmpfunc_t cmpfunc;
    int size;
};

这就是尝试在 2 个字符集上进行交集时发生的情况:

处理整数:

set_t*tmp_x_等于tokenize(spam_item),使用tokenize函数。

/*
 * Returns the set of (unique) words found in the given file.
 */
static set_t *tokenize(char *filename)
{
    set_t *wordset = set_create(compare_words);
    list_t *wordlist = list_create(compare_words);
    list_iter_t *it;
    FILE *f;

    f = fopen(filename, "r");
    if (f == NULL) {
        perror("fopen");
        fatal_error("fopen() failed");
    }
    tokenize_file(f, wordlist);

    it = list_createiter(wordlist);
    while (list_hasnext(it)) {
        set_add(wordset, list_next(it));        
    }
    list_destroyiter(it);
    list_destroy(wordlist);
    return wordset;
}

我的 set_union 工作正常:

set_t *set_union(set_t *a, set_t *b) {

    set_t *unioner = set_create(a->cmpfunc);

    set_iter_t *iterA = set_createiter(a);
    set_iter_t *iterB = set_createiter(b);

    void *itemA = set_next(iterA);
    void *itemB = set_next(iterB);

    while(itemA != NULL) {
        set_add(unioner, itemA);
        itemA = set_next(iterA);
    }
    while(itemB != NULL) {
        set_add(unioner, itemB);
        itemB = set_next(iterB);
    }

    list_sort(unioner->list);
    return unioner;
}

你不是想做一组字符。您正在尝试制作一组​​完全不同的字符串。在 C 中,字符串是指向以 0 结尾的字符序列中第一个字符的指针,这是一种复杂的说法,在 C 中,字符串是指针。两个指针相等当且仅当它们指向相同的地址;指向不同地址的两个指针碰巧指向相同的值仍然是不同的指针。

请注意,您的集合有一个 cmpfunc 元素。我假设您也将此数据结构作为作业的一部分,并且在某处解释了为什么您可能需要一个执行比较的函数。确实如此,因为您不能像比较整数那样比较字符串。