#include <stdio.h>
#include <stdlib.h>
typedef struct elem {
int val;
struct elem *next;
struct elem *prev;
} elem;
typedef struct {
elem *first;
elem *last;
} seq_t;
seq_t* seq_create(int val) {
seq_t
*seq
= malloc(sizeof(seq_t
)); elem
*e
= malloc(sizeof(elem
)); e->val = val;
seq->first = e;
seq->last = e;
e->next = NULL;
e->prev = NULL;
return seq;
}
/* add to the end */
void seq_adde(seq_t *seq, int val) {
elem
*e
= malloc(sizeof(elem
)); e->val = val;
e->next = NULL;
e->prev = seq->last;
seq->last->next = e;
seq->last = e;
}
/* add to beginning */
void seq_addb(seq_t *seq, int val) {
elem
*e
= malloc(sizeof(elem
)); e->val = val;
e->next = seq->first;
e->prev = NULL;
seq->first->prev = e;
seq->first = e;
}
void seq_free(seq_t *seq) {
elem *e = seq->first;
elem *ne;
while(e!=NULL) {
ne = e->next;
e = ne;
}
}
void seq_print(seq_t *seq) {
elem *e = seq->first;
while(e!=NULL) {
e = e->next;
}
}
int main(void) {
seq_t *seq = seq_create(3000);
seq_addb(seq,2000);
seq_adde(seq,4000);
seq_addb(seq,1000);
seq_adde(seq,5000);
seq_print(seq);
seq_free(seq);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IGVsZW0gewoJaW50IHZhbDsKCXN0cnVjdCBlbGVtICpuZXh0OwoJc3RydWN0IGVsZW0gKnByZXY7Cn0gZWxlbTsKCnR5cGVkZWYgc3RydWN0IHsKCWVsZW0gKmZpcnN0OwoJZWxlbSAqbGFzdDsKfSBzZXFfdDsKCnNlcV90KiBzZXFfY3JlYXRlKGludCB2YWwpIHsKCXNlcV90ICpzZXE9IG1hbGxvYyhzaXplb2Yoc2VxX3QpKTsKCWVsZW0gKmUgPSBtYWxsb2Moc2l6ZW9mKGVsZW0pKTsKCWUtPnZhbCA9IHZhbDsKCXNlcS0+Zmlyc3QgPSBlOwoJc2VxLT5sYXN0ID0gZTsKCWUtPm5leHQgPSBOVUxMOwoJZS0+cHJldiA9IE5VTEw7CglyZXR1cm4gc2VxOwp9CgovKiBhZGQgdG8gdGhlIGVuZCAqLwp2b2lkIHNlcV9hZGRlKHNlcV90ICpzZXEsIGludCB2YWwpIHsKCWVsZW0gKmUgPSBtYWxsb2Moc2l6ZW9mKGVsZW0pKTsKCWUtPnZhbCA9IHZhbDsKCWUtPm5leHQgPSBOVUxMOwoJZS0+cHJldiA9IHNlcS0+bGFzdDsKCXNlcS0+bGFzdC0+bmV4dCA9IGU7CglzZXEtPmxhc3QgPSBlOwp9CgovKiBhZGQgdG8gYmVnaW5uaW5nICovCnZvaWQgc2VxX2FkZGIoc2VxX3QgKnNlcSwgaW50IHZhbCkgewoJZWxlbSAqZSA9IG1hbGxvYyhzaXplb2YoZWxlbSkpOwoJZS0+dmFsID0gdmFsOwoJZS0+bmV4dCA9IHNlcS0+Zmlyc3Q7CgllLT5wcmV2ID0gTlVMTDsKCXNlcS0+Zmlyc3QtPnByZXYgPSBlOwoJc2VxLT5maXJzdCA9IGU7Cn0KCnZvaWQgc2VxX2ZyZWUoc2VxX3QgKnNlcSkgewoJZWxlbSAqZSA9IHNlcS0+Zmlyc3Q7CgllbGVtICpuZTsKCXdoaWxlKGUhPU5VTEwpIHsKCQluZSA9IGUtPm5leHQ7CgkJZnJlZShlKTsKCQllID0gbmU7Cgl9CglmcmVlKHNlcSk7Cn0KCnZvaWQgc2VxX3ByaW50KHNlcV90ICpzZXEpIHsKCWVsZW0gKmUgPSBzZXEtPmZpcnN0OwoJd2hpbGUoZSE9TlVMTCkgewoJCXByaW50ZigiJWRcbiIsZS0+dmFsKTsKCQllID0gZS0+bmV4dDsKCX0KfQoKaW50IG1haW4odm9pZCkgewoJc2VxX3QgKnNlcSA9IHNlcV9jcmVhdGUoMzAwMCk7CglzZXFfYWRkYihzZXEsMjAwMCk7CglzZXFfYWRkZShzZXEsNDAwMCk7CglzZXFfYWRkYihzZXEsMTAwMCk7CglzZXFfYWRkZShzZXEsNTAwMCk7CglzZXFfcHJpbnQoc2VxKTsKCXNlcV9mcmVlKHNlcSk7CglyZXR1cm4gMDsKfQo=