データ構造学習の行列(チェーン記憶)


【要約】前のブログでは主に循環列を検討していますが、循環列は事前にスペースを申請していますので、利用期間は釈放できません.しかし、チェーンの列は、毎回申請とノードの解放ができます.列の長さを予見できない時は、チェーンを使った行列を考えることができます.(1)キューデータ構造の設計
/*    */
typedef struct _QUEUE_NODE
{
    int pData;
    struct _QUEUE_NODE *next;
}QUEUE_NODE,*QUEUEPtr;

/*       */
typedef struct LinkQueue
{
    QUEUEPtr head;
    QUEUEPtr tail;
    int count;
}LinkQueue;
(2)初期化キュー
STATUS init_queue(LinkQueue* pQueueNode)
{

    pQueueNode->head = (QueuePtr)malloc(sizeof(QUEUE_NODE)); //      
    if(!pQueueNode->head) //        
        return FALSE;

    pQueueNode->tail = pQueueNode->head;    
    pQueueNode->head->next=NULL; //     next   

    pQueueNode->count = 0;

    return TRUE;
}
(3)データをキューに押し込む
STATUS insert_queue(LinkQueue* pQueueNode, int value)
{
    QUEUEPtr s = (QUEUEPtr)malloc(sizeof(QUEUE_NODE));

    if(NULL == s)
        return FALSE;

    s->data = value;
    s->next = NULL; 

    pQueueNode->tail->next = s;
    pQueueNode->tail = s;  //      
    pQueueNode->count ++;

    return TRUE;
}
(4)データをキューにイジェクトする
STATUS get_queue_data(LinkQueue* pQueueNode, int* value)
{
    QUEUEPtr s = NULL;
    if(NULL == pQueueNode || NULL == value || pQueueNode->head == pQueueNode->tail)
        return FALSE;

    if(0 == pQueueNode->count)
        return FALSE;

    *value = pQueueNode->head; //   

    s = pQueueNode->head; //    
    pQueueNode->head = s->next;//       
    /*         s = pQueueNode->head->next; //     pQueueNode->head = s->next;//        if(pQueueNode->tail==s) //       { pQueueNode->tail = pQueueNode->head } */

    free(s);
    s = NULL;

    pQueueNode-> count--;

    return TRUE;
}
(5)現在のキューのデータを統計します.
int  get_total_number(const LinkQueue* pQueueNode)
{
    if(NULL == pQueueNode)
        return 0;

    return pQueueNode->count;
}