#include <stdio.h>
#include <stdlib.h>
typedef struct List List;
typedef struct Node Node;
struct List {
int size;
Node* head;
};
struct Node {
int value;
Node* next;
Node* prev;
};
List* newList() {
List
* list
= malloc(sizeof(List
));
if (list == NULL) {
return NULL;
}
list->size = 0;
list->head = NULL;
return list;
}
void insertAsHead(List* list, int v) {
if (list == NULL) {
return;
}
Node
* node
= malloc(sizeof(Node
));
if (node == NULL) {
return;
}
node->value = v;
if (list->head == NULL) {
list->head = node;
node->next = node;
node->prev = node;
} else {
Node* head = list->head;
Node* tail = head->prev;
node->next = head;
node->prev = tail;
head->prev = node;
tail->next = node;
list->head = node;
}
list->size++;
}
char* containsValue(List* list, int v) {
if (list == NULL) {
return "no";
}
Node* head = list->head;
if (head == NULL) {
return "no";
}
Node* tail = head->prev;
do {
if (head->value == v) {
return "yes";
}
head = head->next;
} while (head != tail->next);
return "no";
}
void printListForward(List* list) {
if (list == NULL) {
return;
}
Node* head = list->head;
if (head != NULL) {
printf("List { %d ", head
->value
);
Node* tail = head->prev;
while (head != tail) {
head = head->next;
printf("-> %d ", head
->value
); }
} else {
}
}
int main() {
List* list = newList();
insertAsHead(list, 5);
insertAsHead(list, 6);
insertAsHead(list, 7);
printListForward(list);
puts(containsValue
(list
, 5)); puts(containsValue
(list
, 6)); puts(containsValue
(list
, 7)); puts(containsValue
(list
, 8));
printListForward(list);
insertAsHead(list, 8);
printListForward(list);
puts(containsValue
(list
, 5)); puts(containsValue
(list
, 6)); puts(containsValue
(list
, 7)); puts(containsValue
(list
, 8));
printListForward(list);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IExpc3QgTGlzdDsKdHlwZWRlZiBzdHJ1Y3QgTm9kZSBOb2RlOwoKc3RydWN0IExpc3QgewoJaW50IHNpemU7CglOb2RlKiBoZWFkOwp9OwoKc3RydWN0IE5vZGUgewoJaW50IHZhbHVlOwoJTm9kZSogbmV4dDsKCU5vZGUqIHByZXY7Cn07CgpMaXN0KiBuZXdMaXN0KCkgewoJTGlzdCogbGlzdCA9ICBtYWxsb2Moc2l6ZW9mKExpc3QpKTsKCglpZiAobGlzdCA9PSBOVUxMKSB7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbGlzdC0+c2l6ZSA9IDA7CglsaXN0LT5oZWFkID0gTlVMTDsKCglyZXR1cm4gbGlzdDsKfQoKdm9pZCBpbnNlcnRBc0hlYWQoTGlzdCogbGlzdCwgaW50IHYpIHsJCglpZiAobGlzdCA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQkKCglOb2RlKiBub2RlID0gbWFsbG9jKHNpemVvZihOb2RlKSk7CgoJaWYgKG5vZGUgPT0gTlVMTCkgewoJCXJldHVybjsKCX0KCglub2RlLT52YWx1ZSA9IHY7CgoJaWYgKGxpc3QtPmhlYWQgPT0gTlVMTCkgewoJCWxpc3QtPmhlYWQgPSBub2RlOwoJCW5vZGUtPm5leHQgPSBub2RlOwoJCW5vZGUtPnByZXYgPSBub2RlOwoJfSBlbHNlIHsKCQlOb2RlKiBoZWFkID0gbGlzdC0+aGVhZDsKCQlOb2RlKiB0YWlsID0gaGVhZC0+cHJldjsKCgkJbm9kZS0+bmV4dCA9IGhlYWQ7CgkJbm9kZS0+cHJldiA9IHRhaWw7CgoJCWhlYWQtPnByZXYgPSBub2RlOwoJCXRhaWwtPm5leHQgPSBub2RlOwoKCQlsaXN0LT5oZWFkID0gbm9kZTsKCX0KCglsaXN0LT5zaXplKys7Cn0KCmNoYXIqIGNvbnRhaW5zVmFsdWUoTGlzdCogbGlzdCwgaW50IHYpIHsJCglpZiAobGlzdCA9PSBOVUxMKSB7CgkJcmV0dXJuICJubyI7Cgl9CQoKCU5vZGUqIGhlYWQgPSBsaXN0LT5oZWFkOwoKCWlmIChoZWFkID09IE5VTEwpIHsKCQlyZXR1cm4gIm5vIjsKCX0KCglOb2RlKiB0YWlsID0gaGVhZC0+cHJldjsKCglkbyB7CgkJaWYgKGhlYWQtPnZhbHVlID09IHYpIHsKCQkJcmV0dXJuICJ5ZXMiOwoJCX0KCgkJaGVhZCA9IGhlYWQtPm5leHQ7Cgl9IHdoaWxlIChoZWFkICE9IHRhaWwtPm5leHQpOwoKCXJldHVybiAibm8iOwp9Cgp2b2lkIHByaW50TGlzdEZvcndhcmQoTGlzdCogbGlzdCkgewoJaWYgKGxpc3QgPT0gTlVMTCkgewoJCXJldHVybjsKCX0JCgoJTm9kZSogaGVhZCA9IGxpc3QtPmhlYWQ7CgoJaWYgKGhlYWQgIT0gTlVMTCkgewoJCXByaW50ZigiTGlzdCB7ICVkICIsIGhlYWQtPnZhbHVlKTsJCQoKCQlOb2RlKiB0YWlsID0gaGVhZC0+cHJldjsKCgkJd2hpbGUgKGhlYWQgIT0gdGFpbCkgewoJCQloZWFkID0gaGVhZC0+bmV4dDsKCQkJcHJpbnRmKCItPiAlZCAiLCBoZWFkLT52YWx1ZSk7CgkJfQoKCQlwdXRzKCJ9Iik7Cgl9IGVsc2UgewoJCXB1dHMoIkxpc3QgeyB9Iik7Cgl9Cn0KCmludCBtYWluKCkgewoJTGlzdCogbGlzdCA9IG5ld0xpc3QoKTsKCglpbnNlcnRBc0hlYWQobGlzdCwgNSk7CglpbnNlcnRBc0hlYWQobGlzdCwgNik7CglpbnNlcnRBc0hlYWQobGlzdCwgNyk7CgoJcHJpbnRMaXN0Rm9yd2FyZChsaXN0KTsKCglwdXRzKGNvbnRhaW5zVmFsdWUobGlzdCwgNSkpOwoJcHV0cyhjb250YWluc1ZhbHVlKGxpc3QsIDYpKTsKCXB1dHMoY29udGFpbnNWYWx1ZShsaXN0LCA3KSk7CglwdXRzKGNvbnRhaW5zVmFsdWUobGlzdCwgOCkpOwoKCXByaW50TGlzdEZvcndhcmQobGlzdCk7CgoJaW5zZXJ0QXNIZWFkKGxpc3QsIDgpOwoKCXByaW50TGlzdEZvcndhcmQobGlzdCk7CgoJcHV0cyhjb250YWluc1ZhbHVlKGxpc3QsIDUpKTsKCXB1dHMoY29udGFpbnNWYWx1ZShsaXN0LCA2KSk7CglwdXRzKGNvbnRhaW5zVmFsdWUobGlzdCwgNykpOwoJcHV0cyhjb250YWluc1ZhbHVlKGxpc3QsIDgpKTsKCglwcmludExpc3RGb3J3YXJkKGxpc3QpOwoKCXJldHVybiAwOwp9