【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】
這裡的線性結構實際上指的就是連續內存的意思,只不過使用“線性”這個詞顯得比較專業而已。前面一篇博客介紹了現象結構的處理方法,那麼在這個基礎之上我們是不是添加一些屬性形成一種新的數據結構類型呢?答案是肯定的,隊列便是其中的一種。
隊列的性質很簡單:
(1)隊列有頭部和尾部
(2)隊列從尾部壓入數據
(3)隊列從頭部彈出數據
那麼連續內存下的隊列是怎麼實現的呢?
a)設計隊列數據結構
typedef struct _QUEUE_NODE
{
int* pData;
int length;
int head ;
int tail;
int count;
}QUEUE_NODE;
typedef struct _QUEUE_NODE
{
int* pData;
int length;
int head ;
int tail;
int count;
}QUEUE_NODE; b)申請隊列內存
QUEUE_NODE* alloca_queue(int number)
{
QUEUE_NODE* pQueueNode;
if( 0 == number)
return NULL;
pQueueNode = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE));
assert(NULL != pQueueNode);
memset(pQueueNode, 0, sizeof(QUEUE_NODE));
pQueueNode->pData = (int*)malloc(sizeof(int) * number);
if(NULL == pQueueNode->pData){
free(pQueueNode);
return NULL;
}
pQueueNode->length = number;
return pQueueNode;
}
QUEUE_NODE* alloca_queue(int number)
{
QUEUE_NODE* pQueueNode;
if( 0 == number)
return NULL;
pQueueNode = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE));
assert(NULL != pQueueNode);
memset(pQueueNode, 0, sizeof(QUEUE_NODE));
pQueueNode->pData = (int*)malloc(sizeof(int) * number);
if(NULL == pQueueNode->pData){
free(pQueueNode);
return NULL;
}
pQueueNode->length = number;
return pQueueNode;
} c)釋放隊列內存
STATUS delete_queue(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return FALSE;
assert(NULL != pQueueNode->pData);
free(pQueueNode->pData);
free((void*)pQueueNode);
return TRUE;
}
STATUS delete_queue(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return FALSE;
assert(NULL != pQueueNode->pData);
free(pQueueNode->pData);
free((void*)pQueueNode);
return TRUE;
} d)把數據壓入隊列
STATUS insert_queue(QUEUE_NODE* pQueueNode, int value)
{
if(NULL == pQueueNode)
return FALSE;
if(pQueueNode->length == pQueueNode->count)
return FALSE;
pQueueNode->tail = (pQueueNode->tail + 1) % pQueueNode->length;
pQueueNode->pData[pQueueNode->tail] = value;
pQueueNode->count ++;
return TRUE;
}
STATUS insert_queue(QUEUE_NODE* pQueueNode, int value)
{
if(NULL == pQueueNode)
return FALSE;
if(pQueueNode->length == pQueueNode->count)
return FALSE;
pQueueNode->tail = (pQueueNode->tail + 1) % pQueueNode->length;
pQueueNode->pData[pQueueNode->tail] = value;
pQueueNode->count ++;
return TRUE;
} e)把數據彈出隊列
STATUS get_queue_data(QUEUE_NODE* pQueueNode, int* value)
{
if(NULL == pQueueNode || NULL == value)
return FALSE;
if(0 == pQueueNode->count)
return FALSE;
*value = pQueueNode->pData[pQueueNode->head];
pQueueNode-> pData[pQueueNode->head] = 0;
pQueueNode-> count --;
pQueueNode->head = (pQueueNode->head + 1) % pQueueNode->length;
return TRUE;
}
STATUS get_queue_data(QUEUE_NODE* pQueueNode, int* value)
{
if(NULL == pQueueNode || NULL == value)
return FALSE;
if(0 == pQueueNode->count)
return FALSE;
*value = pQueueNode->pData[pQueueNode->head];
pQueueNode-> pData[pQueueNode->head] = 0;
pQueueNode-> count --;
pQueueNode->head = (pQueueNode->head + 1) % pQueueNode->length;
return TRUE;
} f)統計當前隊列中有多少數據
int get_total_number(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->count;
}
int get_total_number(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->count;
} g)查看隊列中初始化的時候總長度是多少
int get_total_number(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->length;
}
int get_total_number(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->length;
}