循环顺序队列

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");
    }
}
none
最后修改于:2023年11月25日 18:29

评论已关闭