循环行列的顺序表示和实现
循环队列的顺序表示和实现
队列的顺序存储结构(循环队列)
#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");
}
版权声明:本文为博主原创文章,未经博主允许不得转载。