Date due liste devo restituire una terza lista formata da valori che sono presenti nella prima lista e non nella seconda. Quindi devo fare l1 - l2.
Questa è il programma:
#define _CRT_SECURE_NO_WARNINGS
#include<stdbool.h>
#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>
typedef int element;
typedef struct list_element{
element value;
struct list_element *next;
}item;
typedef item* list;
//firme
list emptylist();
list cons(element e, list l);
bool empty(list l);
element head(list l);
list tail(list l);
element getElement();
element copy(element e);
void printElement(element);
void dealloc(list l);
void showlist(list l);
bool contain(list l, element e);
list intersect(list l1, list l2);
list difference(list l1, list l2);
//primitive
list emptylist() {
return NULL;
}
list cons(element e, list l) {
list t;
t = (list)malloc(sizeof(item));
t->value = copy(e);
t->next = l;
return t;
}
bool empty(list l) {
return (l == NULL);
}
element head(list l) {
if (empty(l))
abort();
else
return l->value;
}
list tail(list l) {
if (empty(l))
abort();
else
return l->next;
}
element getElement(){
element el;
scanf("%d", &el);
return el;
}
element copy(element e){
element el;
el = e;
return el;
}
void printElement(element el){
printf("%d", el);
}
// DEALLOCAZIONE
void dealloc(list l){
list temp;
while (!empty(l)) {
temp = l;
l = tail(l);
free(temp);
}
}
// Non primitive
void showlist(list l) {
printf("[");
while (!empty(l)) {
printElement(head(l));
l = tail(l);
if (!empty(l))
printf(", ");
}
printf("]\n");
}
list difference(list l1, list l2)
{
list l3 = emptylist();
while (!empty(l1))
{
element el = head(l1);
list tmp = l2;
bool find = false;
while (!empty(tmp))
{
if (el == head(tmp)) {
find = true;
break;
}
tmp = tail(tmp);
}
if (!find)
{
l3 = cons(el, l3);
}
l1 = tail(l1);
}
return l3;
}
int main(){
list l1 = emptylist();
list l2 = emptylist();
list l3 = emptylist();
element el;
do{
printf("inserisco elementi lista l1:\t");
el = getElement();
if (el != 0){
l1 = cons(el, l1);
}
} while (el != 0);
showlist(l1);
do{
printf("inserisco elementi lista l2:\t");
el = getElement();
if (el != 0){
l2 = cons(el, l2);
}
} while (el != 0);
showlist(l2);
l3 = difference(l1, l2);
printf("\nElementi lista l3:");
showlist(l3);
dealloc(l1);
dealloc(l2);
dealloc(l3);
}
Ho solo un dubbio nell'interpretazione della funzione difference:
list difference(list l1, list l2)
{
list l3 = emptylist();
while (!empty(l1))
{
element el = head(l1);
list tmp = l2;
bool find = false;
while (!empty(tmp))
{
if (el == head(tmp)) {
find = true;
break;
}
tmp = tail(tmp);
}
if (!find)
{
l3 = cons(el, l3);
}
l1 = tail(l1);
}
return l3;
}
In teoria viene preso l'elemento della prima lista, e si scorre la seconda lista. con il debug non capisco perchè questo
if (!find)
{
l3 = cons(el, l3);
}
viene eseguito quando find è false, e non quando è true. In teoria essendo bool find inizialmente false, l' if si dovrebbe eseguire quando è il suo opposto, quindi quando è true, perchè invece viene fatto il contrario?