/*
    * File name: a15f3.c
    ------------------
*/

#include <stdio.h>

#define QueueLimit 11

typedef int QueueElementType;
                                  
typedef struct {
    int Front, Rear;
    int Count;
    QueueElementType Element[QueueLimit];
} QueueType;

typedef enum { FALSE, TRUE } boolean;

void CreateQ(QueueType* Queue);
boolean EmptyQ(QueueType Queue);
boolean FullQ(QueueType Queue);
void RemoveQ(QueueType* Queue, QueueElementType* Item);
void AddQ(QueueType* Queue, QueueElementType Item);
void TraverseQ(QueueType Queue);

int main() {
    //Variable declaration
    QueueType Q;
    QueueElementType Item;
    int i, num;

    CreateQ(&Q);
    for (i = 3; i <= 30; i += 3)
        AddQ(&Q, i);

    printf("(a)\n");
    TraverseQ(Q);

    printf("(b)\n");
    do {
        printf("Give a number:");
        scanf("%d", &num);
        if ((num % 3) != 0)
            printf("Give a multiple of 3\n");
    } while ((num % 3) != 0);
    AddQ(&Q, num);
    TraverseQ(Q);

    printf("(c)\n");
    RemoveQ(&Q, &Item);
    TraverseQ(Q);
    printf("Removed item=%d\n", Item);

    printf("(d)\n");
    for (i = 0; i < 2; i++) {
        do {
            printf("Give a number:");
            scanf("%d", &num);
            if ((num % 3) != 0)
                printf("Give a multiple of 3\n");
        } while ((num % 3) != 0);
        AddQ(&Q, num);
        TraverseQ(Q);
    }

    printf("(e)\n");
    while(!EmptyQ(Q)) {
        RemoveQ(&Q, &Item);
        TraverseQ(Q);
        printf("Removed item=%d\n", Item);
    }

    return 0;
}
void CreateQ(QueueType* Queue) {
    Queue->Front = 0;
    Queue->Rear = 0;
    Queue->Count = 0;
}

boolean EmptyQ(QueueType Queue) {
    return (Queue.Count == 0);
}

boolean FullQ(QueueType Queue) {
    return (Queue.Count == (QueueLimit - 1));
}

void RemoveQ(QueueType* Queue, QueueElementType* Item) {
    if (!EmptyQ(*Queue))
    {
        *Item = Queue->Element[Queue->Front];
        Queue->Front = (Queue->Front + 1) % (QueueLimit - 1);
        Queue->Count--;
    }
    else
        printf("Empty Queue\n");
}

void AddQ(QueueType* Queue, QueueElementType Item) {
    if (!FullQ(*Queue))
    {
        Queue->Element[Queue->Rear] = Item;
        Queue->Rear = (Queue->Rear + 1) % (QueueLimit - 1);
        Queue->Count++;
    }
    else
        printf("Full Queue\n");
}

void TraverseQ(QueueType Queue) {
    int current;

    printf("Queue: ");

    if (!EmptyQ(Queue)) {
        current = Queue.Front;
        while (current != Queue.Count) {
            printf("%d ", Queue.Element[current]);
            current = (current + 1) % QueueLimit;
        }
        printf("\n");
        printf("Front=%d Rear=%d Count=%d\n", Queue.Front, Queue.Rear, Queue.Count);
    }
    else printf("Empty Queue\n");
}

我有个问题.我想在队列中添加一些3的倍数,打印它们,然后逐个删除元素.尽管元素被正确地存储在它们在队列中的位置,但队列的遍历存在问题.如果您注意到队列的最后一个元素,当3被删除时,它不会显示在所有删除的屏幕上.有人能帮帮我吗?

预期结果如下:

enter image description here. enter image description here.

推荐答案

一些问题和 comments :

  • 用于迭代值的循环条件不正确.要么应该有一个从0开始并一直持续到Q->Count的计数器,要么应该将currentQ->Rear进行比较.

  • 因为队列的大小是QueueLimit,所以模运算应该是模QueueLimit,而不是QueueLimit-1.类似地,队列只有在Queue.Count == QueueLimit时才是满的,而不是Queue.Count == QueueLimit - 1.

  • 因为Q->Rear可以从Q->FrontQ->Count派生,所以我实际上不会存储函数依赖属性.

  • 您可以让RemoveQAddQ返回一个指示操作是否成功的布尔值.

typedef struct {
    int Front; // No rear
    int Count;
    QueueElementType Element[QueueLimit];
} QueueType;

void CreateQ(QueueType* Queue) {
    Queue->Front = 0;
    Queue->Count = 0;
}

boolean EmptyQ(QueueType Queue) {
    return Queue.Count == 0;
}

boolean FullQ(QueueType Queue) {
    return Queue.Count == QueueLimit; // corrected
}

boolean RemoveQ(QueueType* Queue, QueueElementType* Item) {
    if (!EmptyQ(*Queue)) {
        *Item = Queue->Element[Queue->Front];
        Queue->Front = (Queue->Front + 1) % QueueLimit; // corrected
        Queue->Count--;
        return 1;
    }
    printf("Nothing to remove\n");
    return 0;
}

boolean AddQ(QueueType* Queue, QueueElementType Item) {
    if (!FullQ(*Queue)) {
        Queue->Element[(Queue->Front + Queue->Count) % QueueLimit] = Item;
        Queue->Count++;
        return 1;
    }
    printf("Full Queue\n");
    return 0;
}

void TraverseQ(QueueType Queue) {
    printf("Queue (Front=%d Count=%d):\n", Queue.Front, Queue.Count);
    for (int i = 0; i < Queue.Count; i++) { // Number of iterations must be Count
        printf("%d ", Queue.Element[(Queue.Front + i) % QueueLimit]); 
    }
    printf(EmptyQ(Queue) ? "Empty Queue\n" : "\n");
}

C++相关问答推荐

有效地计算由一组点构成的等边三角形和等腰三角形的数量

Ebpf内核代码:permission denied:invalid access to map value

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

当execvp在C函数中失败时杀死子进程

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

用C++实现余弦函数

从C文件中删除注释

使用nmake for程序比Hello World稍微复杂一些

不确定如何处理此编译错误

不带Malloc的链表

当用C打印过多的';\n';时输出不正确

C编译和运行

C中的char**v*char[]

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

在C中打印指针本身

将指针的地址加载到寄存器内联拇指组件中

Struct 内的数组赋值

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

如何在 C 中的 Postgres 函数的表中 for 循环

当 a 是代码块时使用逗号运算符 (a, b)