赞
踩
参考自维基百科:
含测试代码,详细注释:
#include
#include
#include
/*循环队列 C语言实现
*2011-04-28
*liliming123@sina.com
*/
#ifndef QElementType
#define QElementType int
#endif
#ifndef MAX_SIZE
#define MAX_SIZE 500
#endif
typedef struct
{
QElementType *base;//存储数据
int front;//指向队列头
int rear;//指向队列尾
}CirQueue;
void InitCirQueue(CirQueue *Q)
{//初始化循环队列
//申请空间
Q->base = (QElementType *)malloc(MAX_SIZE*sizeof(QElementType));
//内存检查
if (!Q->base)
exit(0);
//初始条件,空队列
Q->front = Q->rear = 0;
}
void DestroyCirQueue(CirQueue *Q)
{//销毁队列
if (Q->base)
free(Q->base);
Q->base = NULL;
Q->front = Q->rear = 0;
}
void ClearCirQueue(CirQueue *Q)
{//清空队列
Q->front = Q->rear = 0;
}
bool IsEmptyCirQueue(CirQueue *Q)
{//循环队列是否为空,为空返回true
if (Q->front == Q->rear)
return true;
else
return false;
}
int LengthOfCirQueue(CirQueue *Q)
{//获得队列的大小
return (Q->rear - Q->front + MAX_SIZE)%MAX_SIZE;
}
bool InsertCirQueue(CirQueue *Q, QElementType e)
{//添加元素到队列,添加成功返回true
//判断队列是否已满
if ((Q->rear+1)%MAX_SIZE == Q->front)
return false;
Q->base[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAX_SIZE;
return true;
}
bool DelCirQueue(CirQueue *Q, QElementType *e)
{//删除元素,值保存在e中,删除成功返回true
if (Q->front == Q->rear)
return false;
*e = Q->base[Q->front];
Q->front = (Q->front + 1) % MAX_SIZE;
return true;
}
void PrintCirQueue(CirQueue *Q)
{//打印队列
if (IsEmptyCirQueue(Q))
return;
printf("the Queue is:");
int i = Q->front;
while (i != Q->rear)
{
printf("%d ",Q->base[i]);
i = (i+1)%MAX_SIZE;
}
printf("/n");
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//测试
CirQueue *test;
test = (CirQueue *)malloc(sizeof(CirQueue));
InitCirQueue(test);
InsertCirQueue(test, 1);
InsertCirQueue(test, 2);
InsertCirQueue(test, 3);
InsertCirQueue(test, 4);
InsertCirQueue(test, 5);
PrintCirQueue(test);
int temp;
DelCirQueue(test, &temp);
printf("the delete data is : %d/n", temp);
PrintCirQueue(test);
free(test);
test = NULL;
getchar();
return a.exec();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。