0

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

#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: Enqueue\n"); 
    printf("Press d: Dequeue\n");   
    printf("Press x: Exit Program\n");                   
    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]);
    }
};
4

2 回答 2

2

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 是最旧元素的索引
  • % (模数运算符)负责索引重叠。
  • (前==后)表示空缓冲区
  • ((rear +1) % SIZE == front) 表示缓冲区已满。

请注意,这个简单的算法总是在缓冲区中留下一个未使用的元素。这是区分“满”和“空”所必需的。

于 2020-12-14T21:58:24.063 回答
-1

您的代码过于复杂且愚蠢。我认为您不太了解循环队列。

这是我的简化代码。你可以看看它并学习一些东西。

#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;
}
于 2020-12-14T22:21:34.823 回答