我的循环队列实现无法正常工作

时间:2015-08-30 19:00:24

标签: c

我创建了一个程序来实现带有插入,删除和显示的循环队列。插入工作正常并删除,但一旦我尝试删除后输入数字,则不显示任何内容。这是我的源代码:

#include<stdio.h>
#include<conio.h>
#define SIZE 5
int front = -1;
int rear = -1;
int queue[SIZE];
void enqueue(int item);
int dequeue();
void display();
void main()
{
    int item, choice, cont = 1;
    clrscr();

    while(cont == 1)
    {
        printf("\n1.Enqueue into queue.\n");
        printf("\n2.Dequeue from queue.\n");
      printf("\n3.display quesue elements\n");

        printf("\nEnter your choice: ");
        scanf("%d",&choice);

        switch(choice)
        {
            case 1:
                printf("\nEnter the value of item: ");
                scanf("%d",&item);
                enqueue(item);
                break;

            case 2:
                item = dequeue();
                if(item != NULL)
                {
                    printf("\nItem dequeued: %d\n",item);
                }
                break;
         case 3:
                display();
                break;

            default:
                printf("\nInvalid choice.\n");
                break;
        }

        printf("\nDo you want to continue (1/0): ");
        scanf("%d",&cont);
    }

    getch();
}


void enqueue(int item)
{

  if(front==0 && rear==SIZE-1)
    printf("\n Queue OverFlow Occured");
  else if(front==-1 && rear==-1)
  {
      front=rear=0;
      queue[rear]=item;

  }
  else if(rear==SIZE-1 && front!=0)
  {
    rear=0;
    queue[rear]=item;
  }
    else
   {
      rear++;
      queue[rear]=item;
   }


}
int dequeue()
{
    int item = NULL;
    if(front == -1 && rear == -1)
    {
        printf("\nQueue is empty. Dequeue not possible.\n");
    }
    else
    {
        item = queue[front];
        queue[front] = NULL;

        if(front == rear)
        {
            front = -1;
            rear = -1;
        }
        else
        {
            front = front + 1;
        }

   }
    return(item);
}
void display()
{
    int i;
    if(front==-1)
      printf("\n No elements to display");
    else
    {
      printf("\n The queue elements are:\n ");
      for(i=front;i<=rear;i++)
      {
          printf("\t %d",queue[i]);
      }
    }
}

3 个答案:

答案 0 :(得分:1)

检查此代码是否正常工作。

  

很少有建议不使用conio.h [clrscr()和getch()]这些都不是标准。

尝试下面的代码,对我来说很好。

CODE

    #include<stdio.h>
    #define SIZE 5
    int front = -1;
    int rear = -1;
    int queue[SIZE];
    void enqueue(int item);
    int dequeue();
    void display();
    int main()
    {
        int item, choice, cont = 1;

        while(cont == 1)
        {
            printf("\n1.Enqueue into queue.\n");
            printf("\n2.Dequeue from queue.\n");
          printf("\n3.display quesue elements\n");

            printf("\nEnter your choice: ");
            scanf("%d",&choice);

            switch(choice)
            {
                case 1:
                    printf("\nEnter the value of item: ");
                    scanf("%d",&item);
                    enqueue(item);
                    break;

                case 2:
                    item = dequeue();
                    if(item != NULL)
                    {
                        printf("\nItem dequeued: %d\n",item);
                    }
                    break;
             case 3:
                    display();
                    break;

                default:
                    printf("\nInvalid choice.\n");
                    break;
            }

            printf("\nDo you want to continue (1/0): ");
            scanf("%d",&cont);
        }

        printf("");
        return 0;
    }


    void enqueue(int item)
    {

      if(front==0 && rear==SIZE-1)
        printf("\n Queue OverFlow Occured");
      else if(front==-1 && rear==-1)
      {
          front=rear=0;
          queue[rear]=item;

      }
      else if(rear==SIZE-1 && front!=0)
      {
        rear=0;
        queue[rear]=item;
      }
        else
       {
          rear++;
          queue[rear]=item;
       }


    }
    int dequeue()
    {
        int item = NULL;
        if(front == -1 && rear == -1)
        {
            printf("\nQueue is empty. Dequeue not possible.\n");
        }
        else
        {
            item = queue[front];
            queue[front] = NULL;

            if(front == rear)
            {
                front = -1;
                rear = -1;
            }
            else
            {
                front = front + 1;
            }

       }
        return(item);
    }
    void display()
    {
        int i;
        if(front==-1)
          printf("\n No elements to display");
        else
        {
          printf("\n The queue elements are:\n ");
          for(i=front;i<=rear;i++)
          {
              printf("\t %d",queue[i]);
          }
        }

    }

输出

    Do you want to continue (1/0): 1

    1.Enqueue into queue.

    2.Dequeue from queue.

    3.display quesue elements

    Enter your choice: 3

     The queue elements are:
       5   5
    Do you want to continue (1/0): 1

    1.Enqueue into queue.

    2.Dequeue from queue.

    3.display quesue elements

    Enter your choice: 1

    Enter the value of item: 43

    Do you want to continue (1/0): 1

    1.Enqueue into queue.

    2.Dequeue from queue.

    3.display quesue elements

    Enter your choice: 3

     The queue elements are:
       5   5   43
    Do you want to continue (1/0): 1

    1.Enqueue into queue.

    2.Dequeue from queue.

    3.display quesue elements

    Enter your choice: 2

    Item dequeued: 5

    Do you want to continue (1/0): 1

    1.Enqueue into queue.

    2.Dequeue from queue.

    3.display quesue elements

    Enter your choice: 3

     The queue elements are:
       5   43
    Do you want to continue (1/0): 

答案 1 :(得分:1)

这是您的全功能更新代码。我在Ideone.com上粘贴代码链接为 link to code

如果你不理解任何事情,请问。我试图用评论来解释它。现在它没有遇到任何问题。

#include<stdio.h>
#include<conio.h>
#define SIZE 5

int front = -1;
int rear = -1;
int queue[SIZE];
void enqueue(int item);
int dequeue();
void display();
void main()
{
    int item, choice, cont = 1;
    clrscr();

    while(cont == 1)
    {
    printf("\n1.Enqueue into queue.\n");
    printf("\n2.Dequeue from queue.\n");
  printf("\n3.display quesue elements\n");

    printf("\nEnter your choice: ");
    scanf("%d",&choice);

    switch(choice)
    {
        case 1:
            printf("\nEnter the value of item: ");
            scanf("%d",&item);
            enqueue(item);
            break;



       case 2:
                item = dequeue();
                if(item != NULL)
                {
                    printf("\nItem dequeued: %d\n",item);
                }
                break;
         case 3:
                display();
                break;

            default:
                printf("\nInvalid choice.\n");
                break;
        }

        printf("\nDo you want to continue (1/0): ");
        scanf("%d",&cont);
    }

    getch();
    }


    void enqueue(int item)
    {
    int temp = (rear+1)%SIZE;    //EDIT HERE
      if(temp == front){
        printf("\n Queue OverFlow Occured"); 
          return;
}
      else if(front==-1 )
      {
          front=rear=0;
          queue[rear]=item;
          return;
      }
      else{
            rear = (rear+1)%SIZE;    // EDIT HERE
            queue[rear%SIZE]=item;
       }
    }
    int dequeue()
    {
        int item = NULL;
        if(front == rear)   //     modified condition
        {
            printf("\nQueue is empty. Dequeue not possible.\n");
        }
        else
        {
            item = queue[front];
            queue[front] = NULL;
            front++;                                    // front must be incremented
            if(front > rear)                           
            {
                front = -1;
                rear = -1;
            }
       }
        return(item);
    }
    void display()
    {
        int i;
        if(front==-1)
          printf("\n No elements to display");
        else
        {
          printf("\n The queue elements are:\n ");
          for(i=front;i<=rear;i++)
          {
              printf("%d\t",queue[i]);
          }
        }
    }

答案 2 :(得分:1)

这是一个相当混乱的代码。由于想法是让队列成为循环,因此通过检查frontrear的位置来尝试确定队列是否已满可能非常棘手,并且尝试根据{{做出决策1}}高于front等等。你可以避免这一切。跟踪队列长度的第三个变量将使您的生活变得更加轻松。

请尝试使用此实现:

rear