鱼C论坛

 找回密码
 立即注册
查看: 2819|回复: 2

[已解决]为什么打印队列元素没有显示,跪求大佬帮助

[复制链接]
发表于 2020-4-26 07:32:16 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
#include<stdlib.h>
#define ok 1               
#define error 0
#define overlow -1

typedef char elemtype;
typedef struct Qnode
{
        elemtype data;
        struct Qnode* next;
}qnode;

typedef struct
{
        qnode *front;
        qnode *rear;
}linkqnode;

int Initqnode(linkqnode* q)
{
        q->front = q->rear = (qnode*)malloc(sizeof(qnode));
        if (!q->front)
                exit(overlow);
        printf("队列初始化成功..\n");
        q->front->next = NULL;
        return ok;
}

int EnQueue(linkqnode* q, elemtype e)
{
        if (q->rear == q->front)
                return error;
        qnode *p;
        p=(qnode*)malloc(sizeof(qnode));
        p->data = e;
        p->next = NULL;
        q->rear->next = p;
        q->rear = p;
        return ok;
}

int DeQueue(linkqnode* q, elemtype* e)
{
        qnode *p;
        p=(qnode*)malloc(sizeof(qnode));
  if( q->front == q->rear )
        return error;

    p = q->front->next;
    *e = p->data;
    q->front->next = p->next;

    if( q->rear == p )
    {
        q->rear = q->front;
    }

    free(p);
}

int DestroyQueue(linkqnode* q)
{
        while (q->front)
        {
                q->rear = q->front->next;
                free(q->front);
                q->front = q->rear;
        }
        return ok;
}


int main()
{
        linkqnode Q;
        elemtype e;
        Initqnode(&Q);
        printf("请输入一窜字符串并以'#'结束:\n");
        scanf("%c", &e);
        while (e != '#')
        {
                EnQueue(&Q, e);
                scanf("%c", &e);
        }
        printf("打印队列中的元素:");
  while( Q.front != Q.rear )
    {
        DeQueue( &Q, &e );
        printf("%c", e);
    }
    DeQueue( &Q, &e );
    return 0;
}

啊啊啊啊,跪求大佬帮助,为什么打印队列元素没有显示。
最佳答案
2020-4-26 09:12:00
你的入队函数有问题。帮你标注出来了
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define ok 1               
  4. #define error 0
  5. #define overlow -1

  6. typedef char elemtype;
  7. typedef struct Qnode
  8. {
  9.     elemtype data;
  10.     struct Qnode* next;
  11. }qnode;

  12. typedef struct
  13. {
  14.     qnode *front;
  15.     qnode *rear;
  16. }linkqnode;

  17. int Initqnode(linkqnode* q)
  18. {
  19.     q->front = q->rear = (qnode*)malloc(sizeof(qnode));
  20.     if (!q->front)
  21.             exit(overlow);
  22.     printf("队列初始化成功..\n");
  23.     q->front->next = NULL;
  24.     return ok;
  25. }

  26. int EnQueue(linkqnode* q, elemtype e)
  27. {
  28.     //if (q->rear == q->front)//队列刚刚初始化的时候,q->rear和q->front本来就是一样的,你这样写,队列是无法插进去任何元素的。所以输出的时候什么也没有。
  29.     //        return error;
  30.     qnode *p;
  31.     p=(qnode*)malloc(sizeof(qnode));
  32.     if(!p)
  33.                 return error;
  34.     p->data = e;
  35.     p->next = NULL;
  36.     q->rear->next = p;
  37.     q->rear = p;
  38.     return ok;
  39. }

  40. int DeQueue(linkqnode* q, elemtype* e)
  41. {
  42.     qnode *p;
  43.     p=(qnode*)malloc(sizeof(qnode));
  44.     if( q->front == q->rear )
  45.         return error;

  46.     p = q->front->next;
  47.     *e = p->data;
  48.     q->front->next = p->next;

  49.     if( q->rear == p )
  50.     {
  51.         q->rear = q->front;
  52.     }

  53.     free(p);
  54.     return 0;
  55. }

  56. int DestroyQueue(linkqnode* q)
  57. {
  58.     while (q->front)
  59.     {
  60.         q->rear = q->front->next;
  61.         free(q->front);
  62.         q->front = q->rear;
  63.     }
  64.     return ok;
  65. }


  66. int main()
  67. {
  68.         linkqnode Q;
  69.         elemtype e;
  70.         Initqnode(&Q);
  71.         printf("请输入一窜字符串并以'#'结束:\n");
  72.         scanf("%c", &e);
  73.         while (e != '#')
  74.         {
  75.             EnQueue(&Q, e);
  76.             scanf("%c", &e);
  77.         }
  78.         printf("打印队列中的元素:");
  79.   while( Q.front != Q.rear )
  80.     {
  81.         DeQueue( &Q, &e );
  82.         printf("%c", e);
  83.     }
  84.     DeQueue( &Q, &e );
  85.     return 0;
  86. }
复制代码
QQ图片20200426072950.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-26 09:12:00 | 显示全部楼层    本楼为最佳答案   
你的入队函数有问题。帮你标注出来了
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define ok 1               
  4. #define error 0
  5. #define overlow -1

  6. typedef char elemtype;
  7. typedef struct Qnode
  8. {
  9.     elemtype data;
  10.     struct Qnode* next;
  11. }qnode;

  12. typedef struct
  13. {
  14.     qnode *front;
  15.     qnode *rear;
  16. }linkqnode;

  17. int Initqnode(linkqnode* q)
  18. {
  19.     q->front = q->rear = (qnode*)malloc(sizeof(qnode));
  20.     if (!q->front)
  21.             exit(overlow);
  22.     printf("队列初始化成功..\n");
  23.     q->front->next = NULL;
  24.     return ok;
  25. }

  26. int EnQueue(linkqnode* q, elemtype e)
  27. {
  28.     //if (q->rear == q->front)//队列刚刚初始化的时候,q->rear和q->front本来就是一样的,你这样写,队列是无法插进去任何元素的。所以输出的时候什么也没有。
  29.     //        return error;
  30.     qnode *p;
  31.     p=(qnode*)malloc(sizeof(qnode));
  32.     if(!p)
  33.                 return error;
  34.     p->data = e;
  35.     p->next = NULL;
  36.     q->rear->next = p;
  37.     q->rear = p;
  38.     return ok;
  39. }

  40. int DeQueue(linkqnode* q, elemtype* e)
  41. {
  42.     qnode *p;
  43.     p=(qnode*)malloc(sizeof(qnode));
  44.     if( q->front == q->rear )
  45.         return error;

  46.     p = q->front->next;
  47.     *e = p->data;
  48.     q->front->next = p->next;

  49.     if( q->rear == p )
  50.     {
  51.         q->rear = q->front;
  52.     }

  53.     free(p);
  54.     return 0;
  55. }

  56. int DestroyQueue(linkqnode* q)
  57. {
  58.     while (q->front)
  59.     {
  60.         q->rear = q->front->next;
  61.         free(q->front);
  62.         q->front = q->rear;
  63.     }
  64.     return ok;
  65. }


  66. int main()
  67. {
  68.         linkqnode Q;
  69.         elemtype e;
  70.         Initqnode(&Q);
  71.         printf("请输入一窜字符串并以'#'结束:\n");
  72.         scanf("%c", &e);
  73.         while (e != '#')
  74.         {
  75.             EnQueue(&Q, e);
  76.             scanf("%c", &e);
  77.         }
  78.         printf("打印队列中的元素:");
  79.   while( Q.front != Q.rear )
  80.     {
  81.         DeQueue( &Q, &e );
  82.         printf("%c", e);
  83.     }
  84.     DeQueue( &Q, &e );
  85.     return 0;
  86. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 12:08:49 | 显示全部楼层
sunrise085 发表于 2020-4-26 09:12
你的入队函数有问题。帮你标注出来了

大哥,非常感谢啊,我一直以为是我的出队函数有问题,啊,非常感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 05:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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