鱼C论坛

 找回密码
 立即注册
查看: 1182|回复: 4

[已解决]c/c++语言队列问题(小白求助)

[复制链接]
发表于 2021-1-6 10:17:01 | 显示全部楼层 |阅读模式

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

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

x
请问这个程序为什么有问题呢?
Q.rear和Q.front开始都指向同一个地方,为什么好像值并不相同?
  1. //第30集课后练习:功能:用户输入什么,就打印出什么!
  2. //注意区别队列与线性表的区别,此处应该使用队列进行操作
  3. //对头front出队,队尾rear出队
  4. #include<stdio.h>
  5. #include<stdlib.h>

  6. typedef struct Qnode
  7. {
  8.         char data;
  9.         struct Qnode *next;
  10. }Qnode, *Qnodep;

  11. typedef struct
  12. {
  13.         Qnodep front;
  14.         Qnodep rear;
  15. }LinkQueue;

  16. LinkQueue Q;

  17. void InitQueue(LinkQueue &Q)//创建一个空队列!
  18. {
  19.         Q.front = Q.rear = (Qnodep)malloc(sizeof(Qnode));
  20.         if(!Q.front) exit(-1);//注意程序的严谨性!
  21.         Q.front->next = Q.rear->next = NULL;
  22. }

  23. void GetHead(LinkQueue Q, char &ch)//返回队头元素(不为空时)
  24. {
  25.         if(Q.front == Q.rear)
  26.         {
  27.                 printf("队列为空!");
  28.                 exit(-1);
  29.         }
  30.         else
  31.         {
  32.                 ch = Q.front->data;
  33.         }
  34. }

  35. void EnQueue(LinkQueue &Q, char ch)//插入元素,生成新的队尾
  36. {
  37.         Q.rear->next = (Qnodep)malloc(sizeof(Qnode));
  38.         if(!Q.rear->next) exit(-1);//分配空间记得检查!
  39.         Q.rear = Q.rear->next;
  40.         Q.rear->data = ch;
  41.         Q.rear->next = NULL;
  42. }

  43. void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
  44. {
  45.         if(Q.front == Q.rear)
  46.         {
  47.                 printf("队列为空!");
  48.                 exit(-1);
  49.         }
  50.         //注意队列的头指针是空的
  51.         ch = Q.front->next->data;
  52.         if(Q.front->next == Q.rear)
  53.         {
  54.                 Q.rear = NULL;//队列为空!
  55.         }
  56.         Q.front = Q.front->next = NULL;
  57. }

  58. int isempty(LinkQueue Q)
  59. {
  60.         if(Q.front == Q.rear) return 1;
  61.         else return 0;
  62. }

  63. int main()
  64. {
  65.         InitQueue(Q);
  66.         char ch;
  67.         printf("请输入一串字符,以#结尾\n");
  68.         scanf("%c", &ch);
  69.         while(ch != '#')
  70.         {
  71.                 EnQueue(Q, ch);
  72.                 scanf("%c", &ch);
  73.         }
  74.         while(!isempty(Q))
  75.         {
  76.                 DeQueue(Q, ch);
  77.                 printf("%c", ch);
  78.         }
  79.         return 0;
  80. }
复制代码
最佳答案
2021-1-6 20:41:41
本帖最后由 xieglt 于 2021-1-6 20:43 编辑
lingwu 发表于 2021-1-6 19:09
有大佬帮帮我吗?

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct Qnode
  4. {
  5.         char data;
  6.         struct Qnode *next;
  7. }Qnode, *Qnodep;

  8. typedef struct
  9. {
  10.         Qnodep front;
  11.         Qnodep rear;
  12. }LinkQueue;

  13. LinkQueue Q;

  14. void InitQueue(LinkQueue &Q)//创建一个空队列!
  15. {
  16.         Q.front = Q.rear = (Qnodep)malloc(sizeof(Qnode));
  17.         if(!Q.front) exit(-1);//注意程序的严谨性!
  18.         //data 没有初始化
  19.         Q.front->data = 0;
  20.         Q.front->next = NULL;
  21. }

  22. void GetHead(LinkQueue Q, char &ch)//返回队头元素(不为空时)
  23. {
  24.         if(Q.front == Q.rear)
  25.         {
  26.                 printf("队列为空!");
  27.                 return;
  28.         }
  29.         else
  30.         {
  31.                 ch = Q.front->data;
  32.         }
  33. }

  34. void EnQueue(LinkQueue &Q, char ch)//插入元素,生成新的队尾
  35. {
  36.         Qnodep node = (Qnodep)malloc(sizeof(Qnode));
  37.         //Q.rear->next = (Qnodep)malloc(sizeof(Qnode));
  38.         if(!node) exit(-1);//分配空间记得检查!

  39.         node->data = ch;
  40.         node->next = NULL;
  41.        
  42.         Q.rear->next = node;
  43.         Q.rear = node;
  44. }

  45. void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
  46. {
  47.         if(Q.front == Q.rear)
  48.         {
  49.                 printf("队列为空!");
  50.                 return;
  51.         }

  52.         //注意队列的头指针是空的
  53.         //取第一个元素
  54.         Qnodep node = Q.front->next;
  55.         ch = node->data;
  56.         //断开第一个元素的节点
  57.         Q.front->next = node->next;
  58.         //只有一个元素了,将对头赋给队尾
  59.         if(node == Q.rear)
  60.         {
  61.                 Q.rear = Q.front;
  62.         }
  63.        
  64.         //释放内存
  65.         free(node);
  66. }

  67. int isempty(LinkQueue Q)
  68. {
  69.         if(Q.front == Q.rear)
  70.                 return 1;
  71.         else
  72.                 return 0;
  73. }

  74. int main()
  75. {
  76.         InitQueue(Q);
  77.         char ch;
  78.         printf("请输入一串字符,以#结尾\n");
  79.         scanf("%c", &ch);
  80.         while(ch != '#')
  81.         {
  82.                 EnQueue(Q, ch);
  83.                 scanf("%c", &ch);
  84.         }

  85.         while(!isempty(Q))
  86.         {
  87.                 DeQueue(Q, ch);
  88.                 printf("%c", ch);
  89.         }
  90.        
  91.         free(Q.front);
  92.         return 0;
  93. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-6 19:09:02 | 显示全部楼层
有大佬帮帮我吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 20:41:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2021-1-6 20:43 编辑
lingwu 发表于 2021-1-6 19:09
有大佬帮帮我吗?

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct Qnode
  4. {
  5.         char data;
  6.         struct Qnode *next;
  7. }Qnode, *Qnodep;

  8. typedef struct
  9. {
  10.         Qnodep front;
  11.         Qnodep rear;
  12. }LinkQueue;

  13. LinkQueue Q;

  14. void InitQueue(LinkQueue &Q)//创建一个空队列!
  15. {
  16.         Q.front = Q.rear = (Qnodep)malloc(sizeof(Qnode));
  17.         if(!Q.front) exit(-1);//注意程序的严谨性!
  18.         //data 没有初始化
  19.         Q.front->data = 0;
  20.         Q.front->next = NULL;
  21. }

  22. void GetHead(LinkQueue Q, char &ch)//返回队头元素(不为空时)
  23. {
  24.         if(Q.front == Q.rear)
  25.         {
  26.                 printf("队列为空!");
  27.                 return;
  28.         }
  29.         else
  30.         {
  31.                 ch = Q.front->data;
  32.         }
  33. }

  34. void EnQueue(LinkQueue &Q, char ch)//插入元素,生成新的队尾
  35. {
  36.         Qnodep node = (Qnodep)malloc(sizeof(Qnode));
  37.         //Q.rear->next = (Qnodep)malloc(sizeof(Qnode));
  38.         if(!node) exit(-1);//分配空间记得检查!

  39.         node->data = ch;
  40.         node->next = NULL;
  41.        
  42.         Q.rear->next = node;
  43.         Q.rear = node;
  44. }

  45. void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
  46. {
  47.         if(Q.front == Q.rear)
  48.         {
  49.                 printf("队列为空!");
  50.                 return;
  51.         }

  52.         //注意队列的头指针是空的
  53.         //取第一个元素
  54.         Qnodep node = Q.front->next;
  55.         ch = node->data;
  56.         //断开第一个元素的节点
  57.         Q.front->next = node->next;
  58.         //只有一个元素了,将对头赋给队尾
  59.         if(node == Q.rear)
  60.         {
  61.                 Q.rear = Q.front;
  62.         }
  63.        
  64.         //释放内存
  65.         free(node);
  66. }

  67. int isempty(LinkQueue Q)
  68. {
  69.         if(Q.front == Q.rear)
  70.                 return 1;
  71.         else
  72.                 return 0;
  73. }

  74. int main()
  75. {
  76.         InitQueue(Q);
  77.         char ch;
  78.         printf("请输入一串字符,以#结尾\n");
  79.         scanf("%c", &ch);
  80.         while(ch != '#')
  81.         {
  82.                 EnQueue(Q, ch);
  83.                 scanf("%c", &ch);
  84.         }

  85.         while(!isempty(Q))
  86.         {
  87.                 DeQueue(Q, ch);
  88.                 printf("%c", ch);
  89.         }
  90.        
  91.         free(Q.front);
  92.         return 0;
  93. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-7 11:15:16 | 显示全部楼层

谢谢大佬帮助,还是有一点不太理解,麻烦你再看看
  1. void DeQueue(LinkQueue &Q, char &ch)//删除一个对头的元素,生成新的对头
  2. {
  3.         if(Q.front == Q.rear)
  4.         {
  5.                 printf("队列为空!");
  6.                 return;
  7.         }

  8.         //注意队列的头指针是空的
  9.         //取第一个元素
  10.         
  11.         //请问,下面一段代码,我不使用node,
  12.                 //明明意思一样,为什么就不对呢?
  13.                
  14.         /*Qnodep node = Q.front->next;
  15.         ch = node->data;
  16.         //断开第一个元素的节点
  17.         Q.front->next = node->next;
  18.         //只有一个元素了,将对头赋给队尾
  19.         if(node == Q.rear)
  20.         {
  21.                 Q.rear = Q.front;
  22.         }*/
  23.         
  24.         //我修改后的代码
  25.                 //Qnodep node = Q.front->next;
  26.         ch = Q.front->next->data;
  27.         //断开第一个元素的节点
  28.         Q.front->next = Q.front->next->next;
  29.         //只有一个元素了,将对头赋给队尾
  30.         if(Q.front->next == Q.rear)
  31.         {
  32.                 Q.rear = Q.front;
  33.         }
  34.         //释放内存
  35.         free(Q.front->next);
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 11:35:05 | 显示全部楼层
lingwu 发表于 2021-1-7 11:15
谢谢大佬帮助,还是有一点不太理解,麻烦你再看看

Q.front->next  节点在之前已经被你断掉了,现在
Q.front->next 已经被赋值为 Q.front->next->next,
你再执行free,释放错了节点啊。
  free(Q.front->next);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-3 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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