キューの循環記憶C実現

1487 ワード

キューは、先頭(FIFO)の線形テーブルであり、一端(キューテール)でのみ挿入操作が可能であり、他端(キューヘッダ)では削除操作が可能である.
キューのシーケンスストレージ構造は、キュー要素を連続したアドレス空間のセットで格納する.キューの最後に要素を挿入するとスペースが減少し、キューの最初に削除するとスペースが増加します.シーケンスキューの弊害は,増加した空き領域が再利用できず,ループキューの先頭と末尾が接続され,削除操作を行って増加した空間が再利用できることである.
コードは次のとおりです.
#include<stdio.h>
#include<malloc.h>
#define OK 0
#define ERROR -1
#define OVERFLOW  -1
//         
#define MAXSIZE 100
typedef struct {
    int *base;
    int front;
    int rear;
}queue;
int init_queue(queue *q)
{
    q->base = (int*)malloc(MAXSIZE * sizeof(int));
    if(!q->base)
        exit(OVERFLOW);
    q->front = q->rear = 0;
    return OK;
}
int enqueue(queue * q, int e)
{
    if((q->rear + 1)%MAXSIZE == q->front )
        return ERROR;
    q->base[q->rear] = e;
    q->rear = (q->rear+1)%MAXSIZE;
    return OK;
}
int dequeue(queue * q, int *e)
{
    if(q->rear == q->front)
    return ERROR;
    *e = q->base[q->front];
    q->front = (q->front+1)% MAXSIZE;
    return OK;
}
int main()
{
    queue q;
    int i;
    int e;
    printf("init queue
"); init_queue(&q); printf("enqueue
"); for(i = 0; i < 10; i++) { enqueue(&q, i); printf("%3d", i); } printf("
dequeue
"); for( i = 0; i < 10; i++) { dequeue(&q, &e); printf("%3d", e); } printf("
"); return 0; }