c-在循环队列上插入和删除元素



我正在研究数据结构中的循环队列。从下面的代码中可以看到,我尝试删除特定的数据,并在循环队列中插入数据。但是,当我尝试运行它时,在删除数据并插入新数据时会出现问题。我对此一无所知。我想解决这个问题好几个小时了,但什么也找不到。如有任何帮助,我们将不胜感激。

#include <stdio.h>
#define SIZE 3
typedef struct queue{
int val[SIZE]={NULL};
int front;
int rear;
}queue;
void display(struct queue *q);
void enqueue(struct queue *q){
int ins,i=1;
if((q->rear == SIZE-1 && q->front == 0) || (q->rear == q->front-1)){
printf("Queue is full!n");
}
else if (q->front == -1)
{ 
printf("Enqueue data : ");
scanf("%d",&ins);
q->front = q->rear = 0; 
q->val[q->rear] = ins; 
}
else if (q->rear == SIZE-1) 
{ 
printf("Enqueue data : ");
scanf("%d",&ins);
q->rear = 0; 
q->val[q->rear] = ins; 
}   
else
{   
printf("Enqueue data : ");
scanf("%d",&ins);
q->rear++; 
q->val[q->rear] = ins; 
} 
display(q);
};
void dequeue(struct queue *q);
int main(){
queue *q= new queue;
q->front = -1;
q->rear = -1;
char select;
flag1:
printf("n------- Please Select Operations ---------n");
printf("Press e: Enqueuen"); 
printf("Press d: Dequeuen");   
printf("Press x: Exit Programn");                   
printf("------------------------------------------n");
printf("Select Menu : ");
scanf(" %c",&select);
switch(select){
case 'e' : enqueue(q); goto flag1;
case 'd' : dequeue(q); goto flag1;
case 'x' : break;
}

return 0;  
}
void dequeue(struct queue *q){
int deq,hold;
if (q->front == -1) 
{ 
printf("Queue is Empty"); 
} 
else
{
printf("Dequeue data : ");
scanf("%d",&deq);
for(int i=0;i<SIZE;i++){
if(deq==q->val[i]){
if(i==q->front){
q->val[q->front]=NULL;
q->front = i;
q->rear=q->rear+1;
if(q->rear=SIZE-1){
q->rear=0;
}
}
else
q->val[q->front]=NULL;
}   
}
display(q);
}
};
void display(struct queue *q){
int i;
printf("Queue : |");
for (i= 0; i<SIZE; i++){
if(q->val[i]==NULL){
printf(" |");   
}
else
printf("%d|", q->val[i]);
}
};

GIGO
您的代码过于复杂
复杂的代码需要复杂的测试和调试。

尝试以下代码:

void enqueue( struct queue *q, int v) {
int r = (q.rear + 1) % SIZE
if(( r == q.front) {
printf( "Queue is full!n");
} else {
q.val[ q.rear] = v;
q.rear = r;
}
};
int dequeue( struct queue *q) {
if( q.front == q.rear) {
printf( "Queue is Empty");
v = NULL; # or whatever (required as a return value)
} else {
v = q.val[ q.front];
q.front = ( q.front + 1) % SIZE;
}
return v;
};
int main() {
queue *q = new queue;
q->front = q->rear = 0;
...
};

总结:

  • 后部是最年轻元素的索引
  • front是最旧元素的索引
  • %(模运算符(负责索引的覆盖
  • (前==后(表示缓冲区为空
  • ((后+1(%SIZE==前(表示缓冲区已满

请注意,这个简单的算法总是在缓冲区中留下一个未使用的元素。这是为了区分";"满";从";空";。

Java 中的循环队列
public class CircularQueue<T> {
private Object[] arr;
private int front = -1, rear = -1;
public CircularQueue(int initialCapacity) {
this.arr = new Object[initialCapacity];
}
public void add(T val) throws Exception {
if (isEmpty()) {
rear++;
front++;
} else if (isFull()) {
throw new Exception("Queue is full");
}
arr[rear] = val;
rear = (rear + 1) % arr.length;
}
public T delete() throws Exception {
if (isEmpty()) {
throw new Exception("No elements in Queue");
}
T temp = (T) arr[front];
front = (front + 1) % arr.length;
return temp;
}
public boolean isEmpty() {
return (front == -1 && rear == -1);
}
public boolean isFull() {
return (front == rear);
}
@Override
public String toString() {
String ret = "[ ";
int temp = front;
do {
ret += arr[temp] + " ";
temp = (temp + 1) % arr.length;
} while (temp != rear);
ret += "]";
return ret;
}
}

您的代码过于复杂。我想你不太了解循环排队。

这是我的简化代码。你可以去看看,学到一些东西。

#include<stdio.h>
#include<stdlib.h>
typedef struct _node {
int size,front,rear,*q;
} node;
node *pu;
void initialize() {
if(pu!=NULL)
free(pu);
pu = (node *)malloc(sizeof(node));
printf("nEnter the size of the queue :- ");
scanf(" %d",&pu->size);
pu->q = (int *)malloc(sizeof(int) * pu->size +1);
pu->front = pu->rear = 0;
}
int isempty() {
return (pu->front == pu->rear);
}
int isfull() {
return ((pu->rear + 1) % pu->size == pu->front);
}
void enqueue(int x) {
if(isfull())
return;
else {
pu->q[pu->rear=(pu->rear +1) % pu->size] = x;
}
}
int dequeue() {
if(isempty())
return '$';
else {
return pu->q[ pu->front = (pu->front + 1) % pu->size];
}
}
void display() {
if(isempty())
return;
else {
for( int i = pu->front + 1; i != (pu->rear +1)%pu->size ; i = ( i +1) % pu->size)
printf("n %d",pu->q[i]);
}
}
int main() {
// do something in here with the functions.
return 0;
}

最新更新