标题:为什么运行到这里就不行了
只看楼主
hsjjgm
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:189
注 册:2013-4-27
结帖率:88.89%
已结贴  问题点数:20 回复次数:6 
为什么运行到这里就不行了
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//循环队列的内核是个数组,因此可以如下定义来确定一个队列
typedef struct queue
{
    int *pbase;
    int rear;     //表示rear所指向的位置
    int front;    //同理,表示front所指向的位置
}QUEUE,* PQUEUE;

void init(PQUEUE);
bool en_queue(PQUEUE, int);
bool is_full(PQUEUE);
void traverse(PQUEUE);
bool out_queue(PQUEUE);
bool is_empty(PQUEUE);

int main(void)
{
    int i,n,n1 = 0,val;
    QUEUE Q;
    init(&Q);
    printf("要添加几个元素");
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        printf("请输入要添加的第%d个元素的值",i+1);
        scanf("%d", &val);
        en_queue(&Q, val);
    }
    traverse(&Q);
    printf("要删除几个元素");
    scanf("%d", &n1);
    for(int j = 0; j < n1; j++)
    {
        printf("%d个元素已经被删除\n",j+1);
        out_queue(&Q);
    }
    traverse(&Q);

    return 0;
}

void init(PQUEUE Q)
{
    //分配内存
    Q->pbase = (int*)malloc(sizeof(int)*6);
    if(Q->pbase == NULL)
    {
        printf("动态内存分配失败,程序终止");
        exit(-1);
    }
    Q->front = 0;
    Q->rear = 0;
}

bool en_queue(PQUEUE Q,int val)   //入队
{
    if(is_full(Q))
    {
        return false;
    }
    else
    {
        Q->pbase[Q->rear] = val;
        Q->rear = (Q->rear+1)%6;
        return true;
    }
}

bool is_full(PQUEUE Q)
{
    if((Q->rear+1)%6 == Q->front)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void traverse(PQUEUE Q)
{
    int p = Q->front;
    while(p != Q->rear)
    {
        printf("%d ", Q->pbase[p]);
        p = (p+1)%6;
    }
    printf("\n");
}

bool out_queue(PQUEUE Q)
{
    if(is_empty(Q))
    {
        int p = 0;
        p = Q->pbase[Q->front];
        Q->front = (Q->front+1)%6;
        printf("被出列的元素是%d\n", p);
        return true;
    }
    else
    {
        return false;
    }
}

bool is_empty(PQUEUE Q)
{
    if(Q->rear = Q->front)
    {
        return false;
    }
    else
    {
        return true;
    }
}



在VC++6.0中的结果:
要添加几个元素5
请输入要添加的第1个元素的值3
请输入要添加的第2个元素的值9
请输入要添加的第3个元素的值1
请输入要添加的第4个元素的值7
请输入要添加的第5个元素的值6
3 9 1 7 6
要删除几个元素2
1个元素已经被删除
被出列的元素是3
2个元素已经被删除     //为什么只执行到这里,没有像上一句那样提示出列的元素

Press any key to continue

搜索更多相关主题的帖子: include void 
2013-05-21 20:03
YJ_Hao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:215
专家分:609
注 册:2013-3-22
得分:15 
bool is_empty(PQUEUE Q)
{
    if(Q->rear = Q->front)<--------------------------这个是赋值,不是比较!!!
    {
        return false;
    }
    else
    {
        return true;
    }
}

2013-05-21 20:26
hsjjgm
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:189
注 册:2013-4-27
得分:0 
回复 2楼 YJ_Hao
额,是的,看来我太马虎了,不过既然已经错了,为什么还执行了呢?
bool is_empty(PQUEUE Q)
{
    if(Q->rear = Q->front)
    {
        return false;
    }
这里应该返回的是false,应该不会执行这里了啊
bool out_queue(PQUEUE Q)
{
    if(is_empty(Q))
    {
        int p = 0;
        p = Q->pbase[Q->front];
        Q->front = (Q->front+1)%6;
        printf("被出列的元素是%d\n", p);
        return true;
    }
为什么结果还输出了一个。。。
2013-05-21 20:56
YJ_Hao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:215
专家分:609
注 册:2013-3-22
得分:0 
第一次的时候值是等于0吧,第二次就不为0了!
2013-05-21 21:47
逆风而前
Rank: 7Rank: 7Rank: 7
来 自:福建
等 级:黑侠
威 望:7
帖 子:193
专家分:567
注 册:2013-2-14
得分:3 
bool is_empty(PQUEUE Q)
{
    if(Q->rear==Q->front)  改成两个=就对了
    {
        return false;
    }
    else
    {
        return true;
    }
}
2013-05-22 19:08
杨瑞川
Rank: 2
等 级:论坛游民
帖 子:16
专家分:25
注 册:2013-5-19
得分:2 
回复 3楼 hsjjgm
这时的执行最为可怕、因为你并不知道错误、切勿忽视
2013-05-22 19:57
hsjjgm
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:189
注 册:2013-4-27
得分:0 
回复 3楼 hsjjgm
恩,对的,谢谢
2013-05-23 08:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-407663-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.158539 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved