鱼C论坛

 找回密码
 立即注册
查看: 2724|回复: 6

[已解决]为什么我后面的进队元素不打印???

[复制链接]
发表于 2018-3-29 16:59:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# define MAXSIZEQ 100
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int*)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);
        if((Q->rear+1)%MAXSIZEQ==Q->front)
        {
                printf("该队已满了哦,你不可以插入了哦~\n");
        }
        for(i=0;i<n;i++)
        {
                printf("请输入第%d个元素:",i+1);
                scanf("%d",&Q->base[Q->rear]);
                Q->rear=(Q->rear+1)%MAXSIZEQ;
        }
}

void showQ(SQueue *Q)   //显示队元素
{
        int i;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }
        for(i=0;i<(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;i++)
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
        Q->front=Q->rear=0;
        printf("此时队列已经被销毁了哦~\n");
}

void getQ(SQueue *Q)  //查看队头元素
{
        int e;
        e=Q->base[Q->front];
        printf("您的队头元素是:%d\n",e);
}


void enQ(SQueue *Q) // 进队
{
        int e;
        if((Q->rear+1)%MAXSIZEQ==Q->front)
                printf("此时队满了哦,不可以再进队了~\n");
        else
        {
                printf("请写入您需要进队的元素内容:");
                scanf("%d",&e);
                Q->base[Q->rear]=e;
                Q->rear=(Q->rear+1)%MAXSIZEQ;
        }
}

void deQ(SQueue *Q)//出队
{
        if(Q->rear==Q->front)
                printf("此时队空了哦,不可以再出队了~\n");
        else
        {
                printf("您的出队元素内容为:%d\n",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
}





int main()
{
        SQueue Q;
        initQ(&Q);
        creatQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        //destroyQ(&Q);
        //creatQ(&Q);
        //getQ(&Q);
        enQ(&Q);
        lengthQ(&Q);
        //getQ(&Q);
        enQ(&Q);
        lengthQ(&Q);
        deQ(&Q);
        lengthQ(&Q);
        printf("您此时队中的元素为:");
        showQ(&Q);
        //lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
最佳答案
2018-3-29 20:38:13
#include <stdio.h>
#include <stdlib.h>

# define MAXSIZEQ 100
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int*)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);

                if(Q->base) // 内存没有被销毁
                {

                        for(i=0;i<n;i++)
                        {               
                                                        if((Q->rear+1)%MAXSIZEQ==Q->front)
                                        {
                                                printf("该队已满了哦,你不可以插入了哦~\n");
                                                break;
                                        }

                                        printf("请输入第%d个元素:",i+1);
                                        scanf("%d",&Q->base[Q->rear]);
                                        Q->rear=(Q->rear+1)%MAXSIZEQ;



                
                                
                        }
                }
                else
                {
                        printf("队列已被销毁!\n");
                }


}

void showQ(SQueue *Q)   //显示队元素
{
        int i, len;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }

                len = (Q->rear - Q->front + MAXSIZEQ ) % MAXSIZEQ;
        for(i=0; i < len ;i++) // 你这之 Q->front这里也在 +
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ; // Q->front这里也在 +
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
        Q->front=Q->rear=0;
        printf("此时队列已经被销毁了哦~\n");
}

void getQ(SQueue *Q)  //查看队头元素
{
        int e;
        e=Q->base[Q->front];
        printf("您的队头元素是:%d\n",e);
}


void enQ(SQueue *Q) // 进队
{
        int e;
        if((Q->rear+1)%MAXSIZEQ==Q->front)
                printf("此时队满了哦,不可以再进队了~\n");
        else
        {
                printf("请写入您需要进队的元素内容:");
                scanf("%d",&e);
                Q->base[Q->rear]=e;
                Q->rear=(Q->rear+1)%MAXSIZEQ;
        }
}

void deQ(SQueue *Q)//出队
{
        if(Q->rear==Q->front)
                printf("此时队空了哦,不可以再出队了~\n");
        else
        {
                printf("您的出队元素内容为:%d\n",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
}





int main()
{
        SQueue Q;
        initQ(&Q);
        creatQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        //destroyQ(&Q);
        //creatQ(&Q);
        //getQ(&Q);
        enQ(&Q);
        lengthQ(&Q);
        //getQ(&Q);
        enQ(&Q);
        lengthQ(&Q);
        deQ(&Q);
        lengthQ(&Q);
        printf("您此时队中的元素为:");
        showQ(&Q);
        //lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
QQ图片20180329165942.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-29 20:38:13 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <stdlib.h>

# define MAXSIZEQ 100
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int*)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);

                if(Q->base) // 内存没有被销毁
                {

                        for(i=0;i<n;i++)
                        {               
                                                        if((Q->rear+1)%MAXSIZEQ==Q->front)
                                        {
                                                printf("该队已满了哦,你不可以插入了哦~\n");
                                                break;
                                        }

                                        printf("请输入第%d个元素:",i+1);
                                        scanf("%d",&Q->base[Q->rear]);
                                        Q->rear=(Q->rear+1)%MAXSIZEQ;



                
                                
                        }
                }
                else
                {
                        printf("队列已被销毁!\n");
                }


}

void showQ(SQueue *Q)   //显示队元素
{
        int i, len;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }

                len = (Q->rear - Q->front + MAXSIZEQ ) % MAXSIZEQ;
        for(i=0; i < len ;i++) // 你这之 Q->front这里也在 +
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ; // Q->front这里也在 +
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
        Q->front=Q->rear=0;
        printf("此时队列已经被销毁了哦~\n");
}

void getQ(SQueue *Q)  //查看队头元素
{
        int e;
        e=Q->base[Q->front];
        printf("您的队头元素是:%d\n",e);
}


void enQ(SQueue *Q) // 进队
{
        int e;
        if((Q->rear+1)%MAXSIZEQ==Q->front)
                printf("此时队满了哦,不可以再进队了~\n");
        else
        {
                printf("请写入您需要进队的元素内容:");
                scanf("%d",&e);
                Q->base[Q->rear]=e;
                Q->rear=(Q->rear+1)%MAXSIZEQ;
        }
}

void deQ(SQueue *Q)//出队
{
        if(Q->rear==Q->front)
                printf("此时队空了哦,不可以再出队了~\n");
        else
        {
                printf("您的出队元素内容为:%d\n",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
}





int main()
{
        SQueue Q;
        initQ(&Q);
        creatQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        //destroyQ(&Q);
        //creatQ(&Q);
        //getQ(&Q);
        enQ(&Q);
        lengthQ(&Q);
        //getQ(&Q);
        enQ(&Q);
        lengthQ(&Q);
        deQ(&Q);
        lengthQ(&Q);
        printf("您此时队中的元素为:");
        showQ(&Q);
        //lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 21:53:59 | 显示全部楼层

我把函数的creatQ函数改成你那样带判断的,可是为什么我销毁了线性表之后,它不执行creatQ函数中的else语句??为什么还是可以继续创建队列



# define MAXSIZEQ 100
# include<stdio.h>
# include<stdlib.h>
typedef struct{
        int *base;
        int front;
        int rear;
}SQueue;

void initQ(SQueue *Q)   //初始化队元素。
{
        Q->base=(int*)malloc(MAXSIZEQ*sizeof(int));
        if(!Q->base)
        {
                printf("空间无法正常分配,对不起哦~\n");
        }
        Q->front=Q->rear=0;
}

void creatQ(SQueue *Q)   //创建队元素
{
        int n,i;
        printf("请输入您要创建的元素个数:");
        scanf("%d",&n);
        if(Q->base)
        {       
                for(i=0;i<n;i++)
                {
                        if(((Q->rear+1)%MAXSIZEQ==Q->front))
                        {
                                printf("该队已满了哦,你不可以插入了哦~\n");
                                break;
                        }
                        printf("请输入第%d个元素:",i+1);
                        scanf("%d",&Q->base[Q->rear]);
                        Q->rear=(Q->rear+1)%MAXSIZEQ;
                }
        }
        else
        {
                printf("队列已被销毁!\n");
        }
}




void showQ(SQueue *Q)   //显示队元素
{
        int i,count;
        if(Q->front==Q->rear)
        {
                printf("不可以出队了哦 此时队空~\n");
        }
        count=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        for(i=0;i<count;i++)
        {
                printf("%d ",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
        printf("\n");
}

int lengthQ(SQueue *Q) //打印队长
{
        int n;
        n=(Q->rear-Q->front+MAXSIZEQ)%MAXSIZEQ;
        printf("您的队长为:%d\n",n);
        return 0;
}

void isempty(SQueue *Q) //判断是否是空队列
{
        if(Q->rear==Q->front)
                printf("此时队列是空的哦~\n");
        else
                printf("此时队列不为空哦~\n");
}

void destroyQ(SQueue *Q)  //销毁该队列
{
        free(Q->base);
        Q->front=Q->rear=0;
        printf("此时队列已经被销毁了哦~\n");
}

void getQ(SQueue *Q)  //查看队头元素
{
        int e;
        e=Q->base[Q->front];
        printf("您的队头元素是:%d\n",e);
}


void enQ(SQueue *Q) // 进队
{
        int e;
        if((Q->rear+1)%MAXSIZEQ==Q->front)
                printf("此时队满了哦,不可以再进队了~\n");
        else
        {
                printf("请写入您需要进队的元素内容:");
                scanf("%d",&e);
                Q->base[Q->rear]=e;
                Q->rear=(Q->rear+1)%MAXSIZEQ;
        }
}

void deQ(SQueue *Q)//出队
{
        if(Q->rear==Q->front)
                printf("此时队空了哦,不可以再出队了~\n");
        else
        {
                printf("您的出队元素内容为:%d\n",Q->base[Q->front]);
                Q->front=(Q->front+1)%MAXSIZEQ;
        }
}

void clearQ(SQueue *Q)
{
        Q->front=Q->rear=0;
        printf("此时您的队列已经被清空了哦\n");
}





int main()
{
        SQueue Q;
        initQ(&Q);
        creatQ(&Q);
        lengthQ(&Q);
        clearQ(&Q);
        //isempty(&Q);
        destroyQ(&Q);
        creatQ(&Q);
        //getQ(&Q);
        //enQ(&Q);
        //lengthQ(&Q);
        //getQ(&Q);
        //enQ(&Q);
        //lengthQ(&Q);
        //deQ(&Q);
        //lengthQ(&Q);
        printf("您此时队中的元素为:");
        showQ(&Q);
        lengthQ(&Q);
        //isempty(&Q);
        return 0;
}
QQ图片20180329215100.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 22:11:56 | 显示全部楼层
愿你 发表于 2018-3-29 21:53
我把函数的creatQ函数改成你那样带判断的,可是为什么我销毁了线性表之后,它不执行creatQ函数中的else语 ...

看你的上一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 22:22:58 | 显示全部楼层

啊????啥???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 22:35:29 | 显示全部楼层

[待解决] 关于循环队列销毁问题~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-30 18:57:07 From FishC Mobile | 显示全部楼层
ba21 发表于 2018-3-29 22:35
[待解决] 关于循环队列销毁问题~

可以加个微信qq啥的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表