循环顺序队列
warning:
这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
顺序链表没有链式队列的*next指针,所以遍历会出现问题,当队首大于队尾时循环出现问题,比如队列容量为5,队尾为1,队首为4时,遍历循环i递增,i到达5时就会发生数组越界,所以遍历条件应该由(i!=Q->back)改为((i+queuesize)%queuesize!)=Q->back;数组下标由[i]改为[(i+queuesize)%queuesize]。
#include<stdio.h>
#include<stdlib.h>
#define queuesize 5
struct Queue{
int data[queuesize];//数据域
int first;//队首位置
int back;//队尾位置
};//定义循环队列
Queue* initqueue(){
Queue* Q=(Queue*)malloc(sizeof(Queue));
Q->first=0;
Q->back=0;
//队空时,队首与队尾都指向0位置
return Q;
}//初始化循环队列
void searchlen(Queue* Q){
printf("当前队列长度为%d\n",((Q->back)-(Q->first)+queuesize)%queuesize);
}//返回队列长度
int isempty(Queue* Q){
return Q->back==Q->first;
}//判断队空
int isfull(Queue* Q){
return (Q->back+1)%queuesize==Q->first;
}//判断队满
void printqueue(Queue* Q){
int i=Q->first;
while(((i+queuesize)%queuesize)!=Q->back){
printf("%d ",Q->data[(i+queuesize)%queuesize]);
i++;
}
printf("\n");
}//正序打印队列
void pushqueue(Queue* Q){
if(isfull(Q)){
printf("当前队列已满,请删除元素重试\n");
return;
}
int value;
printf("请输入需入队的元素值:");
scanf("%d",&value);
Q->data[Q->back]=value;
Q->back=(Q->back+1)%queuesize;
printf("入队成功\n");
}//元素入队
void popqueue(Queue* Q){
if(isempty(Q)){
printf("当前队列已空,无法删除\n");
return;
}
Q->first=(Q->first+1)%queuesize;
}//元素出队
void searchqueue(Queue* Q){
if(isempty(Q)){
printf("当前队列已空,无法查询\n");
return;
}
int value,i=Q->first;
printf("请输入需查询的元素值:");
scanf("%d",&value);
while(((i+queuesize)%queuesize)!=Q->back){
if(Q->data[(i+queuesize)%queuesize]==value){
printf("成功查询到该元素\n");
return;
}
i++;
}
printf("查询失败\n");
}//查询队列元素
void clearqueue(Queue* Q){
if(isempty(Q)){
printf("当前队列已空\n");
return;
}
free(Q);
printf("清空成功,程序已自动退出\n");
exit(0);
}//清空队列
void queuemenu(){
printf("1.正序打印队列\n");
printf("2.元素入队\n");
printf("3.元素出队\n");
printf("4.返回队列长度\n");
printf("5.根据值查询元素\n");
printf("6.清空队列\n");
printf("0.退出程序\n");
}//队列功能菜单
void endsystem(Queue* Q){
clearqueue(Q);
exit(0);
}//结束程序
int main(){
Queue* Q=initqueue();
int sort,flag=1;
while(flag){
queuemenu();
printf("请输入数字选择功能:");
scanf("%d",&sort);
switch(sort){
case 1:{
printqueue(Q);
break;
}
case 2:{
pushqueue(Q);
break;
}
case 3:{
popqueue(Q);
break;
}
case 4:{
searchlen(Q);
break;
}
case 5:{
searchqueue(Q);
break;
}
case 6:{
clearqueue(Q);
break;
}
case 0:{
endsystem(Q);
break;
}
}
printf("\n");
}
}
评论已关闭