一运行到出队就发生这样。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Maxsize 100
typedef int Datatype;
typedef struct {
Datatype data[Maxsize];
int front;
int rear;
}SqQueue;
//初始化;
void initQueue(SqQueue* Q) {
Q->front = Q->rear = 0;
}
//判空;
bool empty(SqQueue* Q) {
if (Q->rear == 0)
printf("为空\n");
else
printf("非空\n");
return 1;
}
//判满
bool isfull(SqQueue* Q) {
if (Q->rear == Maxsize)
printf("已满\n");
else
printf("非满\n");
return 1;
}
//入队;
bool push(SqQueue* Q, Datatype x) {
if (Q->rear == Maxsize)
return 0;
else
Q->data[Q->rear++] = x;
return 1;
}
//出队;
bool pop(SqQueue* Q, Datatype &x) {
if (Q->rear == 0)
return 0;
else
x = Q->data[Q->front++];
return 1;
}
//计算队列长度;
int getlength(SqQueue* Q) {
int L = 0;
L = (Q->rear - Q->front + Maxsize) % Maxsize;
printf("%d", L);
return L;
}
//读取队列
void sqqueueprintf(SqQueue*Q) {
while (Q->front!=Q->rear)
{
printf("%6d", Q->data[Q->front++]);
}
}
int main() {
SqQueue Q;
Datatype x;
initQueue(&Q);
empty(&Q);
for (int i = 0; i < 5; i++)
{
push(&Q, i);
}
int i = 1;
while (i)
{
printf("当前的队列如下:\n");
sqqueueprintf(&Q);
printf("\n");
printf("------------------------------------\n");
printf(" Main Menu \n");
printf(" 1 入队 \n");
printf(" 2 出队 \n");
printf(" 3 清屏 \n");
printf(" 0 结束程序 \n");
printf("------------------------------------\n");
printf("请输入你选择的菜单号<1, 2, 3, 0>:\n");
scanf_s("%d", &i);
switch (i)
{
case 1:
printf("请输入入队元素:");
scanf_s("%d", &x);
push(&Q, x);
printf("\n\n");
break;
case 2:
pop(&Q, x);
printf("\n\n");
break;
case 3:
system("cls");
break;
case 0:
exit(0);
break;
default:
printf("输入有误\n");
break;
}
}
return 0;
}
你连怎么输入的也没给出
但是一眼就能看到问题
bool empty(SqQueue* Q) {
if (Q->rear == 0)
printf("为空\n");
else
printf("非空\n");
return 1;
}
这个代码,无论是否为空,都返回1
修改如下,改动处见注释,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Maxsize 100
typedef int Datatype;
typedef struct {
Datatype data[Maxsize];
int front;
int rear;
}SqQueue;
//初始化;
void initQueue(SqQueue* Q) {
Q->front = Q->rear = 0;
}
//判空;
bool empty(SqQueue* Q) { //修改
//f (Q->rear == 0)
// printf("为空\n");
//else
// printf("非空\n");
return Q->rear == Q->front;//1; 修改
}
//判满
bool isfull(SqQueue* Q) { //修改
//if (Q->rear == Maxsize)
// printf("已满\n");
//else
// printf("非满\n");
return (Q->rear + 1) % Maxsize == Q->front; //1; 修改
}
//入队;
bool push(SqQueue* Q, Datatype x) {
if (isfull(Q)) //修改
return 0;
//else { 修改
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % Maxsize; //修改
return 1;
//}
}
//出队;
bool pop(SqQueue* Q, Datatype& x) {
if (empty(Q)) //if (Q->rear == 0)
return 0;
x = Q->data[Q->front];
Q->front = (Q->front + 1) % Maxsize; //修改
return 1;
}
//计算队列长度;
int getlength(SqQueue* Q) {
int L = 0;
L = (Q->rear - Q->front + Maxsize) % Maxsize;
printf("%d", L);
return L;
}
//读取队列
void sqqueueprintf(SqQueue* Q) {
int f = Q->front; // 修改
while (f != Q->rear) //while (Q->front != Q->rear) 修改
{
printf("%6d", Q->data[f]); // 修改
f = (f + 1) % Maxsize; // 修改
}
}
int main() {
SqQueue Q;
Datatype x;
initQueue(&Q);
empty(&Q);
for (int i = 0; i < 5; i++)
{
push(&Q, i+1);
}
int i = 1;
while (i)
{
printf("当前的队列如下:\n");
sqqueueprintf(&Q);
printf("\n");
printf("------------------------------------\n");
printf(" Main Menu \n");
printf(" 1 入队 \n");
printf(" 2 出队 \n");
printf(" 3 清屏 \n");
printf(" 0 结束程序 \n");
printf("------------------------------------\n");
printf("请输入你选择的菜单号<1, 2, 3, 0>:\n");
scanf_s("%d", &i);
switch (i)
{
case 1:
printf("请输入入队元素:");
scanf_s("%d", &x);
push(&Q, x);
printf("\n\n");
break;
case 2:
pop(&Q, x);
printf("\n\n");
break;
case 3:
system("cls");
break;
case 0:
exit(0);
break;
default:
printf("输入有误\n");
break;
}
}
return 0;
}