队列(C)

队列(顺序存储)
#define MAXSIZE 50
typedef struct {
    int value[MAXSIZE];
    int rear;
    int front;
}Queue;
Queue *CreateQueue(){
    Queue *queue;
    queue=(Queue *)malloc(sizeof(Queue));
    queue->front=0;
    queue->rear=0;
    return queue;
}
void AddQueue(Queue *queue,int value){
    if((queue->rear+1)%MAXSIZE==queue->front){
        printf("queue is full");
        return;
    }else {
        queue->rear=(queue->rear+1)%MAXSIZE;
        queue->value[queue->rear] = value;
    }
}
int IsEmpty(Queue *queue){
    if(queue->rear==queue->front)return 1;
    else return 0;
}
void OutQueue(Queue* queue,int *value){
    if(IsEmpty(queue)){
        printf("Queue is empty");
        return;
    }else{
        queue->front=(queue->front+1)%MAXSIZE;
        *value=queue->value[queue->front];
    }
}
队列(链式存储)注意
typedef struct Node {
    int value;
    struct Node *next;
} QNode;
typedef struct {
    QNode *rear;
    QNode *front;
} Queue;

void InitQueue(Queue **queue) {
    QNode *p;
    p = (QNode *) malloc(sizeof(QNode));
    p->next = NULL;
    (*queue)->front = p;
    (*queue)->rear = p;
}

void InQueue(Queue *queue, int value) {
    QNode *InElement;
    InElement = (QNode *) malloc(sizeof(QNode));
    InElement->value = value;
    InElement->next = NULL;
    queue->rear->next = InElement;
    queue->rear = InElement;
}

int IsEmpty(Queue *queue) {
    if (queue->rear = queue->front)return 1;
    else return 0;
}

void OutQueue(Queue *queue, int *value) {
    QNode *OutElement;
    if (IsEmpty(queue)) {
        printf("queue is empty");
        return;
    } else {
        OutElement = queue->front->next;
        queue->front->next=OutElement->next;//指针头结点指向下一个结点(pspspspsps)
        *value=OutElement->value;
        free(OutElement);
        if(IsEmpty(queue)){//出队列后如果队列为空则置为空队列
            queue->front=queue->rear;
        }
    }
}
更多关于java的文章请戳这里:(您的留言意见是对我最大的支持)

我的文章列表
Email:sxh13208803520@gmail.com

### C语言实现队列数据结构示例代码 在C语言中,可以通过数组或者链表来实现队列数据结构。以下是基于数组和链表两种方式的队列实现。 #### 基于数组的队列实现 通过静态分配内存的方式创建一个固定大小的队列: ```c #include <stdio.h> #include <stdlib.h> #define MAX_QUEUE_SIZE 100 typedef struct { int data[MAX_QUEUE_SIZE]; int front; int rear; } Queue; void init_queue(Queue *q) { q->front = q->rear = 0; // 初始化队列为空状态 [^3] } int is_empty(Queue *q) { return q->front == q->rear; // 判断队列是否为空 } int is_full(Queue *q) { return (q->rear + 1) % MAX_QUEUE_SIZE == q->front; // 判断队列是否已满 } void enqueue(Queue *q, int value) { if (is_full(q)) { printf("Queue overflow\n"); return; } q->data[q->rear] = value; q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; // 更新尾指针位置 } int dequeue(Queue *q) { if (is_empty(q)) { printf("Queue underflow\n"); exit(EXIT_FAILURE); } int value = q->data[q->front]; q->front = (q->front + 1) % MAX_QUEUE_SIZE; // 更新头指针位置 [^3] return value; } // 测试函数 int main() { Queue queue; init_queue(&queue); enqueue(&queue, 10); enqueue(&queue, 20); enqueue(&queue, 30); printf("%d dequeued from queue\n", dequeue(&queue)); printf("%d dequeued from queue\n", dequeue(&queue)); return 0; } ``` #### 基于链表的队列实现 动态分配节点的方式来构建队列,这种方式可以灵活扩展队列容量而不需要预先定义最大长度。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; typedef struct { Node* front; Node* rear; } LinkQueue; void init_link_queue(LinkQueue *q) { q->front = q->rear = NULL; // 初始化队列为空状态 [^2] } int is_empty_link_queue(LinkQueue *q) { return q->front == NULL; // 判断队列是否为空 } void enqueue_link_queue(LinkQueue *q, int value) { Node* newNode = (Node*)malloc(sizeof(Node)); // 动态分配新节点 if (!newNode) { printf("Memory error\n"); return; } newNode->data = value; newNode->next = NULL; if (is_empty_link_queue(q)) { // 如果队列为空,则前后指针都指向新节点 q->front = q->rear = newNode; } else { // 否则更新尾部指针并连接到新的节点上 q->rear->next = newNode; q->rear = newNode; } } int dequeue_link_queue(LinkQueue *q) { if (is_empty_link_queue(q)) { printf("Queue underflow\n"); exit(EXIT_FAILURE); } Node* temp = q->front; // 获取当前头部节点 int value = temp->data; q->front = q->front->next; // 移动前驱指针至下一个节点 free(temp); // 释放旧头部节点的空间 if (q->front == NULL) { // 若删除后队列变空,则重置尾部指针 q->rear = NULL; } return value; } // 测试函数 int main() { LinkQueue linkQueue; init_link_queue(&linkQueue); enqueue_link_queue(&linkQueue, 10); enqueue_link_queue(&linkQueue, 20); enqueue_link_queue(&linkQueue, 30); printf("%d dequeued from queue\n", dequeue_link_queue(&linkQueue)); printf("%d dequeued from queue\n", dequeue_link_queue(&linkQueue)); return 0; } ``` 以上展示了如何利用数组以及链表分别实现在C语言中的队列操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值