队列的简单操作
2010-03-31 14:45
393 查看
队列,是先进先出(FIFO)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
queue.h
Code:
#ifndef _QUEUE_H
#define _QUEUE_H
#define Type int
#ifdef _MSC_VER
#define bool int
#define true 1
#define false 0
#else
#include <stdbool.h>
#include <stdint.h>
#endif
struct queue;
struct queue *init_queue();
void destory_queue(struct queue *q);
void clear_queue(struct queue *q);
bool en_queue(struct queue *q, Type data);
bool de_queue(struct queue *q);
Type gethead(struct queue *q);
bool queue_empty(struct queue *q);
int queue_size(struct queue *q);
void print_queue(struct queue *q);
#endif
queue.c
Code:
#include "queue.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct queue_node {
Type data;
struct queue_node *next;
};
struct queue {
struct queue_node *front;
struct queue_node *rear;
};
struct queue *init_queue()
{
struct queue *q = (struct queue *)malloc(sizeof(struct queue));
if (q == NULL)
return NULL;
q->front = q->rear = (struct queue_node *)malloc(sizeof(struct queue_node));
if (q->front == NULL)
return NULL;
q->front->next = NULL;
return q;
}
void destory_queue(struct queue *q)
{
assert(q != NULL);
while (q->front != NULL) {/*also free head node*/
q->rear = q->front->next;
free (q->front);
q->front = q->rear;
}
free(q);
q = NULL;
}
void clear_queue(struct queue *q)
{
assert(q != NULL);
struct queue_node *h, *p;
h = q->front->next;
q->rear = q->front;
q->front->next = NULL;
while (h != NULL) {
p = h;
h = h->next;
free(p);
}
}
bool en_queue(struct queue *q, Type data)
{
assert(q != NULL);
struct queue_node *p = (struct queue_node *)malloc(sizeof(struct queue_node));
if (p == NULL)
return false;
p->data = data;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return true;
}
bool de_queue(struct queue *q)
{
assert(q != NULL);
if (q->front == q->rear)
return false;
struct queue_node *p = q->front->next;
q->front->next = p->next;
if (q->rear == p)
q->rear = q->front;/*null*/
free(p);
return true;
}
bool queue_empty(struct queue *q)
{
assert(q != NULL);
if (q->front->next == NULL)
return true;
else
return false;
}
int queue_size(struct queue *q)
{
struct queue_node *p = q->front;
int i = 0;
while (p != q->rear) {
i++;
p = p->next;
}
return i;
}
Type gethead(struct queue *q)
{
assert(q != NULL);
if (q->front != q->rear)
return q->front->next->data;
else
return 0;
}
void print_queue(struct queue *q)
{
assert(q != NULL);
struct queue_node *p = q->front;
while (p->next != NULL) {
p = p->next;
printf("%d ", p->data);
}
}
主函数
Code:
#include <stdio.h>
#include "queue.h"
int main()
{
struct queue *q = init_queue();
en_queue(q, 2);
en_queue(q, 1);
en_queue(q, 3);
en_queue(q, 5);
de_queue(q);
print_queue(q);
destory_queue(q);
return 0;
}
queue.h
Code:
#ifndef _QUEUE_H
#define _QUEUE_H
#define Type int
#ifdef _MSC_VER
#define bool int
#define true 1
#define false 0
#else
#include <stdbool.h>
#include <stdint.h>
#endif
struct queue;
struct queue *init_queue();
void destory_queue(struct queue *q);
void clear_queue(struct queue *q);
bool en_queue(struct queue *q, Type data);
bool de_queue(struct queue *q);
Type gethead(struct queue *q);
bool queue_empty(struct queue *q);
int queue_size(struct queue *q);
void print_queue(struct queue *q);
#endif
queue.c
Code:
#include "queue.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct queue_node {
Type data;
struct queue_node *next;
};
struct queue {
struct queue_node *front;
struct queue_node *rear;
};
struct queue *init_queue()
{
struct queue *q = (struct queue *)malloc(sizeof(struct queue));
if (q == NULL)
return NULL;
q->front = q->rear = (struct queue_node *)malloc(sizeof(struct queue_node));
if (q->front == NULL)
return NULL;
q->front->next = NULL;
return q;
}
void destory_queue(struct queue *q)
{
assert(q != NULL);
while (q->front != NULL) {/*also free head node*/
q->rear = q->front->next;
free (q->front);
q->front = q->rear;
}
free(q);
q = NULL;
}
void clear_queue(struct queue *q)
{
assert(q != NULL);
struct queue_node *h, *p;
h = q->front->next;
q->rear = q->front;
q->front->next = NULL;
while (h != NULL) {
p = h;
h = h->next;
free(p);
}
}
bool en_queue(struct queue *q, Type data)
{
assert(q != NULL);
struct queue_node *p = (struct queue_node *)malloc(sizeof(struct queue_node));
if (p == NULL)
return false;
p->data = data;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return true;
}
bool de_queue(struct queue *q)
{
assert(q != NULL);
if (q->front == q->rear)
return false;
struct queue_node *p = q->front->next;
q->front->next = p->next;
if (q->rear == p)
q->rear = q->front;/*null*/
free(p);
return true;
}
bool queue_empty(struct queue *q)
{
assert(q != NULL);
if (q->front->next == NULL)
return true;
else
return false;
}
int queue_size(struct queue *q)
{
struct queue_node *p = q->front;
int i = 0;
while (p != q->rear) {
i++;
p = p->next;
}
return i;
}
Type gethead(struct queue *q)
{
assert(q != NULL);
if (q->front != q->rear)
return q->front->next->data;
else
return 0;
}
void print_queue(struct queue *q)
{
assert(q != NULL);
struct queue_node *p = q->front;
while (p->next != NULL) {
p = p->next;
printf("%d ", p->data);
}
}
主函数
Code:
#include <stdio.h>
#include "queue.h"
int main()
{
struct queue *q = init_queue();
en_queue(q, 2);
en_queue(q, 1);
en_queue(q, 3);
en_queue(q, 5);
de_queue(q);
print_queue(q);
destory_queue(q);
return 0;
}
相关文章推荐
- 【数据结构+Java】Java实现简单队列、循环队列操作
- 实现简单的队列操作函数
- 多线程 队列的简单操作
- 4_rabbitmq java操作简单队列
- Redis队列——PHP操作简单示例
- Java操作RabbitMQ简单队列
- RabbitMQ-使用Java操作简单队列 simple queues
- 队列的简单的操作
- 链队列的简单操作(入队,出队,输出队元素等)
- Redis队列——PHP操作简单示例
- Redis队列——PHP操作简单示例
- 关于队列的简单操作
- 数据结构中队列的简单操作(C语言)
- 统计工龄 模拟EXCEL排序 银行排队问题之单队列多窗口问题 银行业务队列简单模拟 堆栈操作合法性 两个有序序列的中位数
- [队列]简单的队列操作
- 简单顺序队列操作(不考虑循环)
- PHP操作 Redis队列简单示例
- 栈和 队列 和 优先队列的 简单操作(初学者)
- 队列的简单操作
- STL优先队列的简单操作