c - 使用数组实现最大大小为 5 的固定大小队列

标签 c data-structures

我想用数组实现一个固定大小的队列。

我下面的代码编译并运行成功,但在队列中插入和删除 2 或 3 次后终止。 也许这段代码有一些逻辑错误,我找不到它们。

    #include<stdio.h>
    #include<string.h>
    struct queue {
      int contents[5];
      int front;
      int count;
    };

    void initQueue(struct queue * q);
    void enQueue(struct queue * q, int element);
    int deQueue(struct queue * q);
    void display( struct queue q);
    void printMenu();

    int main()
    {
        struct queue p;
        int data,ch, data1;
        initQueue(&p);
        do  {
        printMenu();    
        printf("Enter your choice\n");
        scanf("%d",&ch);
        switch(ch) {
          case 1:
            printf("Enter the element to be inserted/entered\n");
            scanf("%d",&data);
            enQueue(&p, data);
            break;
          case 2:
            data1 = deQueue(&p);
            if(data1 != -1000)
            printf("The deleted element is %d\n",data1);
            break;
          case 3:
            printf("The contents of the queue are");
            display(p);
            printf("\n");
            break;
          default:
            return 0;
        }
        } while(1);
        return 0;
    }

    void printMenu()
    {
        printf("Choice 1 : Enter element into Queue\n");
        printf("Choice 2 : Delete element from Queue\n");
        printf("Choice 3 : Display\n");
        printf("Any other choice : Exit\n");
    }

    void initQueue(struct queue * q) 
    {
      q->front=0;
      q->count=0;
    }

    void enQueue(struct queue * q, int element)
    {
      if(q->count<5)
      {
        q->contents[q->count]=element;
        q->count++;
        return;
      }
      else
      {
        printf("Queue is full\n");
      }
      return;
    }

    int deQueue(struct queue * q)
    {
      int item,i;
     if(q->front==q->count)
     {
       printf("Queue is empty\n");
       return (-1000);
      }
     else
     {
       item=q->contents[q->front];
       if(item!='\0')
       {
       for(i=q->front;i<q->count-1;i++)
       {
       q->contents[i]=q->contents[i+1];
      }
         q->count=q->count-1;
        return item;
       }
       else
       {
         printf("Queue is empty\n");
         return -1000;
       }
      }
    }

    void display( struct queue q)
    {
      int i;
      if(q.front==q.count)
     {
        printf(" {}");
      }
      else
      {
        for(i=q.front;i<q.count;i++)
        {
          printf(" %d",q.contents[i]);
        }
       }
    }

谁能给我一些想法或解决方案?

最佳答案

 #include<stdio.h>
#include<string.h>
struct queue {
  int contents[5];
  int front;
  int count;
} ;

void initQueue(struct queue * q);
void enQueue(struct queue * q, int element);
int deQueue(struct queue * q);
void display( struct queue q);
void printMenu();

int main()
{
    struct queue p;
    int data,ch, data1;
    initQueue(&p);
    do {
    printMenu();    
    printf("Enter your choice\n");
    scanf("%d",&ch);
    switch(ch) {
      case 1:
        printf("Enter the element to be inserted/entered\n");
        scanf("%d",&data);
        enQueue(&p, data);
        break;
      case 2:
        data1 = deQueue(&p);
        if(data1 != -1000)
        printf("The deleted element is %d\n",data1);
        break;
      case 3:
        printf("The contents of the queue are");
        display(p);
        printf("\n");
        break;
      default:
        return 0;
    }
    } while(1);
    return 0;
}


void printMenu()
{
    printf("Choice 1 : Enter element into Queue\n");
    printf("Choice 2 : Delete element from Queue\n");
    printf("Choice 3 : Display\n");
    printf("Any other choice : Exit\n");
}

void initQueue(struct queue * q) 
{
  q->front=0;
  q->count=0;
}

void enQueue(struct queue * q, int element)
{
  int index;
  index=(q->count+q->front)%5;
  if(index==q->front&&q->count!=0)
    printf("Queue is full\n");
  else
  {
      q->count++;
    q->contents[index]=element;
  }
}

int deQueue(struct queue * q)
{
  int elem;
  if(q->count==0)
  {
   printf("Queue is empty\n");
    return (-1000);
  }
  elem=q->contents[q->front];
  q->count--;
  q->front=(q->front+1)%5;
  return elem;
}

void display( struct queue q)
{
  int i,index;
  if(q.count==0)
    printf(" {}");
  else
  {
      for(index=q.front,i=1;i<=q.count;i++,index++)
        printf(" %d",q.contents[index%5]);
  }

}

关于c - 使用数组实现最大大小为 5 的固定大小队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010171/

相关文章:

c - 将 4 个 uint16_t 封装在一个 uint64_t 中的快速模 12 算法

c - 在c中不使用Strcmp比较两个字符串的简单方法

c++ - 在 sprintf 函数中添加逗号

c - 当指向前一个节点的指针不可用时从单个链表中删除中间节点

C 编程,解决结构中的 C2073 错误?

java - 实现多列表的最有效方法?

c - 使用 sizeof 进行分配是否会为结构指针产生错误的大小?

c# - for循环中可能发生的事情

java - 如何在 java 应用程序中存储文件或文件路径?

c++ - 数据结构 : explanation of pop, push, dequeue, enqueue 在这类练习中