C语言的队列(queue),是指先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作
单链表形式(单链队列使用链表作为基本数据结果,因此不存在伪溢出的问题,队列长度也没有限制。但插入和读取的时间代价会比较高)
#include <stdio.h>
#include<assert.h>
#include<stdio.h>
#include<malloc/malloc.h>
#include <stdlib.h>
#define Queue_TYPE int
typedef struct queue_node
{
Queue_TYPE value;
struct queue_node *next;
}QUEUE_NODE;
typedef struct queue
{
QUEUE_NODE *font;
QUEUE_NODE *rear;
}QUEUE;
int is_full(QUEUE *q);
int is_empty(QUEUE *q);
void enqueue(QUEUE *q,Queue_TYPE value);
void dequeue(QUEUE *q);
QUEUE * creat_queue();
void print(QUEUE *q);
void destroy_queue(QUEUE *q);
int main(int argc, const char * argv[]) {
QUEUE *q = creat_queue();
if (q==NULL) {
printf("malloc failed");
}
// creat_queue(q);
enqueue(q,10); enqueue(q,9); enqueue(q,8); enqueue(q,7); enqueue(q,6); enqueue(q,5);
enqueue(q,4); enqueue(q,3); enqueue(q,2); enqueue(q,1); enqueue(q,0);
printf("enqueue压入数值后:\n");
print(q);
destroy_queue(q);
return 0;
}
QUEUE * creat_queue()
{
QUEUE *q = (QUEUE *)malloc(sizeof(QUEUE));
if (q==NULL) {
printf("malloc failed");
}
q->font = (QUEUE_NODE *)malloc(sizeof(QUEUE_NODE));
if (q->font == NULL) {
printf("malloc failed");
}
q->rear = q->font;
return q;
}
void enqueue(QUEUE *q,Queue_TYPE value)
{
QUEUE_NODE *newNode = (QUEUE_NODE *)malloc(sizeof(QUEUE_NODE));
if (newNode == NULL) {
printf("malloc failed");
}
newNode->next = NULL;
newNode->value = value;
q->rear->next = newNode;
q->rear = newNode;
}
int is_empty(QUEUE *q)
{
return q->rear == q->font;
}
void print(QUEUE *q)
{
if (is_empty(q)) {
printf("empty");
}
QUEUE_NODE *node = q->font->next;
while (node != NULL) {
printf("%d",node->value);
node = node->next;
}
printf("\n");
}
void dequeue(QUEUE *q)
{
if (is_empty(q)) {
printf("empty");
}
QUEUE_NODE *font = q->font;
q->font = q->font->next;
free(font);
}
void destroy_queue(QUEUE *q)
{
while (!is_empty(q)) {
dequeue(q);
}
}