#include "common.h"
#define nullptr 0
typedef struct LinkNode
{
int id;
int data;
int memidx;
LinkNode *prev;
LinkNode *next;
}LinkNode;
#define maxmemsize 22
static LinkNode g_n_mem[maxmemsize]; // 使用静态内存
typedef struct Queue
{
LinkNode *head;
LinkNode *tail;
int size;
}Queue;
typedef struct memHeap // 用一个堆链表实现静态内存的读取
{
int heap[maxmemsize];
int tail;
}memHeap;
static LinkNode * my_allocate(memHeap *mMemHeap) // 循环内存也可以通过 g_n_mem[g_n_mem_cnt++ % maxmemsize] 实现
{
if (mMemHeap->tail <= 0)
return nullptr;
return &g_n_mem[mMemHeap->heap[--mMemHeap->tail]];
}
static void my_free(memHeap *mMemHeap, int memidx) // 静态内存的回收
{
mMemHeap->heap[mMemHeap->tail++] = memidx;
}
static void init_queue(Queue **queue, memHeap *mMemHeap)
{
if ((*queue) == nullptr)
{
(*queue) = new Queue;
}
Queue *Q = (*queue);
Q->head = my_allocate(mMemHeap);
Q->tail = my_allocate(mMemHeap);
Q->head->prev = nullptr;
Q->head->next = Q->tail;
Q->tail->prev = Q->head;
Q->tail->next = nullptr;
Q->size = 0;
}
//从头节点处添加数据
static void en_queue_head(Queue* Q, LinkNode *pNode)
{
pNode->next = Q->head->next;
pNode->prev = Q->head;
Q->head->next->prev = pNode;
Q->head->next = pNode;
Q->size++;
}
//从尾结点添加数据
static void en_queue_tail(Queue* Q, LinkNode *pNode)
{
pNode->next = Q->tail;
pNode->prev = Q->tail->prev;
Q->tail->prev->next = pNode;
Q->tail->prev = pNode;
Q->size++;
}
static LinkNode * de_queue_head(Queue* Q, memHeap *mMemHeap) //从头节点开始删除数据
{
if (Q->size <= 0)
return nullptr;
LinkNode *pNode = Q->head->next;
pNode->next->prev = Q->head;
Q->head->next = pNode->next;
Q->size--;
mMemHeap->heap[mMemHeap->tail++] = pNode->memidx;
return pNode;
}
static LinkNode * de_queue_tail(Queue* Q, memHeap *mMemHeap) //从尾部删除数据
{
if (Q->size <= 0)
return nullptr;
LinkNode * pNode = Q->tail->prev;
pNode->prev->next = Q->tail;
Q->tail->prev = pNode->prev;
Q->size--;
my_free(mMemHeap, pNode->memidx);
return pNode;
}
static void clear_queue(Queue* Q, memHeap *mMemHeap)
{
if (Q->size <= 0)
return;
LinkNode * pNode = Q->head->next;
while (pNode != Q->tail)
{
my_free(mMemHeap, pNode->memidx);
pNode = pNode->next;
}
Q->head->prev = Q->head->next = Q->head;
}
static void display_queue(Queue* Q)
{
if (Q->size <= 0)
{
LOGE("Q is null, return");
return;
}
LinkNode *pNode = Q->head->next;
//for (register int i = 0; i < Q->size; i++)
while (pNode != Q->tail)
{
printf("[%d %d] ", pNode->id, pNode->data);
pNode = pNode->next;
}
printf("\n\n");
}
static void init_doule_list(Queue *Q, memHeap *mMemHeap, int num)
{
srand((int)time(0));
for (register int i = 0; i < num; i++)
{
LinkNode *pNode = my_allocate(mMemHeap);
pNode->id = i;
//pNode->data = i + 100;; //次关键字
pNode->data = 1 + rand() % (100 - 10 + 1) + 10;
printf("[%d %d] ", pNode->id, pNode->data);
//虽然进队函数不同,但下面两个生成的链表最终包含的数据是一样的
//en_queue_head(Q, pNode);
en_queue_tail(Q, pNode);
}
printf("\n\n");
}
static void init_memory(memHeap **mMemHeap)
{
*mMemHeap = new memHeap;
(*mMemHeap)->tail = maxmemsize; // 0 ~ maxmemsize-1
for (register int i = 0; i < maxmemsize; i++)
{
g_n_mem[i].memidx = i;
(*mMemHeap)->heap[i] = i;
}
}
extern void test_head_tail_double_list()
{
static memHeap *mMemHeap;
init_memory(&mMemHeap);
static Queue *mQ;
init_queue(&mQ, mMemHeap);
init_doule_list(mQ, mMemHeap, 20);
display_queue(mQ);
LOGE("dequeue from head : ");
while (mQ->size > 0)
{
LinkNode *pNode = de_queue_head(mQ, mMemHeap);
printf("[%d %d] memidx= %d Q size = %d tail= %d\n", pNode->id, pNode->data, pNode->memidx, mQ->size, mMemHeap->tail);
pNode->prev = pNode->next = nullptr;
}
LOGE("\n");
clear_queue(mQ, mMemHeap);
init_doule_list(mQ, mMemHeap, 20);
display_queue(mQ);
LOGE("dequeue from tail : ");
while (mQ->size > 0)
{
LinkNode * pNode = de_queue_tail(mQ, mMemHeap);
printf("[%d %d] memidx= %d Q size = %d tail= %d\n", pNode->id, pNode->data, pNode->memidx, mQ->size, mMemHeap->tail);
pNode->prev = pNode->next = nullptr;
}
LOGE("\n");
display_queue(mQ);
delete mMemHeap;
mMemHeap = nullptr;
delete mQ;
mQ = nullptr;
}