/*************************************************************************
*
* 队列操作需要提供的数据结构:
* 1.数据的类型
* 2.队列节点的结构封装,下一个节点的指针+数据
* 3.队列结构体:首、尾节点,队列深度*
* 队列操作需要提供的接口:
* 1.队列初始化:首尾节点置空
* 2.队列销毁:释放队列中的每一个节点
* 3.入队操作:为队列添加节点,需要判断队列是否非空
* 4.出队操作:从队列头部输出节点
* 5.非空判断:判断队列是否为空,尾结点如果为空,则队列为空
* 6.队列大小返回:返回队列的size
*************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define ALLOC_SIZE 512
typedef int KEY_TYPE;
typedef struct _queue_node {
struct _queue_node *next;
KEY_TYPE key;
} queue_node;
typedef struct _queue {
queue_node *front;//首节点
queue_node *rear;//尾节点
int queue_size;
} queue;
void init_queue(queue *q) {
q->front = q->rear = NULL;
q->queue_size = 0;
}
void destory_queue(queue *q) {
queue_node *iter;
queue_node *next;
iter = q->front;
while (iter) {
next = iter->next;
free(iter);//释放iter后,iter指向的空间在短时间可能是可以使用的,但是不能保证数据的安全性,所以下一行不能写为iter=iter->next;
iter = next;
}
}
void push_queue(queue *q, KEY_TYPE key) {
assert(q);
if (q->rear) {
queue_node *node = (queue_node*)calloc(1, sizeof(queue_node));
assert(node);
node->key = key;
node->next = NULL;
q->rear->next = node;//q->rear为node之前的节点
q->rear = node;
} else {
queue_node *node = (queue_node*)calloc(1, sizeof(queue_node));
assert(node);
node->key = key;
node->next = NULL;
q->front = q->rear = node;
}
q->queue_size ++;
}
void pop_queue(queue *q, KEY_TYPE *key) {
assert(q);
assert(q->front != NULL);
if (q->front == q->rear) {
*key = q->front->key;
free(q->front);
q->front = q->rear = NULL;
} else {
queue_node *node = q->front->next;//因为要释放头节点,但是只有头结点才知道下一个节点,所以要将头结点的下一个节点的地址保存起来
*key = q->front->key;
free(q->front);
q->front = node;
}
q->queue_size --;
}
//非空判断
int empty_queue(queue *q) {
assert(q);
return q->rear == NULL ? 0 : 1;
}
int size_queue(queue *q) {
return q->queue_size;
}
int main() {
queue q;
init_queue(&q);
int i = 0;
for (i = 0;i < 1000;i ++) {
push_queue(&q, i+1);
}
while (empty_queue(&q)) {
KEY_TYPE key;
pop_queue(&q, &key);
printf("%4d", key);
}
destory_queue(&q);
}
数据结构与算法-队列
最新推荐文章于 2024-07-24 12:42:40 发布