#pragma once
#include "mlinkList.h"
using LinkQueue = LinkList;
struct LinkQueueNode {
LinkListNode node;
void *item;
};
class linkQueue {
private:
mlinkList chen;
public:
linkQueue();
~linkQueue();
LinkQueue* LinkQueue_Create();
void LinkQueue_Destroy(LinkQueue* queue);
void LinkQueue_Clear(LinkQueue* queue);
int LinkQueue_Append(LinkQueue* queue, void* item);
void* LinkQueue_Retrieve(LinkQueue* queue);
void* LinkQueue_Header(LinkQueue* queue);
int LinkQueue_Length(LinkQueue* queue);
};
#include "linkQueue.h"
linkQueue::linkQueue() {}
linkQueue::~linkQueue(){ }
LinkQueue* linkQueue::LinkQueue_Create() {
return chen.LinkList_Create();
}
void linkQueue::LinkQueue_Destroy(LinkQueue* queue) {
chen.LinkList_Clear(queue);
chen.LinkList_Destroy(queue);
}
void linkQueue::LinkQueue_Clear(LinkQueue* queue) {
while( chen.LinkList_Length(queue)>0 ) {
LinkQueue_Retrieve(queue);
}
}
int linkQueue::LinkQueue_Append(LinkQueue* queue, void* item) {
LinkQueueNode *node = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
int ret = (queue!=nullptr) && (node!=nullptr);
if ( ret ) {
node->item = item;
ret = chen.LinkList_Insert(queue,&node->node,chen.LinkList_Length(queue));
}
if ( !ret ) {
free( node );
node = nullptr;
}
return ret;
}
void* linkQueue::LinkQueue_Retrieve(LinkQueue* queue) {
LinkQueueNode *node = (LinkQueueNode*)chen.LinkList_Delete(queue,0);
void *ret = nullptr;
if ( nullptr != node ) {
ret = node->item;
free(node);
}
return ret;
}
void* linkQueue::LinkQueue_Header(LinkQueue* queue) {
LinkQueueNode *node = (LinkQueueNode*)chen.LinkList_Get(queue,0);
void *ret = nullptr;
if ( node != nullptr ) {
ret = node->item;
}
return ret;
}
int linkQueue::LinkQueue_Length(LinkQueue* queue) {
return chen.LinkList_Length(queue);
}
#include "linkQueue.h"
int main( int argc , char **argv ) {
linkQueue chen;
LinkQueue *queue = chen.LinkQueue_Create();
int a[10] = {0};
int i = 0;
for (int i = 0; i < 10; ++i ) {
a[i] = i;
chen.LinkQueue_Append(queue,a+i);
}
cout << "header:" << *(int*)chen.LinkQueue_Header(queue) << endl;
cout << "len:" << chen.LinkQueue_Length(queue) << endl;
while ( chen.LinkQueue_Length(queue)>0 ) {
cout << *(int*)chen.LinkQueue_Retrieve(queue) << endl;
}
chen.LinkQueue_Destroy(queue);
return 0;
}