随笔 - 192,  文章 - 0,  评论 - 2,  阅读 - 25万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

循环队列的数组实现

queue.h

复制代码
#ifndef _QUEUE_H_
#define _QUEUE_H_

#define SIZE 10

typedef int data_t;

typedef struct head{
        data_t data[SIZE];
        int front;
        int rear;
}queue_t;

queue_t *queue_creat();

int queue_is_empty(queue_t *head);
int queue_is_full(queue_t *head);
void queue_clear(queue_t *head);

int queue_en(queue_t *head,data_t data);
data_t queue_de(queue_t *head);

void queue_show(queue_t *head);
void queue_destory(queue_t **head);

#endif //_QUEUE_H_
复制代码

queue.c

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>

#include "queue.h"

queue_t *queue_create()
{
    queue_t *head = (queue_t *)malloc(sizeof(queue_t));
    bzero(head, sizeof(queue_t));

    head->front = 0;
    head->rear = 0;

    return head;
}

int queue_is_empty(queue_t *head)
{
    return head->front == head->rear;
}

int queue_is_full(queue_t *head)
{
    return head->rear - head->front == SIZE;
}

void queue_clear(queue_t *head)
{
    head->rear = head->front;
}

int queue_en(queue_t *head, data_t data)
{
    if (queue_is_full(head)) {
        printf("queue is full!\n");
        return -1;
    }

    head->data[head->rear % SIZE] = data;
    head->rear++;

    return 0;
}

data_t queue_de(queue_t *head)
{
    if (queue_is_empty(head)) {
        printf("queue is empty!\n");
        return -1;
    }

    data_t data = head->data[head->front % SIZE];
    head->front++;

    return data;
}

void queue_show(queue_t *head)
{
    int i;
    for (i = head->front; i < head->rear; i++) {
        printf("%d, ", head->data[i % SIZE]);
    }
    printf("\n");
}

void queue_destory(queue_t **head)
{
    free(*head);
    *head = NULL;
}
复制代码

main.c

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>

#include "queue.h"

int main()
{
    queue_t *head = queue_create();

    int n = 10;
    while (n--) {
        queue_en(head, n+1);
    }
    queue_show(head);

    int i;
    for (i = 0; i < 5; i++) {
        printf("%d, ", queue_de(head));
    }
    printf("\n");
    queue_show(head);

    for (i = 20; i < 25; i++) {
        queue_en(head, i);
    }
    queue_show(head);

    queue_destory(&head);

    return 0;
}
复制代码

 队列的链表实现

queue.h

复制代码
#ifndef _QUEUE_
#define _QUEUE_

typedef int data_t;

typedef struct node{
    data_t data;
    struct node *next;
}NODE;

typedef struct{
    struct node *front;
    struct node *rear;
}queue_t;

queue_t *queue_create();

int queue_is_empty(queue_t *head);
int queue_is_full(queue_t *head);
void queue_clear(queue_t *head);

int queue_en(queue_t *head, data_t data);
data_t queue_de(queue_t *head);

void queue_show(queue_t *head);
void queue_destory(queue_t **head);

#endif
复制代码

 queue.c

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>

#include "queue.h"

queue_t *queue_create()
{
    queue_t *head = (queue_t *)malloc(sizeof(queue_t));
    bzero(head, sizeof(queue_t));

    head->front = (NODE *)malloc(sizeof(NODE));
    bzero(head->front, sizeof(NODE));

    head->front->data = -1;
    head->front->next = NULL;

    head->rear = head->front;

    return head;
}

int queue_is_empty(queue_t *head)
{
    //return head->front->next == NULL;
    return head->front == head->rear;
}

int queue_is_full(queue_t *head)
{
    return 0;
}

void queue_clear(queue_t *head)
{
    NODE *p = head->front->next;
    NODE *q = p->next;

    head->front->next = NULL;

    while (p != NULL) {
        q = p->next;

        free(p);

        p = q;
    }

    head->rear = head->front;
}

int queue_en(queue_t *head, data_t data)
{
    NODE *p = (NODE *)malloc(sizeof(NODE));
    bzero(p, sizeof(NODE));
    p->data = data;
    p->next = NULL;

    head->rear->next = p;

    head->rear = p;

    return 0;
}

data_t queue_de(queue_t *head)
{
    if (queue_is_empty(head)) {
        printf("queue is empty!\n");
        return -1;
    }

    NODE *p = head->front;
    NODE *q = p->next;
    data_t data = q->data;

    p->next = q->next;
    free(q);
    q = NULL;

    if (p->next == NULL) {
        head->rear = head->front;
    }

    return data;
}

void queue_show(queue_t *head)
{
    NODE *p = head->front->next;

    while (NULL != p) {
        printf("%d, ", p->data);
        p = p->next;
    }
    printf("\n");
}

void queue_destory(queue_t **head)
{
    queue_clear(*head);

    free(*head);
    *head = NULL;
}
复制代码

main.c

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>

#include "queue.h"

int main()
{
    queue_t *head = queue_create();

    int n = 10;
    while (n--) {
        queue_en(head, n+1);
    }
    queue_show(head);

    int i;
    for (i = 0; i < 5; i++) {
        printf("%d, ", queue_de(head));
    }
    printf("\n");
    queue_show(head);

    for (i = 20; i < 25; i++) {
        queue_en(head, i);
    }
    queue_show(head);

    queue_destory(&head);

    return 0;
}
复制代码

 

posted on   Malphite  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示