程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一步一步寫算法(之線性隊列)

一步一步寫算法(之線性隊列)

編輯:關於C語言

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱: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;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved