Невозможно напечатать правильные значения удаленных элементов из очереди. DeQueue() используется для удаления элементов. Я использовал метод реализации динамического кругового массива для QUEUE, т. Е. Удвоение памяти при заполнении QUEUE. Первый элемент, возвращенный в процессе удаления, является правильным, но после этого, если удаление выполняется снова, тогда возвращаются случайные значения.Выполняя операцию удаления в следующем коде, я не могу получить правильные значения, возвращаемые в следующем коде.
#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
struct DynArrayQueue{
int front, rear;
int capacity;
int* array;
};
void ResizeQueue(struct DynArrayQueue* Q);
struct DynArrayQueue* CreateDynQueue(){
struct DynArrayQueue* Q = (struct DynArrayQueue*)malloc(sizeof(struct DynArrayQueue));
if(!Q)
{
cout << "Memory Error in allocation!\n";
return NULL;
}
Q->capacity = 1;
Q->front = Q->rear = -1;
Q->array = (int*)malloc(Q->capacity * sizeof(int));
if(!Q->array)
{
cout << "Memory error in creating queue!\n";
return NULL;
}
return Q;
}
int IsEmptyQueue(struct DynArrayQueue* Q){
if(Q->front == -1){
cout << "Queue is empty!\n";
return 1;
}
else{
cout << "Queue not empty\n";
return 0;
}
}
int IsFullQueue(struct DynArrayQueue* Q){
if((((Q->rear)+1)%Q->capacity) == Q->front)
{
cout << "Queue is full!\n";
return 1;
}else{
cout << "Queue not full!\n";
return 0;
}
}
void QueueSize(struct DynArrayQueue* Q){
int s;
s = (Q->capacity - Q->front + Q->rear + 1) % Q->capacity;
cout << "Size of the queue is " << s;
cout << "\n\n";
}
void EnQueue(struct DynArrayQueue* Q){
int data;
cout << "Enter the data to be inserted:\n";
cin >> data;
if(IsFullQueue(Q))
{
ResizeQueue(Q);
}
Q->rear = (Q->rear + 1)%Q->capacity;
Q->array[Q->rear] = data;
if(Q->front == -1)
{
Q->front = Q->rear;
}
}
void ResizeQueue(struct DynArrayQueue* Q){
int size = Q->capacity;
Q->capacity = Q->capacity * 2;
Q->array = (int*)realloc(Q->array, Q->capacity);
if(!Q->array)
cout << "Memory error!\n";
if(Q->front > Q->rear)
{
for(int i = 0; i < Q->front; i++)
{
Q->array[i+size] = Q->array[i];
}
Q->rear = Q->rear + size;
}
}
void DeQueue(struct DynArrayQueue* Q){ **this function does not work properly**
int data = 0;
if(IsEmptyQueue(Q))
{
cout << "Queue Underflow!\n";
cout << "No element to delete!\n";
}
else{
data = Q->array[Q->front];
if(Q->front == Q->rear)
{
Q->front = Q->rear = -1;
}
else
{
Q->front = ((Q->front) + 1) % Q->capacity;
}
}
cout << "Element deleted is " << data;
cout << "\n";
}
void DeleteQueue(struct DynArrayQueue* Q){
if(Q){
if(Q->array)
{
free(Q->array);
}
free(Q);
}
}
int main()
{
int choice;
struct DynArrayQueue* Q1;
while(1)
{
cout << "1. Press to create a Queue:\n";
cout << "2. Enter an element in the queue:\n";
cout << "3. Delete an element from the queue:\n";
cout << "4. Press to know the Queue size:\n";
cout << "5. Press to know if Queue is full:\n";
cout << "6. Press to know if Queue is empty:\n";
cout << "7. Press enter to exit:\n";
cout << "Enter your choice:\n";
cin >> choice;
switch(choice)
{
case 1:
Q1 = CreateDynQueue();
break;
case 2:
EnQueue(Q1);
break;
case 3:
DeQueue(Q1);
break;
case 4:
QueueSize(Q1);
break;
case 5:
IsFullQueue(Q1);
break;
case 6:
IsEmptyQueue(Q1);
break;
case 7:
exit(0);
break;
default:
cout << "Wrong choice entered!\n";
break;
}
}
DeleteQueue(Q1);
}
Будет полезно, если вы можете добавить некоторый ввод, ожидаемый и наблюдаемый выход. –