循环行列的顺序表示和实现

循环队列的顺序表示和实现

队列的顺序存储结构(循环队列)

#define  MAX_QSIZE 5//最大队列长度+1

struct SqQueue
{
    QElemType *base;
    int front;//头指针,若队列不空,指向队列头元素
    int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
};

循环队列的9个基本操作

void InitQueue(SqQueue &Q){
    Q.base = (QElemType *)malloc(MAX_QSIZE * sizeof(QElemType));
    if (!Q.base) exit(OVERFLOW);
    Q.front = Q.rear = 0;
}

void DestroyQueue(SqQueue &Q){
    if (Q.base)
        free(Q.base); 
    Q.base = NULL;
    Q.front = Q.rear = 0;
}

void ClearQueue(SqQueue &Q){
    Q.front = Q.rear = 0;
}

Status QueueEmpty(SqQueue Q){
    if (Q.front == Q.rear)
        return TRUE;
    else
        return FALSE;
}

int QueueLength(SqQueue Q){
    return (Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;
}

Status GetHead(SqQueue Q, QElemType &e){
    if (Q.front == Q.rear)//队空
        return ERROR;
    e = Q.base[Q.front];//将队头元素的值赋给e
    return OK;
}

Status EnQueue(SqQueue &Q, QElemType e){
    if ((Q.rear + 1) % MAX_QSIZE == Q.front)//队列满
        return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAX_QSIZE;//队尾指针+1后,对MAX_QSIZE取余
    return OK;

}

Status DeQueue(SqQueue &Q, QElemType &e){
    if (Q.front == Q.rear)
        return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAX_QSIZE;//移动队头指针
    return OK;
}

void ListTraverse(SqQueue Q, void(*visit)(ElemType&)){
    int i = Q.front;
    while (i != Q.rear)
    {
        visit(Q.base[i]);
        i = (i + 1) % MAX_QSIZE;
    }
    printf("\n");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。