# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
const int DEFAULT_LEN = 12;//队列长度必须>=2;
typedef struct Queue
{
int * pbase;
int * front;
int * rear;
}QUEUE,*PQUEUE;
void init(PQUEUE);//初始化一个队列
int * get_next_rear(PQUEUE);//获取下一个的rear应该分配的地址
int * get_next_front(PQUEUE);//获取下一个的front应该分配的地址
bool is_empty(PQUEUE);//判断队列是否为空
bool is_full(PQUEUE);//判断队列是否已满
bool in_queue(PQUEUE,int);//入队
bool out_queue(PQUEUE,int *);//出队
void traverse(PQUEUE);//遍历队列并打印输出
void destroy(PQUEUE);//销毁(未完成)
int len(PQUEUE);//求队列长度(未完成)
int main(void)//队列测试
{
QUEUE q;
int out_val;
init(&q);
in_queue(&q,11);
in_queue(&q,35);
in_queue(&q,37);
in_queue(&q,78);
in_queue(&q,89);
in_queue(&q,23);
in_queue(&q,92);
traverse(&q);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
traverse(&q);
in_queue(&q,22);
in_queue(&q,45);
in_queue(&q,12);
in_queue(&q,56);
traverse(&q);
out_queue(&q,&out_val);
out_queue(&q,&out_val);
in_queue(&q,67);
in_queue(&q,89);
in_queue(&q,99);
traverse(&q);
return 0;
}
void init(PQUEUE pq)//初始化一个队列
{
pq->front = pq->rear = pq->pbase = (int *)malloc(sizeof(int) * DEFAULT_LEN);
}
int * get_next_rear(PQUEUE pq)//获取下一个的rear应该分配的地址
{
int * pt;
if(&(pq->pbase[DEFAULT_LEN-1]) == pq->rear)
pt = pq->pbase;
else
pt = pq->rear+1;
return pt;
}
int * get_next_front(PQUEUE pq)//获取下一个的front应该分配的地址
{
int * pt;
if(&(pq->pbase[DEFAULT_LEN-1]) == pq->front)
pt = pq->pbase;
else
pt = pq->front+1;
return pt;
}
bool is_empty(PQUEUE pq)//判断队列是否为空
{
return pq->front==pq->rear;
}
bool is_full(PQUEUE pq)//判断队列是否已满
{
return get_next_rear(pq) == pq->front;
}
bool in_queue(PQUEUE pq,int val)//入队
{
if(is_full(pq))
{
printf("队列已满,入队失败。\n");
return false;
}
*(pq->rear) = val;
pq->rear = get_next_rear(pq);
return true;
}
bool out_queue(PQUEUE pq,int * pval)//出队
{
if(is_empty(pq))
{
printf("队列为空,出队失败。\n");
return false;
}
*pval = pq->front[0];
printf("出队成功,出队值为:%d\n",*pval);
pq->front = get_next_front(pq);
return true;
}
void traverse(PQUEUE pq)//遍历队列并打印输出
{
if(is_empty(pq))
{
printf("队列为空,遍历失败。\n");
return;
}
int * pt1 = pq->front;
while(pq->front != pq->rear)
{
printf("%d\t",*(pq->front));
pq->front = get_next_front(pq);
}
pq->front = pt1;
printf("\n");
}
循环队列(线性队列)模拟(方式1)-数据结构
最新推荐文章于 2024-06-22 08:59:05 发布