/** http://h...content-available-to-author-only...e.ru/questions/378459/c-%D0%BD%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F-%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h> /* malloc */
#define PRINT(M) do { \
fputs(#M " ", stdout); \
List_print(M); \
} while (0)
typedef char ListCargo;
typedef struct node {
ListCargo cargo;
struct node* next;
} *List;
static List
List_new(ListCargo cargo) {
List head
= malloc(sizeof *head
); if (!head) { /* fatal error for the example */
}
head->cargo = cargo;
head->next = NULL;
return head;
}
static void
List_print(List head) {
for ( ; head; head = head->next)
}
static List
List_insert_after(List head, ListCargo cargo) {
List node = List_new(cargo);
if (head) {
node->next = head->next;
head->next = node;
}
return node;
}
static List
List_copy0(List head) {
if (!head)
return NULL; /* empty list */
else {
List copy = List_insert_after(NULL, head->cargo), tail = copy;
for (head = head->next; head; head = head->next)
tail = List_insert_after(tail, head->cargo);
return copy;
}
}
static List
List_push_front(List head, ListCargo cargo) {
List node = List_new(cargo);
node->next = head;
return node;
}
static List
List_reverse_inplace(List head) {
List node, tail = NULL;
while (head) {
node = head;
head = head->next; /* pop head node */
node->next = tail; /* prepend it to tail */
tail = node;
}
return tail;
}
static List
List_copy(List head, List copy) {
return head ? List_copy(head->next, List_push_front(copy, head->cargo)) :
List_reverse_inplace(copy);
}
static List
List_from_string(const char *s) {
List head = NULL;
for ( ; *s; ++s)
head = List_push_front(head, *s);
return List_reverse_inplace(head);
}
int main(void) {
List M, M0, M1, M2;
M = List_from_string("abcde");
PRINT(M);
M0 = List_copy0(M);
PRINT(M);
PRINT(M0);
M1 = List_copy(M, NULL);
PRINT(M);
PRINT(M1);
M2 = List_reverse_inplace(M);
PRINT(M); /* *_inplace changes M */
PRINT(M1);
PRINT(M2);
return 0;
}
LyoqIGh0dHA6Ly9oLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLnJ1L3F1ZXN0aW9ucy8zNzg0NTkvYy0lRDAlQkQlRDAlQjUtJUQxJTgwJUQwJUIwJUQwJUIxJUQwJUJFJUQxJTgyJUQwJUIwJUQwJUI1JUQxJTgyLSVEMSU4NCVEMSU4MyVEMCVCRCVEMCVCQSVEMSU4NiVEMCVCOCVEMSU4Ri0lRDAlQkElRDAlQkUlRDAlQkYlRDAlQjglRDElODAlRDAlQkUlRDAlQjIlRDAlQjAlRDAlQkQlRDAlQjglRDElOEYtJUQxJTgxJUQwJUJGJUQwJUI4JUQxJTgxJUQwJUJBJUQwJUIwCiAqLwojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+IC8qIG1hbGxvYyAqLwoKI2RlZmluZSBQUklOVChNKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIGZwdXRzKCNNICIgIiwgc3Rkb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgTGlzdF9wcmludChNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB9IHdoaWxlICgwKQoKdHlwZWRlZiBjaGFyIExpc3RDYXJnbzsKdHlwZWRlZiBzdHJ1Y3Qgbm9kZSB7CiAgTGlzdENhcmdvIGNhcmdvOwogIHN0cnVjdCBub2RlKiBuZXh0Owp9ICpMaXN0OwoKc3RhdGljIExpc3QKTGlzdF9uZXcoTGlzdENhcmdvIGNhcmdvKSB7CiAgTGlzdCBoZWFkID0gbWFsbG9jKHNpemVvZiAqaGVhZCk7CiAgaWYgKCFoZWFkKSB7IC8qIGZhdGFsIGVycm9yIGZvciB0aGUgZXhhbXBsZSAqLwogICAgZnB1dHMoIm1hbGxvYyIsIHN0ZGVycik7CiAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgfQogIGhlYWQtPmNhcmdvID0gY2FyZ287CiAgaGVhZC0+bmV4dCA9IE5VTEw7CiAgcmV0dXJuIGhlYWQ7Cn0KCnN0YXRpYyB2b2lkCkxpc3RfcHJpbnQoTGlzdCBoZWFkKSB7CiAgZm9yICggOyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKICAgIHB1dGNoYXIoaGVhZC0+Y2FyZ28pOwogIHB1dGNoYXIoJ1xuJyk7Cn0KCnN0YXRpYyBMaXN0Ckxpc3RfaW5zZXJ0X2FmdGVyKExpc3QgaGVhZCwgTGlzdENhcmdvIGNhcmdvKSB7CiAgTGlzdCBub2RlID0gTGlzdF9uZXcoY2FyZ28pOwogIGlmIChoZWFkKSB7CiAgICBub2RlLT5uZXh0ID0gaGVhZC0+bmV4dDsKICAgIGhlYWQtPm5leHQgPSBub2RlOwogIH0KICByZXR1cm4gbm9kZTsKfQoKc3RhdGljIExpc3QKTGlzdF9jb3B5MChMaXN0IGhlYWQpIHsKICBpZiAoIWhlYWQpCiAgICByZXR1cm4gTlVMTDsgLyogZW1wdHkgbGlzdCAqLwogIGVsc2UgewogICAgTGlzdCBjb3B5ID0gTGlzdF9pbnNlcnRfYWZ0ZXIoTlVMTCwgaGVhZC0+Y2FyZ28pLCB0YWlsID0gY29weTsKICAgIGZvciAoaGVhZCA9IGhlYWQtPm5leHQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KQogICAgICB0YWlsID0gTGlzdF9pbnNlcnRfYWZ0ZXIodGFpbCwgaGVhZC0+Y2FyZ28pOwogICAgcmV0dXJuIGNvcHk7CiAgfQp9CgoKc3RhdGljIExpc3QKTGlzdF9wdXNoX2Zyb250KExpc3QgaGVhZCwgTGlzdENhcmdvIGNhcmdvKSB7CiAgTGlzdCBub2RlID0gTGlzdF9uZXcoY2FyZ28pOwogIG5vZGUtPm5leHQgPSBoZWFkOwogIHJldHVybiBub2RlOwp9CgpzdGF0aWMgTGlzdApMaXN0X3JldmVyc2VfaW5wbGFjZShMaXN0IGhlYWQpIHsKICBMaXN0IG5vZGUsIHRhaWwgPSBOVUxMOwogIHdoaWxlIChoZWFkKSB7CiAgICBub2RlID0gaGVhZDsKICAgIGhlYWQgPSBoZWFkLT5uZXh0OyAvKiBwb3AgaGVhZCBub2RlICovCiAgICBub2RlLT5uZXh0ID0gdGFpbDsgLyogcHJlcGVuZCBpdCB0byB0YWlsICovCiAgICB0YWlsID0gbm9kZTsKICB9CiAgcmV0dXJuIHRhaWw7Cn0KCnN0YXRpYyBMaXN0Ckxpc3RfY29weShMaXN0IGhlYWQsIExpc3QgY29weSkgewogIHJldHVybiBoZWFkID8gTGlzdF9jb3B5KGhlYWQtPm5leHQsIExpc3RfcHVzaF9mcm9udChjb3B5LCBoZWFkLT5jYXJnbykpIDoKICAgICAgICAgICAgICAgIExpc3RfcmV2ZXJzZV9pbnBsYWNlKGNvcHkpOwp9CgpzdGF0aWMgTGlzdApMaXN0X2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMpIHsKICBMaXN0IGhlYWQgPSBOVUxMOwogIGFzc2VydChzKTsKICBmb3IgKCA7ICpzOyArK3MpCiAgICBoZWFkID0gTGlzdF9wdXNoX2Zyb250KGhlYWQsICpzKTsKICByZXR1cm4gTGlzdF9yZXZlcnNlX2lucGxhY2UoaGVhZCk7Cn0KCmludCBtYWluKHZvaWQpIHsKICBMaXN0IE0sIE0wLCBNMSwgTTI7CiAgTSA9IExpc3RfZnJvbV9zdHJpbmcoImFiY2RlIik7CiAgUFJJTlQoTSk7CiAgTTAgPSBMaXN0X2NvcHkwKE0pOwogIFBSSU5UKE0pOwogIFBSSU5UKE0wKTsKICBNMSA9IExpc3RfY29weShNLCBOVUxMKTsKICBQUklOVChNKTsKICBQUklOVChNMSk7CiAgTTIgPSBMaXN0X3JldmVyc2VfaW5wbGFjZShNKTsKICBQUklOVChNKTsgLyogKl9pbnBsYWNlIGNoYW5nZXMgTSAqLwogIFBSSU5UKE0xKTsKICBQUklOVChNMik7CiAgcmV0dXJuIDA7Cn0=