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
元素。我假设您也将此数据结构作为作业的一部分,并且在某处解释了为什么您可能需要一个执行比较的函数。确实如此,因为您不能像比较整数那样比较字符串。
我做了一套 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
元素。我假设您也将此数据结构作为作业的一部分,并且在某处解释了为什么您可能需要一个执行比较的函数。确实如此,因为您不能像比较整数那样比较字符串。