第7週SHHデータ構造—【項目2-チームアルゴリズムライブラリの構築】

4076 ワード

/*
Copyright (c)2015,              
All rights reserved.
    :  2-       .cbp
      :   
    :2015 10 26 
     :v1.0
    :         ,       ,     。
    : 
    :    
*/

ヘッダファイル:liqueue.h
#ifndef LIQUEUE_H_INCLUDED
#define LIQUEUE_H_INCLUDED

typedef char ElemType;
typedef struct qnode
{
    ElemType data;
    struct qnode *next;
} QNode;        //          

typedef struct
{
    QNode *front;
    QNode *rear;
} LiQueue;          //      
void InitQueue(LiQueue *&q);  //     
void DestroyQueue(LiQueue *&q);  //    
bool QueueEmpty(LiQueue *q);  //        
int QueueLength(LiQueue *q);  //           
void enQueue(LiQueue *&q,ElemType e);  //  
bool deQueue(LiQueue *&q,ElemType &e);   //  

#endif // LIQUEUE_H_INCLUDED

ソースファイル:liqueue.cpp
#include <stdio.h>
#include <malloc.h>
#include "liqueue.h"

void InitQueue(LiQueue *&q)  //     
{
    q=(LiQueue *)malloc(sizeof(LiQueue));
    q->front=q->rear=NULL;
}
void DestroyQueue(LiQueue *&q)  //    
{
    QNode *p=q->front,*r;   //p        
    if (p!=NULL)            //          
    {
        r=p->next;
        while (r!=NULL)
        {
            free(p);
            p=r;
            r=p->next;
        }
    }
    free(p);
    free(q);                //          
}
bool QueueEmpty(LiQueue *q)  //        
{
    return(q->rear==NULL);
}
int QueueLength(LiQueue *q)  //           
{
    int n=0;
    QNode *p=q->front;
    while (p!=NULL)
    {
        n++;
        p=p->next;
    }
    return(n);
}
void enQueue(LiQueue *&q,ElemType e)  //  
{
    QNode *p;
    p=(QNode *)malloc(sizeof(QNode));
    p->data=e;
    p->next=NULL;
    if (q->rear==NULL)      //     ,               
        q->front=q->rear=p;
    else
    {
        q->rear->next=p;    // *p      ,  rear   
        q->rear=p;
    }
}
bool deQueue(LiQueue *&q,ElemType &e)   //  
{
    QNode *t;
    if (q->rear==NULL)      //    
        return false;
    t=q->front;             //t         
    if (q->front==q->rear)  //          
        q->front=q->rear=NULL;
    else                    //         
        q->front=q->front->next;
    e=t->data;
    free(t);
    return true;
}

mainテスト関数
#include <stdio.h>
#include "liqueue.h"

int main()
{
    ElemType e;
    LiQueue *q;
    printf("(1)     q
"); InitQueue(q); printf("(2) a,b,c
"); enQueue(q,'a'); enQueue(q,'b'); enQueue(q,'c'); printf("(3) %s
",(QueueEmpty(q)?" ":" ")); if (deQueue(q,e)==0) printf(" ,
"); else printf("(4) %c
",e); printf("(5) q :%d
",QueueLength(q)); printf("(6) d,e,f
"); enQueue(q,'d'); enQueue(q,'e'); enQueue(q,'f'); printf("(7) q :%d
",QueueLength(q)); printf("(8) :"); while (!QueueEmpty(q)) { deQueue(q,e); printf("%c ",e); } printf("
"); printf("(9)
"); DestroyQueue(q); return 0; }

実行結果