#include <stdio.h>
#include <malloc.h>
struct qnode {
char data;
struct qnode* next;
};
typedef struct {
struct qnode* head;
struct qnode* tail;
unsigned cnt;
} queue_t;
void queue_init(queue_t* qc);
int queue_push(queue_t* qc, char ch);
void queue_pop(queue_t* qc);
void queue_clear(queue_t* qc);
int queue_empty(queue_t* qc) { return (qc->head == NULL); }
char queue_front(queue_t* qc) { return qc->head->data; }
unsigned queue_size(queue_t* qc) { return qc->cnt; }
int main(void){
char c;
queue_t q;
queue_init(&q);
for(c = 'A'; c <= 'Z'; ++c)
queue_push(&q, c);
while(! queue_empty(&q)){
printf("%c", queue_front
(&q
)); queue_pop(&q);
}
queue_clear(&q);
return 0;
}
//инициализация
void queue_init(queue_t* qc){
qc->head = qc->tail = NULL;
qc->cnt = 0;
}
//вставка
int queue_push(queue_t* qc, char ch){
struct qnode
* p
= (struct qnode
*)malloc(sizeof(struct qnode
)); if(p == NULL)
return 0;
p->data = ch;
p->next = NULL;
if(qc->head == NULL)
qc->head = qc->tail = p;
else {
qc->tail->next = p;
qc->tail = p;
}
++(qc->cnt);
return 1;
}
//вытолкнуть
void queue_pop(queue_t* qc){
struct qnode* t;
if(qc->head != NULL){
t = qc->head;
qc->head = qc->head->next;
--(qc->cnt);
if(qc->head == NULL)
qc->tail = NULL;
}
}
//удалить всё
void queue_clear(queue_t* qc){
while(! queue_empty(qc))
queue_pop(qc);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KCnN0cnVjdCBxbm9kZSB7CgljaGFyICAgZGF0YTsKCXN0cnVjdCBxbm9kZSogbmV4dDsKfTsKCnR5cGVkZWYgc3RydWN0IHsKCXN0cnVjdCBxbm9kZSogaGVhZDsKCXN0cnVjdCBxbm9kZSogdGFpbDsKCXVuc2lnbmVkICAgICAgY250Owp9IHF1ZXVlX3Q7Cgp2b2lkIHF1ZXVlX2luaXQocXVldWVfdCogcWMpOwppbnQgIHF1ZXVlX3B1c2gocXVldWVfdCogcWMsIGNoYXIgY2gpOwp2b2lkIHF1ZXVlX3BvcChxdWV1ZV90KiBxYyk7CnZvaWQgcXVldWVfY2xlYXIocXVldWVfdCogcWMpOwoKaW50ICBxdWV1ZV9lbXB0eShxdWV1ZV90KiBxYykgeyByZXR1cm4gKHFjLT5oZWFkID09IE5VTEwpOyB9CmNoYXIgcXVldWVfZnJvbnQocXVldWVfdCogcWMpIHsgcmV0dXJuIHFjLT5oZWFkLT5kYXRhOyB9CnVuc2lnbmVkIHF1ZXVlX3NpemUocXVldWVfdCogcWMpIHsgcmV0dXJuIHFjLT5jbnQ7IH0KCmludCBtYWluKHZvaWQpewoJY2hhciAgICBjOwoJcXVldWVfdCBxOwoJcXVldWVfaW5pdCgmcSk7CgoJZm9yKGMgPSAnQSc7IGMgPD0gJ1onOyArK2MpCgkJcXVldWVfcHVzaCgmcSwgYyk7CgoJd2hpbGUoISBxdWV1ZV9lbXB0eSgmcSkpewoJCXByaW50ZigiJWMiLCBxdWV1ZV9mcm9udCgmcSkpOwoJCXF1ZXVlX3BvcCgmcSk7Cgl9CglxdWV1ZV9jbGVhcigmcSk7CglyZXR1cm4gMDsKfQoKLy/QuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjwp2b2lkIHF1ZXVlX2luaXQocXVldWVfdCogcWMpewoJcWMtPmhlYWQgPSBxYy0+dGFpbCA9IE5VTEw7CglxYy0+Y250ICA9IDA7Cn0KCi8v0LLRgdGC0LDQstC60LAKaW50IHF1ZXVlX3B1c2gocXVldWVfdCogcWMsIGNoYXIgY2gpewoJc3RydWN0IHFub2RlKiBwID0gKHN0cnVjdCBxbm9kZSopbWFsbG9jKHNpemVvZihzdHJ1Y3QgcW5vZGUpKTsKCWlmKHAgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCglwLT5kYXRhID0gY2g7CglwLT5uZXh0ID0gTlVMTDsKCglpZihxYy0+aGVhZCA9PSBOVUxMKQoJCXFjLT5oZWFkID0gcWMtPnRhaWwgPSBwOwoJZWxzZSB7CgkJcWMtPnRhaWwtPm5leHQgPSBwOwoJCXFjLT50YWlsID0gcDsKCX0KCSsrKHFjLT5jbnQpOwoJcmV0dXJuIDE7Cn0KCi8v0LLRi9GC0L7Qu9C60L3Rg9GC0YwKdm9pZCBxdWV1ZV9wb3AocXVldWVfdCogcWMpewoJc3RydWN0IHFub2RlKiB0OwoJaWYocWMtPmhlYWQgIT0gTlVMTCl7CgkJdCA9IHFjLT5oZWFkOwoJCXFjLT5oZWFkID0gcWMtPmhlYWQtPm5leHQ7CgkJZnJlZSh0KTsKCgkJLS0ocWMtPmNudCk7CgkJaWYocWMtPmhlYWQgPT0gTlVMTCkKCQkJcWMtPnRhaWwgPSBOVUxMOwoJfQp9CgovL9GD0LTQsNC70LjRgtGMINCy0YHRkQp2b2lkIHF1ZXVlX2NsZWFyKHF1ZXVlX3QqIHFjKXsKCXdoaWxlKCEgcXVldWVfZW1wdHkocWMpKQoJCXF1ZXVlX3BvcChxYyk7Cn0K