cddyy2366 发表于 2020-10-27 19:49:15

数据结构队列问题求助

大佬们我现在在用队列实现一个打印系统,现在有问题的部分是我这个compare函数,我把队头指针指向头元素,然后设置了一个可以移动的p指针,初始化指向头元素,函数的作用是将队列第一个元素以此和后面的元素进行比较,如果后面的元素小,就把p指针后移,如果后面出现一个比头元素大的元素就删除头元素并添加到队尾,然后返回length,如果头元素是最大的就返回position,但是现在的问题是如果我的头元素是最大的,这个函数就不会返回值,如果不是最大的就会正常返回length,麻烦各位帮我看一下问题出现在哪里,谢谢!
int Compare(LinkQueue &Q,int position,int length)
{
        QueuePtr p;
        int a,b;
        a=Q.front->next->data;//队头的元素
        p=Q.front->next;//依次指向队列中的所有元素
        b=p->data;
        while(p!=NULL && Q.front!=Q.rear)
        {
                if(a>=b)//如果队头元素大就往后移动p指针
                {
                        p=p->next;
                        b=p->data;
                }
                else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
                {
                        DeQueue(Q,a);
                    EnQueue(Q,a);
                    return length;
                }
        }
        return position;
}

巴巴鲁 发表于 2020-10-27 19:56:13

发一下完整代码,我调试一下

cddyy2366 发表于 2020-10-27 20:11:50

巴巴鲁 发表于 2020-10-27 19:56
发一下完整代码,我调试一下

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 20

typedef int Status;
typedef struct QNode{
        int data;
        struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
        QueuePtr front;
        QueuePtr rear;
}LinkQueue;

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

Status EnQueue(LinkQueue &Q,int e)
{
        QueuePtr p;
        p=(QueuePtr)malloc(sizeof(QNode));
        if(!p)exit(OVERFLOW);
        p->data=e;
        p->next=NULL;
        Q.rear->next=p;
        Q.rear=p;
        return OK;
}

Status DeQueue(LinkQueue &Q,int e)
{
        QueuePtr p;
        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);
        return OK;
}

Status GetHead(LinkQueue Q)
{
        if(Q.front=Q.rear)
        {
                return Q.front->next->data;
        }
}

void Print(LinkQueue Q)
{
        printf("\n队列为:");
        QueuePtr p;
        p=Q.front->next;
        while(p && Q.front!=Q.rear)
        {
                printf("%d ",p->data);
                p=p->next;
        }
}

int Compare(LinkQueue &Q,int position,int length)
{
        QueuePtr p;
        int a,b;
        a=Q.front->next->data;//队头的元素
        p=Q.front->next;//依次指向队列中的所有元素
        b=p->data;
        while(p!=NULL && Q.front!=Q.rear)
        {
                if(a>=b)//如果队头元素大就往后移动p指针
                {
                        p=p->next;
                        b=p->data;
                }
                else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
                {
                        DeQueue(Q,a);
                    EnQueue(Q,a);
                    return length;
                }
        }
        return position;
}

int main()
{
        LinkQueue Q;
        InitQueue(Q);
        int num,length;
        printf("输入队列长度:");
        scanf("%d",&length);
        printf("\n输入队列:");
    for(int i=0;i<length;i++)
    {
            scanf("%d",&num);
            EnQueue(Q,num);
        }
    Print(Q);
   
    int position;
    printf("\n\n输入需要打印的任务的位置:");
    scanf("%d",&position);
   
    for(int i=0;i<position-1;i++)//把指定位置的任务移到队头
    {
            DeQueue(Q,num);
            EnQueue(Q,num);
        }
        Print(Q);
       
        int time=Compare(Q,position,length);
        printf("\n花费时间为:%d",time);
        Print(Q);
}

巴巴鲁 发表于 2020-10-27 20:33:11

这个没有问题啊,另一个也没有
你的运行结果让我看看

cddyy2366 发表于 2020-10-27 20:39:09

巴巴鲁 发表于 2020-10-27 20:33
这个没有问题啊,另一个也没有
你的运行结果让我看看

任务位置是数字在队列的位置数,比如12 3 5 2中,如果位置输2,那么要操作的就是3,我这里如果位置数大于队列长度就运行不了了{:10_266:}

cddyy2366 发表于 2020-10-27 20:47:15

巴巴鲁 发表于 2020-10-27 20:33
这个没有问题啊,另一个也没有
你的运行结果让我看看

如果长度和队列内容像你那样做的话,如果任务位置是1就不会打印花费时间,问题大概就是如果打印任务是队列里最大的数就打印不了花费时间,如果是其他数就会正常打印{:10_262:}

巴巴鲁 发表于 2020-10-27 21:06:34

本帖最后由 巴巴鲁 于 2020-10-27 21:10 编辑

确实是这个函数有问题,刚开始没懂
你运行一下
int Compare(LinkQueue &Q,int position,int length)
{
      QueuePtr p;
      int a,b;
      a=Q.front->next->data;//队头的元素
      p=Q.front->next;//依次指向队列中的所有元素
      b=p->data;
      
      while(p->next!=NULL && Q.front!=Q.rear) // 如果判断p为空,如果p的下一个结点不存在呢?怎么再把p指向下一个结点
      {
                if(a>=b)//如果队头元素大就往后移动p指针
                {
                        p=p->next;
                        b=p->data;
                }
                else if(a<b)//如果有大于队头元素的就把队头元素删除并添加到队尾再退出函数
                {
                  DeQueue(Q,a);
                  EnQueue(Q,a);
                  return length;
                }
      }
      return position;
}

cddyy2366 发表于 2020-10-27 21:26:49

巴巴鲁 发表于 2020-10-27 21:06
确实是这个函数有问题,刚开始没懂
你运行一下

可以正常运行了,谢谢大佬指点{:10_275:}

巴巴鲁 发表于 2020-10-27 21:28:13

cddyy2366 发表于 2020-10-27 21:26
可以正常运行了,谢谢大佬指点

主要要明白为什么会报错{:10_256:}
页: [1]
查看完整版本: 数据结构队列问题求助