0

这是我en_queue在不同条件下插入新元素的功能。

void en_queue(int *queue,int max,int front,int rear)
{
    int ch1;
    printf("\n Enter element to add->");
    scanf("%d",&ch1);
    if(front==0 && rear==(max-1))
    {
        printf("\n Caution!! Queue Overflow!!");
    }
    else if(rear==(max-1) && front>0)
    {
        rear=0;
        queue[rear]=ch1;
        printf("\n %d added to the queue where front fo the queue has room but rear does not" ,ch1);
    }
    else if(front==-1 && rear==-1)
    {
        front=rear=0;
        queue[rear]=ch1;
        printf("\n %d added to the queue where this is the first element to the queue" ,ch1);
    }
    else 
    {
        rear++;
        queue[rear]=ch1;
        printf("\n %d added to the queue where the element added in the rear" ,ch1);
    }
}

这是我的show_queue功能。

void show_queue(int *newqueue,int front,int rear)
{
    int i=0;
    for(i=front;i<=rear;i++)
    {
        printf("%d",newqueue[i]);
    }
}

通过打印语句,我检查元素是否总是被插入到第一个位置。所以,我最好的猜测是rearfront元素没有成功更新,但我无法找到原因。另外,我至少应该看到show_queue函数正确插入的第一个值;相反,我看到的是垃圾值,但这些值是恒定的,即。4235968每次。

更新 -这是所要求的主要功能。

#include<stdio.h>
#include<stdlib.h>

#define MAX 10

void en_queue(int *,int, int, int);
void show_queue(int *,int,int);

int main()
{
    int queue[MAX],front=-1,rear=-1,ch;
    do{
        printf("\n <<Queue MENU>>");
        printf("\n 1. Add Element");
        printf("\n 2. Delete Element");
        printf("\n 3. Show Queue");
        printf("\n 4. Exit menu");
        printf("\n Enter your choice->");
        scanf("%d", &ch);

        switch(ch)
        {
            case 1: en_queue(queue,MAX,front,rear);
                break;
            /*  
            case 2: del_queue(queue,MAX,front,rear);
                 break;
             */
            case 3: printf("\n The queue is->");
                show_queue(queue,front,rear);
                break;

            case 4:exit(0);

            default: printf("\n Invalid Choice!!!");
                return 0;
        }
    } while(ch!=4);

    return 0;
}
4

2 回答 2

4

您的frontandrear按值传递的,因此它们的更改不会在此函数之外维护。

基本上发生的事情是你的frontrear变量是调用函数中存在的那些的副本main,比如说。因此,此处对其所做的更改不会反映在调用函数中。

你也会有这个问题dequeue

您可能希望按照与推荐相反的顺序执行以下操作之一

  1. 使它们成为全局变量。- 不推荐,风格不好,容易出错,只允许 1 个队列。
  2. 使它们指向父函数中的变量
  3. OOP 风格,将队列变成一个struct包含数组、、maxfront的队列rear,并将其作为指针传递。
于 2013-09-13T06:11:24.760 回答
1
    else 
    {
        rear++;
        queue[rear]=ch1;
        printf("\n %d added to the queue where the element added in the rear" ,ch1);
    }

将 后方++ 更改为 *后方++ 。它应该可以解决您的问题。

编辑:

我试过你修改的代码,问题似乎是*rear++,把它改成

    *rear++ to (*rear)++
于 2013-09-13T08:24:34.127 回答