#include <stdio.h>
#include <malloc.h>
/******************************
Queue* q = newLinkedQueue();
q->inQueue(q, 3);
q->inQueue(q, 4);
q->inQueue(q, 5);
printf("%d\n",q->deQueue(q));
printf("%d\n",q->deQueue(q));
*********************************/
typedef struct QueueNodeType
{
int data;
struct QueueNodeType* nextNode;
}QueueNode;
typedef struct QueueType
{
QueueNode* head;
QueueNode* tail;
void (*inQueue) (struct QueueType* self, int data);
int (*deQueue) (struct QueueType* self);
void (*clear) (struct QueueType* self);
}Queue;
void appendQueue(Queue* self, int data);
int popQueue(Queue* self);
void clearQueue(Queue* self);
Queue* newLinkedQueue()
{
Queue
* q
= (Queue
*)malloc(sizeof(Queue
)); q->head = NULL;
q->tail = NULL;
q->inQueue = appendQueue;
q->deQueue = popQueue;
q->clear = clearQueue;
return q;
}
QueueNode* newQueueNode(int data)
{
QueueNode
* node
= (QueueNode
*) malloc(sizeof(QueueNode
)); node->nextNode = NULL;
node->data = data;
return node;
}
void appendQueue(Queue* self, int data)
{
if( self->head == NULL )
{
self->head = newQueueNode(data);
self->tail = self->head;
}
else
{
self->tail->nextNode = newQueueNode(data);
self->tail = self->tail->nextNode;
}
}
int popQueue(Queue* self)
{
int retn = self->head->data;
void* temp = self->head;
self->head = self->head->nextNode;
return retn;
}
void clearQueue(Queue* self)
{
while(self->head != NULL)
{
self->deQueue(self);
}
}
void deleteLinkedQueue(Queue* q)
{
q->clear(q);
}
int main(void)
{
Queue* q = newLinkedQueue();
q->inQueue(q, 3);
q->inQueue(q, 4);
q->inQueue(q, 5);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpRdWV1ZSogcSA9IG5ld0xpbmtlZFF1ZXVlKCk7CnEtPmluUXVldWUocSwgMyk7CnEtPmluUXVldWUocSwgNCk7CnEtPmluUXVldWUocSwgNSk7CnByaW50ZigiJWRcbiIscS0+ZGVRdWV1ZShxKSk7CnByaW50ZigiJWRcbiIscS0+ZGVRdWV1ZShxKSk7CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QgUXVldWVOb2RlVHlwZQp7CglpbnQgZGF0YTsKCXN0cnVjdCBRdWV1ZU5vZGVUeXBlKiBuZXh0Tm9kZTsKfVF1ZXVlTm9kZTsKdHlwZWRlZiBzdHJ1Y3QgUXVldWVUeXBlCnsKCVF1ZXVlTm9kZSogaGVhZDsKCVF1ZXVlTm9kZSogdGFpbDsKCXZvaWQgKCppblF1ZXVlKSAoc3RydWN0IFF1ZXVlVHlwZSogc2VsZiwgaW50IGRhdGEpOwoJaW50ICgqZGVRdWV1ZSkgKHN0cnVjdCBRdWV1ZVR5cGUqIHNlbGYpOwoJdm9pZCAoKmNsZWFyKSAoc3RydWN0IFF1ZXVlVHlwZSogc2VsZik7Cn1RdWV1ZTsKdm9pZCBhcHBlbmRRdWV1ZShRdWV1ZSogc2VsZiwgaW50IGRhdGEpOwppbnQgcG9wUXVldWUoUXVldWUqIHNlbGYpOwp2b2lkIGNsZWFyUXVldWUoUXVldWUqIHNlbGYpOwpRdWV1ZSogbmV3TGlua2VkUXVldWUoKQp7CglRdWV1ZSogcSA9ICAoUXVldWUqKW1hbGxvYyhzaXplb2YoUXVldWUpKTsKCXEtPmhlYWQgPSBOVUxMOwoJcS0+dGFpbCA9IE5VTEw7CgoJcS0+aW5RdWV1ZSA9IGFwcGVuZFF1ZXVlOwoJcS0+ZGVRdWV1ZSA9IHBvcFF1ZXVlOwoJcS0+Y2xlYXIgPSBjbGVhclF1ZXVlOwoJcmV0dXJuIHE7Cn0KUXVldWVOb2RlKiBuZXdRdWV1ZU5vZGUoaW50IGRhdGEpCnsKCVF1ZXVlTm9kZSogbm9kZSA9IChRdWV1ZU5vZGUqKSBtYWxsb2Moc2l6ZW9mKFF1ZXVlTm9kZSkpOwoJbm9kZS0+bmV4dE5vZGUgPSBOVUxMOwoJbm9kZS0+ZGF0YSA9IGRhdGE7CgoJcmV0dXJuIG5vZGU7Cn0Kdm9pZCBhcHBlbmRRdWV1ZShRdWV1ZSogc2VsZiwgaW50IGRhdGEpCnsKCWlmKCBzZWxmLT5oZWFkID09IE5VTEwgKQoJewoJCXNlbGYtPmhlYWQgPSBuZXdRdWV1ZU5vZGUoZGF0YSk7CgkJc2VsZi0+dGFpbCA9IHNlbGYtPmhlYWQ7Cgl9CgllbHNlCgl7CgkJc2VsZi0+dGFpbC0+bmV4dE5vZGUgPSBuZXdRdWV1ZU5vZGUoZGF0YSk7CgkJc2VsZi0+dGFpbCA9IHNlbGYtPnRhaWwtPm5leHROb2RlOwoJfQp9CmludCBwb3BRdWV1ZShRdWV1ZSogc2VsZikKewoJaW50IHJldG4gPSBzZWxmLT5oZWFkLT5kYXRhOwoJdm9pZCogdGVtcCA9IHNlbGYtPmhlYWQ7CgoJc2VsZi0+aGVhZCA9IHNlbGYtPmhlYWQtPm5leHROb2RlOwoKCWZyZWUodGVtcCk7CglyZXR1cm4gcmV0bjsKfQp2b2lkIGNsZWFyUXVldWUoUXVldWUqIHNlbGYpCnsKCXdoaWxlKHNlbGYtPmhlYWQgIT0gTlVMTCkKCXsKCQlzZWxmLT5kZVF1ZXVlKHNlbGYpOwoJfQp9CnZvaWQgZGVsZXRlTGlua2VkUXVldWUoUXVldWUqIHEpCnsKCXEtPmNsZWFyKHEpOwoJZnJlZShxKTsKfQppbnQgbWFpbih2b2lkKQp7CglRdWV1ZSogcSA9IG5ld0xpbmtlZFF1ZXVlKCk7CglxLT5pblF1ZXVlKHEsIDMpOwoJcS0+aW5RdWV1ZShxLCA0KTsKCXEtPmluUXVldWUocSwgNSk7CglwcmludGYoIiVkXG4iLHEtPmRlUXVldWUocSkpOwoJcHJpbnRmKCIlZFxuIixxLT5kZVF1ZXVlKHEpKTsKfQ==