Я пытаюсь получить пересечение и разницу двух наборов, каждый из которых представлен односвязным списком этой формы
struct node{
unsigned n;
struct node *next;
};
Я уже писал эти функции в предыдущих задачах, которые вычисляют количество элементов в списке и определяют, содержится ли определенный элемент в списке.
int cardinality(struct node *s){
struct node *tmp = s;
int count = 0;
while(tmp != NULL){
tmp = tmp->next;
count++;
}
return count;
}
int contains(struct node *s, int v){ /* returns 0 if in list, 1 if not in list */
struct node *tmp = s;
int contains = 1;
while(tmp->next != NULL){
if(tmp->n == v){
contains = 0;
break;
} else{
if(tmp == NULL) break;
tmp = tmp->next;
}
}
return contains;
}
Теперь мне нужно закодировать следующие функции, но я не знаю, как это сделать. Должен ли я перебирать один список и для каждого элемента в цикле списка проходить через второй список, чтобы проверить, содержится ли он / нет (разница) во втором? Это кажется сложным для этой задачи, должен быть более простой способ сделать это. Надеюсь, вы можете мне помочь
void intersection(struct node *s1, struct node *s2, struct node **result){
}
void difference(struct node *s1, struct node *s2, struct node **result){
}
assign
, поэтому, если кто-то хочет перезаписать список результатамиintersection
, это может бытьassign(&list, intersection(a, b))
. Функции в основном выполняют две задачи: вычисляют некоторые операции над множествами и разрушающее присваивание. - person Kaz   schedule 24.11.2013intersection
иdifference
, которая принимает дополнительный логический аргумент, указывающий, следует ли сохранить соответствующий элемент или отклонить. Тогдаintersection
иdifference
просто обертки. - person Kaz   schedule 24.11.2013