C语言 检查函数在这个优先队列程序中是如何工作的



这是处理优先级队列数据结构的程序。有人能给我解释一下这个程序中的校验功能吗?我知道它是用来检查插入元素的优先级,但我有点困惑,它是如何做到这一点的,什么是嵌套循环在检查函数的需要。

还请解释j的for循环初始化和条件部分,为什么我们做rear+1,为什么是j>i

#include <stdio.h>
#include <stdlib.h>
#define max 3
int q[max],front=0,rear=-1;
void insert_by_p()
{
if(rear==max-1)
{
printf("overflown");return;
}
printf("please enter the elementn");
int a;
scanf("%d",&a);
check(a);
rear++;
}
void check(int a)
{
int i,j;
for(i=front;i<=rear;i++)
{
if(a<=q[i])
{
for(j=rear+1;j>i;j--)
q[j]=q[j-1];
q[i]=a;
return;
}
}
q[i]=a;
}
void display()
{
if(rear==-1||front>rear)
{
printf("underflown");return;
}
printf("Q items:");
for(int i=front;i<=rear;i++)
{
printf("%d,",q[i]);
}
printf("n");
}
void delete_by_p()
{
if(rear==-1||front>rear)
{
printf("underflown");return;
}
printf("the deleted element is %dn",q[front++]);
}
int main()
{
int a;
while(1)
{
printf("please choose one option:n1.insertn2.deleten3.displayn4.exitn");
scanf("%d",&a);
switch(a)
{
case 1: insert_by_p();
break;
case 2: delete_by_p();
break;
case 3: display();
break;
case 4: exit(0);
break;
default:printf("Wrong choicen");
break;
}
}
return 0;
}

编辑:所以我得到了关于代码是否正确或谁提供代码的评论。不要担心代码工作得很好,这是我的教授给我的。与线性队列不同,优先队列将根据元素的优先级(这里是max元素的最高优先级)排列元素。

考虑:

int q[max],front=0,rear=-1;

则在insert_by_p()中:

check(a);
rear++;

check()被调用时,a尚未插入,rear指的是"old"结束(第一次插入时为-1)。所以在检查中,rear比插入位置小1。因此rear + 1在for循环中,j > i因为循环是向i反向迭代。

关于check()的实际工作原理,首先,它不会">检查插入元素的优先级">&;-它实际上执行插入-它的名称具有误导性。外部循环遍历q[]的未删除元素。内循环移动q[]的元素,为a的插入腾出空间。

老实说,代码不是很好;

  • 数组是一种不合适的数据结构,每次插入都需要不确定地移动数据。双链表更合适。
  • frontrear只递增。每次调用delete_by_p(),都有效地减少了队列容量。这是一个"漏"字。算法。
  • check()insert_by_p()声明前使用。
  • 既然a是由check()插入的,那么rear++也应该在那里完成(check()对于实际修改数据的函数来说是一个坏名字)。
  • check()有两个出口点,其中一个深嵌套-这很讨厌,并且可能导致错误。例如,如果你按照我的建议将rear++移动到check();你必须在两个地方添加它。
  • 我相信还有其他问题——这些只是显而易见的问题。

最新更新