愿你 发表于 2018-3-29 16:59:58

为什么我后面的进队元素不打印???

# 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+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+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;
        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=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+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;
}

ba21 发表于 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+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+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;
      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=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+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 21:53:59

ba21 发表于 2018-3-29 20:38


我把函数的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+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+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;
        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=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+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;
}

ba21 发表于 2018-3-29 22:11:56

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

看你的上一遍

愿你 发表于 2018-3-29 22:22:58

ba21 发表于 2018-3-29 22:11
看你的上一遍

啊????啥???

ba21 发表于 2018-3-29 22:35:29

愿你 发表于 2018-3-29 22:22
啊????啥???

[待解决] 关于循环队列销毁问题~{:10_262:}

愿你 发表于 2018-3-30 18:57:07

ba21 发表于 2018-3-29 22:35
[待解决] 关于循环队列销毁问题~

可以加个微信qq啥的吗{:10_256:}
页: [1]
查看完整版本: 为什么我后面的进队元素不打印???