鱼C论坛

 找回密码
 立即注册
查看: 947|回复: 8

[已解决]数据结构队列问题求助

[复制链接]
发表于 2020-10-27 19:49:15 | 显示全部楼层 |阅读模式

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

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

x
大佬们我现在在用队列实现一个打印系统,现在有问题的部分是我这个compare函数,我把队头指针指向头元素,然后设置了一个可以移动的p指针,初始化指向头元素,函数的作用是将队列第一个元素以此和后面的元素进行比较,如果后面的元素小,就把p指针后移,如果后面出现一个比头元素大的元素就删除头元素并添加到队尾,然后返回length,如果头元素是最大的就返回position,但是现在的问题是如果我的头元素是最大的,这个函数就不会返回值,如果不是最大的就会正常返回length,麻烦各位帮我看一下问题出现在哪里,谢谢!
  1. int Compare(LinkQueue &Q,int position,int length)
  2. {
  3.         QueuePtr p;
  4.         int a,b;
  5.         a=Q.front->next->data;//队头的元素
  6.         p=Q.front->next;//依次指向队列中的所有元素
  7.         b=p->data;
  8.         while(p!=NULL && Q.front!=Q.rear)
  9.         {
  10.                 if(a>=b)//如果队头元素大就往后移动p指针
  11.                 {
  12.                         p=p->next;
  13.                         b=p->data;
  14.                 }
  15.                 else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
  16.                 {
  17.                         DeQueue(Q,a);
  18.                     EnQueue(Q,a);
  19.                     return length;
  20.                 }
  21.         }
  22.         return position;
  23. }
复制代码
最佳答案
2020-10-27 21:06:34
本帖最后由 巴巴鲁 于 2020-10-27 21:10 编辑

确实是这个函数有问题,刚开始没懂
你运行一下
  1. int Compare(LinkQueue &Q,int position,int length)
  2. {
  3.         QueuePtr p;
  4.         int a,b;
  5.         a=Q.front->next->data;//队头的元素
  6.         p=Q.front->next;//依次指向队列中的所有元素
  7.         b=p->data;
  8.         
  9.         while(p->next!=NULL && Q.front!=Q.rear) // 如果判断p为空,如果p的下一个结点不存在呢?怎么再把p指向下一个结点
  10.         {
  11.                 if(a>=b)//如果队头元素大就往后移动p指针
  12.                 {
  13.                         p=p->next;
  14.                         b=p->data;
  15.                 }
  16.                 else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
  17.                 {
  18.                     DeQueue(Q,a);
  19.                     EnQueue(Q,a);
  20.                     return length;
  21.                 }
  22.         }
  23.         return position;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-27 19:56:13 | 显示全部楼层
发一下完整代码,我调试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 20:11:50 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 19:56
发一下完整代码,我调试一下
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #define OK 1
  5. #define ERROR 0
  6. #define OVERFLOW -2
  7. #define MAXSIZE 20

  8. typedef int Status;
  9. typedef struct QNode{
  10.         int data;
  11.         struct QNode *next;
  12. }QNode,*QueuePtr;

  13. typedef struct{
  14.         QueuePtr front;
  15.         QueuePtr rear;
  16. }LinkQueue;

  17. Status InitQueue(LinkQueue &Q)
  18. {
  19.         Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
  20.         if(!Q.front)exit(OVERFLOW);
  21.         Q.front->next=NULL;
  22.         return OK;
  23. }

  24. Status EnQueue(LinkQueue &Q,int e)
  25. {
  26.         QueuePtr p;
  27.         p=(QueuePtr)malloc(sizeof(QNode));
  28.         if(!p)exit(OVERFLOW);
  29.         p->data=e;
  30.         p->next=NULL;
  31.         Q.rear->next=p;
  32.         Q.rear=p;
  33.         return OK;
  34. }

  35. Status DeQueue(LinkQueue &Q,int e)
  36. {
  37.         QueuePtr p;
  38.         if(Q.front==Q.rear)
  39.         {
  40.                 return ERROR;
  41.         }
  42.         p=Q.front->next;
  43.         e=p->data;
  44.         Q.front->next=p->next;
  45.         if(Q.rear==p)
  46.         {
  47.                 Q.rear=Q.front;
  48.         }
  49.         free(p);
  50.         return OK;
  51. }

  52. Status GetHead(LinkQueue Q)
  53. {
  54.         if(Q.front=Q.rear)
  55.         {
  56.                 return Q.front->next->data;
  57.         }
  58. }

  59. void Print(LinkQueue Q)
  60. {
  61.         printf("\n队列为:");
  62.         QueuePtr p;
  63.         p=Q.front->next;
  64.         while(p && Q.front!=Q.rear)
  65.         {
  66.                 printf("%d ",p->data);
  67.                 p=p->next;
  68.         }
  69. }

  70. int Compare(LinkQueue &Q,int position,int length)
  71. {
  72.         QueuePtr p;
  73.         int a,b;
  74.         a=Q.front->next->data;//队头的元素
  75.         p=Q.front->next;//依次指向队列中的所有元素
  76.         b=p->data;
  77.         while(p!=NULL && Q.front!=Q.rear)
  78.         {
  79.                 if(a>=b)//如果队头元素大就往后移动p指针
  80.                 {
  81.                         p=p->next;
  82.                         b=p->data;
  83.                 }
  84.                 else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
  85.                 {
  86.                         DeQueue(Q,a);
  87.                     EnQueue(Q,a);
  88.                     return length;
  89.                 }
  90.         }
  91.         return position;
  92. }

  93. int main()
  94. {
  95.         LinkQueue Q;
  96.         InitQueue(Q);
  97.         int num[MAXSIZE],length;
  98.         printf("输入队列长度:");
  99.         scanf("%d",&length);
  100.         printf("\n输入队列:");
  101.     for(int i=0;i<length;i++)
  102.     {
  103.             scanf("%d",&num[i]);
  104.             EnQueue(Q,num[i]);
  105.         }
  106.     Print(Q);
  107.    
  108.     int position;
  109.     printf("\n\n输入需要打印的任务的位置:");
  110.     scanf("%d",&position);
  111.    
  112.     for(int i=0;i<position-1;i++)//把指定位置的任务移到队头
  113.     {
  114.             DeQueue(Q,num[i]);
  115.             EnQueue(Q,num[i]);
  116.         }
  117.         Print(Q);
  118.        
  119.         int time=Compare(Q,position,length);
  120.         printf("\n花费时间为:%d",time);
  121.         Print(Q);
  122. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 20:33:11 | 显示全部楼层
这个没有问题啊,另一个也没有
你的运行结果让我看看
QQ截图20201027203137.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 20:39:09 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 20:33
这个没有问题啊,另一个也没有
你的运行结果让我看看

任务位置是数字在队列的位置数,比如12 3 5 2中,如果位置输2,那么要操作的就是3,我这里如果位置数大于队列长度就运行不了了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 20:47:15 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 20:33
这个没有问题啊,另一个也没有
你的运行结果让我看看

如果长度和队列内容像你那样做的话,如果任务位置是1就不会打印花费时间,问题大概就是如果打印任务是队列里最大的数就打印不了花费时间,如果是其他数就会正常打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 21:06:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 巴巴鲁 于 2020-10-27 21:10 编辑

确实是这个函数有问题,刚开始没懂
你运行一下
  1. int Compare(LinkQueue &Q,int position,int length)
  2. {
  3.         QueuePtr p;
  4.         int a,b;
  5.         a=Q.front->next->data;//队头的元素
  6.         p=Q.front->next;//依次指向队列中的所有元素
  7.         b=p->data;
  8.         
  9.         while(p->next!=NULL && Q.front!=Q.rear) // 如果判断p为空,如果p的下一个结点不存在呢?怎么再把p指向下一个结点
  10.         {
  11.                 if(a>=b)//如果队头元素大就往后移动p指针
  12.                 {
  13.                         p=p->next;
  14.                         b=p->data;
  15.                 }
  16.                 else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
  17.                 {
  18.                     DeQueue(Q,a);
  19.                     EnQueue(Q,a);
  20.                     return length;
  21.                 }
  22.         }
  23.         return position;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 21:26:49 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 21:06
确实是这个函数有问题,刚开始没懂
你运行一下

可以正常运行了,谢谢大佬指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 21:28:13 | 显示全部楼层
cddyy2366 发表于 2020-10-27 21:26
可以正常运行了,谢谢大佬指点

主要要明白为什么会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-17 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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