数据结构队列问题求助
大佬们我现在在用队列实现一个打印系统,现在有问题的部分是我这个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
发一下完整代码,我调试一下
#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
这个没有问题啊,另一个也没有
你的运行结果让我看看
任务位置是数字在队列的位置数,比如12 3 5 2中,如果位置输2,那么要操作的就是3,我这里如果位置数大于队列长度就运行不了了{:10_266:} 巴巴鲁 发表于 2020-10-27 20:33
这个没有问题啊,另一个也没有
你的运行结果让我看看
如果长度和队列内容像你那样做的话,如果任务位置是1就不会打印花费时间,问题大概就是如果打印任务是队列里最大的数就打印不了花费时间,如果是其他数就会正常打印{:10_262:} 本帖最后由 巴巴鲁 于 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;
} 巴巴鲁 发表于 2020-10-27 21:06
确实是这个函数有问题,刚开始没懂
你运行一下
可以正常运行了,谢谢大佬指点{:10_275:} cddyy2366 发表于 2020-10-27 21:26
可以正常运行了,谢谢大佬指点
主要要明白为什么会报错{:10_256:}
页:
[1]