鱼C论坛

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

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

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

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

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

x
大佬们我现在在用队列实现一个打印系统,现在有问题的部分是我这个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 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; 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 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[MAXSIZE],length;
        printf("输入队列长度:");
        scanf("%d",&length);
        printf("\n输入队列:"); 
    for(int i=0;i<length;i++)
    {
            scanf("%d",&num[i]);
            EnQueue(Q,num[i]);
        }
    Print(Q);
    
    int position;
    printf("\n\n输入需要打印的任务的位置:");
    scanf("%d",&position);
    
    for(int i=0;i<position-1;i++)//把指定位置的任务移到队头 
    {
            DeQueue(Q,num[i]);
            EnQueue(Q,num[i]);
        }
        Print(Q);
        
        int time=Compare(Q,position,length);
        printf("\n花费时间为:%d",time);
        Print(Q);
}
想知道小甲鱼最近在做啥?请访问 -> 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 编辑

确实是这个函数有问题,刚开始没懂
你运行一下
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; 
}
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-12 20:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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