데이터 구조 - 순차 저장 구조 - 대기 열

순차 저장 구조 - 대기 열
//queue.c
#include 
#include 

//  
typedef struct node{
    int* data;
    int size;

    int head;
    int tail;

}queue_t;
//  
queue_t* create_queue(int size)
{
    if(size<=1)
    {
        return NULL;
    }

    queue_t* queue=malloc(sizeof(queue_t));

    queue->size=size;

    queue->data=malloc(sizeof(int)*size);

    queue->head=queue->tail=0;

    return queue;
}
//  
int isnull_queue(queue_t* queue)
{
    if(queue==NULL)
        return 0;

    return queue->head==queue->tail;
}
//  
int isfull_queue(queue_t* queue)
{
    if(queue==NULL)
        return 0;

    //    return (queue->tail+1)%queue->size==queue->head;   //  %  mod      
    //2?
    //
    return (queue->tail-queue->head+queue->size)%queue->size==queue->size-1;
    //    
}
//  
int push_queue(queue_t* queue,int data)
{
    if(queue==NULL||isfull_queue(queue))
        return -1;

    queue->data[queue->tail]=data;

    queue->tail=(queue->tail+1)%queue->size;

    return 0;
}
//  
int pop_queue(queue_t* queue,int* data)
{
    if(queue==NULL||isnull_queue(queue))
        return -1;

    *data=queue->data[queue->head];

    queue->data[queue->head]=0;
//         

    queue->head=(queue->head+1)%queue->size;

    return 0;
}

//  
int length_queue(queue_t* queue)
{
    if(queue==NULL||isnull_queue(queue))
        return 0;

    return (queue->tail-queue->head+queue->size)%queue->size;
}
//   ( )
int print_queue_notreal(queue_t* queue)
{
    if(queue==NULL||isnull_queue(queue))
        return -1;

    int i;

    for(i=0;isize;i++)
    {
        printf("%3d ",queue->data[i]);
    }
    printf("
"); return 0; } // ( ) h -》 t int print_queue_htot(queue_t* queue) { if(queue==NULL||isnull_queue(queue)) return -1; int i; for(i=queue->head;i!=queue->tail;i=(i+1)%queue->size) { printf("%3d ",queue->data[i]); } printf("
"); return 0; } // int clear_queue(queue_t* queue) { if(queue==NULL) return -1; queue->tail=queue->head=0; return 0; } // int destroy_queue(queue_t* queue) { if(queue==NULL) return -1; free(queue->data); free(queue); return 0; } // ( ) or : int reprint_queue_real(queue_t* queue) { if(queue==NULL||isnull_queue(queue)) return -1; int * stack1=malloc(sizeof(int)*length_queue(queue)); int top1=-1; int * stack2=malloc(sizeof(int)*length_queue(queue)); int top2=-1; int data; while(!isnull_queue(queue)) { pop_queue(queue,&data); stack1[++top1]=data; } while(top1!=-1) { data=stack1[top1--]; printf("%3d ",data); stack2[++top2]=data; } printf("
"); while(top2!=-1) { data=stack2[top2--]; push_queue(queue,data); } free(stack1); free(stack2); return 0; } // ( ) int print_queue_real(queue_t* queue) { if(queue==NULL||isnull_queue(queue)) return -1; queue_t* temp=create_queue(length_queue(queue)+1); int data; while(!isnull_queue(queue)) { pop_queue(queue,&data); printf("%3d ",data); push_queue(temp,data); } printf("
"); while(!isnull_queue(temp)) { pop_queue(temp,&data); push_queue(queue,data); } destroy_queue(temp); return 0; } int main(int argc, const char *argv[]) { queue_t* queue=create_queue(20); int i; for(i=1;i<=20;i++) { if(0==push_queue(queue,i)) print_queue_htot(queue); } print_queue_notreal(queue); print_queue_real(queue); print_queue_notreal(queue); reprint_queue_real(queue); print_queue_notreal(queue); // print_queue_htot(queue); destroy_queue(queue); #if 0 int data; for(i=1;i<=20;i++) { if(0==pop_queue(queue,&data)) { printf("pop data:%d
",data); // print_queue_notreal(queue); print_queue_htot(queue); } } #endif return 0; }

좋은 웹페이지 즐겨찾기