#include #include "intlist.h" int member(intlist_t l, int val) { return isempty(l) ? 0 : val == head(l) || member(tail(l), val); } int member_it(intlist_t l, int val) { while (!isempty(l)) if (val == head(l)) return 1; else l = tail(l); } int sum_it(intlist_t l) { int sum = 0; while (!isempty(l)) { sum = sum + head(l); l = tail(l); } } int sum(intlist_t l) { return isempty(l) ? 0 : head(l) + sum(tail(l)); } int sum2(intlist_t l, int part) { return isempty(l) ? part : sum2(tail(l), part + head(l)); } intlist_t rev2(intlist_t l, intlist_t done) { if (isempty(l)) return done; int hd; intlist_t tl; split(l, &hd, &tl); return rev2(tl, cons(hd, done)); } intlist_t rev(intlist_t l) { return rev2(l, emptylist()); } void printlist(intlist_t l) { if (isempty(l)) printf(".\n"); else { printf("%d->", head(l)); printlist(tail(l)); } } void delete(intlist_t l) { if (!isempty(l)) { int hd; intlist_t tl; split(l, &hd, &tl); delete(tl); } } void iter(intlist_t l, void (*f)(int)) { if (!isempty(l)) { f(head(l)); iter(tail(l), f); } } void printel(int n) { printf("%d->", n); } void printlist2(intlist_t l) { iter(l, printel); } void printlist1(intlist_t l) { printlist2(l); printf(".\n"); } int main(void) { intlist_t l = cons(1, cons(2, cons(3, cons(4, emptylist())))); printlist1(l); printf("%d\n", sum(l)); intlist_t lr = rev(l); printlist1(lr); delete(lr); return 0; }