Non- Destructive:
ilist double_copy(ilist x) {
if (x==NULL) return NULL;
ilist head = malloc(sizeof(struct ilist_node));
head ->first = x->first * 2;
head ->rest = NULL;
ilist prev = head;
for (ilist a = x->rest; a != NULL; a = a->rest) {
ilist tmp = malloc(sizeof(struct ilist_node));
tmp->first = a->first * 2;
tmp->rest = NULL;
prev ->rest = tmp;
prev = tmp;
}
return head;
}
Destructive:
ilist double_destructive(ilist x) {
for (ilist a = x; a != NULL; a = a->rest) {
a->first = a->first * 2;
}
return x;
}
Tm9uLSBEZXN0cnVjdGl2ZToKaWxpc3QgZG91YmxlX2NvcHkoaWxpc3QgeCkgewppZiAoeD09TlVMTCkgcmV0dXJuIE5VTEw7CmlsaXN0IGhlYWQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbGlzdF9ub2RlKSk7CmhlYWQgLT5maXJzdCA9IHgtPmZpcnN0ICogMjsKaGVhZCAtPnJlc3QgPSBOVUxMOwppbGlzdCBwcmV2ID0gaGVhZDsKZm9yIChpbGlzdCBhID0geC0+cmVzdDsgYSAhPSBOVUxMOyBhID0gYS0+cmVzdCkgewppbGlzdCB0bXAgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbGlzdF9ub2RlKSk7CnRtcC0+Zmlyc3QgPSBhLT5maXJzdCAqIDI7CnRtcC0+cmVzdCA9IE5VTEw7CnByZXYgLT5yZXN0ID0gdG1wOwpwcmV2ID0gdG1wOwp9CnJldHVybiBoZWFkOwp9CgoKCkRlc3RydWN0aXZlOgppbGlzdCBkb3VibGVfZGVzdHJ1Y3RpdmUoaWxpc3QgeCkgewpmb3IgKGlsaXN0IGEgPSB4OyBhICE9IE5VTEw7IGEgPSBhLT5yZXN0KSB7CmEtPmZpcnN0ID0gYS0+Zmlyc3QgKiAyOwp9CnJldHVybiB4Owp9